You are viewing a plain text version of this content. The canonical link for it is here.
Posted to log4net-user@logging.apache.org by "Thorne-Smith, Benjamin" <bt...@zygo.com> on 2007/04/19 19:38:54 UTC

ArgumentNullException on log4Net.LogManager.Shutdown()

Hello, I am new to log4net and am looking for some advice on how to
avoid an exception.

 

I am trying to get the logging for several apps to the same log file
through your remoting appender. Everything works wonderfully until I
move to shutdown the LogManager. 

 

I initialize my LogManager as follows:

void Initialize()

{

System.Configuration.Configuration config =
System.Configuration.ConfigurationManager.OpenExeConfiguration(System.Co
nfiguration.ConfigurationUserLevel.None);

if (config.HasFile)

{

log4net.Config.XmlConfigurator.Configure(new
System.IO.FileInfo(config.FilePath));

}

RemotingConfiguration.Configure(AppDomain.CurrentDomain.SetupInformation
.ConfigurationFile, false);

log4net.LogManager.GetRepository().PluginMap.Add(new
log4net.Plugin.RemoteLoggingServerPlugin("LoggingSink"));

}

 

The exception message is as follows:

System.ArgumentNullException was unhandled

         Message="Value cannot be null.\r\nParameter name: obj"

         Source="mscorlib"

         ParamName="obj"

         StackTrace:

              at
System.Runtime.Remoting.RemotingServices.Disconnect(MarshalByRefObject
obj, Boolean bResetURI)

              at
System.Runtime.Remoting.RemotingServices.Disconnect(MarshalByRefObject
obj)

              at log4net.Plugin.RemoteLoggingServerPlugin.Shutdown()

              at log4net.Repository.LoggerRepositorySkeleton.Shutdown()

              at log4net.Repository.Hierarchy.Hierarchy.Shutdown()

              at log4net.Core.LoggerManager.Shutdown()

              at log4net.LogManager.Shutdown()

 

I originally thought that I could elminate the error by shutting down
the repoistory, clearing the plugins and then calling the master
shutdown method(below). I had guessed that since there would be no
plugins in the plugin map so that
log4net.Plugin.RemoteLoggingServerPlugin.Shutdown() would not get
called. However the same exceptin still appears.

void Shutdown()
{

log4net.LogManager.ShutdownRepository();

log4net.LogManager.GetRepository().PluginMap.AllPlugins.Clear();

log4net.LogManager.Shutdown();

}

 

I poked my head into the source code and found I could quiet the
exception by changing the RemoteLoggingServerPlugin.Shutdown method like
this (below, changes in bold). However I would prefer to know what I
have misused to cause this exception rather than just ignoring it.

override public void Shutdown()

{

// Stops the sink from receiving messages

if (m_sink != null)

{

    RemotingServices.Disconnect(m_sink);

}

      m_sink = null;

      base.Shutdown();

}

 

I have included my example source code below and would greatly
appreciate any help anyone could give me. Thanks for your time,

 

Ben Smith

 

//The master application

[STAThread]

static void Main()

{

Application.EnableVisualStyles();

      Application.SetCompatibleTextRenderingDefault(false);

      ManagerWrapper.Initialize(); //code for this included above

      ProcessController.Instance.StartAllProcesses(); //launches the
service apps that will use the remote appender

      Application.Run(new Form1());

      ProcessController.Instance.KillAllProcessesSpawnedHere(); //kills
the service apps that used the remote appender

      ManagerWrapper.Shutdown(); //code for this included above

}

 

//code for the main app

public partial class Form1 : Form

{

private static readonly ILog log =
ManagerWrapper.GetLogger(typeof(Form1));

      public Form1()

      {

            InitializeComponent();

      }

 

      private void btnLog_Click(object sender, EventArgs e)

      {

            log.Info("App logging");

      }

}

 

//The app.config file for the master app

<?xml version="1.0" encoding="utf-8" ?>

<configuration>

  <configSections>

    <section name="log4net"
type="log4net.Config.Log4NetConfigurationSectionHandler"/>

  </configSections>

  <log4net>

    <appender name="BufferingMemoryAppender"
type="log4net.Ext.Zygo.Appender.BufferingMemoryAppender,
log4net.Ext.Zygo">

      <layout type="log4net.Layout.PatternLayout">

        <conversionPattern value="%d [%t] %-5p %c %x - %m%n"/>

      </layout>

      <maxEventCount value="5000"/>

    </appender>

    <appender name="SystemLogAppender"
type="log4net.Ext.Zygo.Appender.RollingFileAppender, log4net.Ext.Zygo">

      <level value="DEBUG"/>

      <file value="log\\system.log"/>

      <appendToFile value="false"/>

      <rollingStyle value="Composite"/>

      <maximumFileSize value="5MB"/>

      <maxSizeRollBackups value="30"/>

      <staticLogFileName value="true"/>

      <layout type="log4net.Layout.PatternLayout">

        <conversionPattern value="%d [%t] %-5p [%c] - %m%n"/>

      </layout>

    </appender>

    <root>

      <level value="ALL"/>

      <appender-ref ref="BufferingMemoryAppender"/>

      <appender-ref ref="SystemLogAppender"/>

    </root>

  </log4net>

  <system.runtime.remoting>

    <application name="MetroProXP">

      <channels>

        <channel displayName="Server Channel" ref="tcp server"
port="8085" />

      </channels>

    </application>

  </system.runtime.remoting>

</configuration>

 

//An example of a service application

/// <summary>

/// The main entry point for the application.

/// </summary>

[STAThread]

static void Main()

{

      Application.EnableVisualStyles();

      Application.SetCompatibleTextRenderingDefault(false);

      ManagerWrapper.Initialize(); //code for this included above

      Application.Run(new Form1());

      ManagerWrapper.Shutdown(); //code for this included above

}

 

//code for a service app

public partial class Form1 : Form

{

private static readonly ILog log =
ManagerWrapper.GetLogger(typeof(Form1));

      public Form1()

      {

            InitializeComponent();

      }

 

      private void btnLog_Click(object sender, EventArgs e)

      {

            log.Info("Service App logging");

      }

}

 

//The app.config file for the service app

<?xml version="1.0" encoding="utf-8" ?>

<configuration>

  <configSections>

    <section name="log4net"
type="log4net.Config.Log4NetConfigurationSectionHandler"/>

  </configSections>

  <log4net debug="false">

    <appender name="RemotingAppender"
type="log4net.Appender.RemotingAppender" >

      <sink value="tcp://localhost:8085/LoggingSink" />

      <lossy value="false" />

      <bufferSize value="1" />

      <onlyFixPartialEventData value="true" />

      <layout type="log4net.Layout.PatternLayout">

        <conversionPattern value="%d [%t] %-5p %c %x - %m%n"/>

      </layout>

    </appender>

    <root>

      <level value="ALL" />

      <appender-ref ref="RemotingAppender" />

    </root>

  </log4net>

  <appSettings>

    <add key="log4net.Internal.Debug" value="true"/>

  </appSettings>

</configuration>

 

The ManagerWrapper class is just a wrapper around the log4net.LogManager
with some additional functionality.