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 Nørre Djurs Hallen - Mikael Bertelsen <mi...@tuxpower.dk> on 2013/11/04 11:19:00 UTC

Exception when running a programatically configured RemoteAppender

Hi all,

I'm trying to programatically configure an RemoteAppender on the client
side, but I end up in an exception (see below). Apparently the callback
is not set, and looking through the source code for log4net I cannot
find any obvious reason for the callback to not be set.

I have the setup running by configuring the RemoteAppender from a config
file, but I need to set the logging server based on information given at
runtime.
The code I used to try and achieve my goal is inserted below.

Thank you for any help or hints.

/Mikael

===== Exception begin =====
log4net:ERROR [RemotingAppender] ErrorCode: GenericFailure. Failed in
SendBufferCallback
System.Runtime.Remoting.RemotingException: Server encountered an
internal error. For more information, turn off customErrors in the
server's .config file.

Server stack trace:

Exception rethrown at [0]:
    at
System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage
reqMsg, IMessage retMsg)
    at
System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData&
msgData, Int32 type)
    at
log4net.Appender.RemotingAppender.IRemoteLoggingSink.LogEvents(LoggingEvent[]
events)
    at log4net.Appender.RemotingAppender.SendBufferCallback(Object state)
===== Exception end =====

===== Server.vb begin =====
'Make log4net look for logging.config
<Assembly: log4net.Config.XmlConfigurator(ConfigFile:="logging.config",
Watch:=True)>

Namespace My
   Partial Friend Class MyApplication
     Private Sub MyApplication_Startup(ByVal sender As Object, ByVal e
As Microsoft.VisualBasic.ApplicationServices.StartupEventArgs) Handles
Me.Startup
       'Start the logging service
       StartLogging()
     End Sub

Private Sub StartLogging()
       Trace.WriteLine("Starting logging server...", "Info")

       Try
         'Configure remoting. This loads the TCP channel as specified in
the .config file.
System.Runtime.Remoting.RemotingConfiguration.Configure("logging.config", False)
'Using logging.config as configuration file

         'Publish the remote logging server. This is done using the
log4net plugin.
         log4net.LogManager.GetRepository().PluginMap.Add(New
log4net.Plugin.RemoteLoggingServerPlugin("LoggingSink"))
       Catch ex As Exception
         Trace.WriteLine("Exception: " + ex.Message, "Error")
       End Try
     End Sub
   End Class
===== Server.vb end =====

===== logging.config begin (server) =====
<?xml version="1.0"?>
<configuration>
   <configSections>
     <section name="log4net"
type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
   </configSections>

   <appSettings>
     <add key="log4net.Config" value="logging.config" />
     <add key="log4net.Config.Watch" value="True" />
     <!--<add key="log4net.Internal.Debug" value="true"/>-->
   </appSettings>

   <log4net>
     <appender name="FileAppender"
type="log4net.Appender.RollingFileAppender">
       <file value="C:\logs\TunstallLogs.txt" />
       <appendToFile value="true" />
       <rollingStyle value="Size"/>
       <maxSizeRollBackups value="20"/>
       <maximumFileSize value="100MB"/>
       <countDirection value="-1"/>
       <layout type="log4net.Layout.PatternLayout">
         <conversionPattern value="%date [%thread] %-5level %logger
(%property{log4net:HostName}) [%ndc] - %message%newline" />
       </layout>
     </appender>

     <root>
       <level value="VERBOSE" />
       <appender-ref ref="FileAppender" />
     </root>
   </log4net>
   <system.runtime.remoting>
     <application name="Log4netRemotingServer">
       <!-- We need to define the remoting channels on which we will publish
            the remote logging sink. -->
       <channels>
         <channel displayName="Server Channel" ref="tcp server"
port="8085"/>
       </channels>
     </application>
   </system.runtime.remoting>
</configuration>
===== logging.config end (server) =====


===== Client.vb begin =====
Namespace My
   Partial Friend Class MyApplication
     Public Shared Tlog As log4net.ILog

     Private Sub ConfigureLog()
       Dim root As log4net.Repository.Hierarchy.Logger
       root = CType(LogManager.GetRepository(), Hierarchy).Root
       root.AddAppender(FileAppender())
       root.AddAppender(RemoteAppender())
       root.Repository.Configured = True
     End Sub

     Private Function FileAppender() As IAppender
       Dim localFileAppender As log4net.Appender.FileAppender = New
FileAppender()
       localFileAppender.Name = "file"
       localFileAppender.AppendToFile = True
       localFileAppender.File = "C:\logs\filelog.txt"
       localFileAppender.Layout = New
log4net.Layout.PatternLayout("%date{dd-MM-yyyy HH:mm:ss,fff} %5level
[%2thread] %message (%logger{1}:%line)%n")
       localFileAppender.Threshold = log4net.Core.Level.All
       localFileAppender.ActivateOptions()

       Return localFileAppender
     End Function

     Private Function RemoteAppender() As IAppender
       Dim localRemoteAppender As log4net.Appender.RemotingAppender =
New RemotingAppender()
       localRemoteAppender.BufferSize = 95
       localRemoteAppender.Layout = New
log4net.Layout.PatternLayout("%date{dd-MM-yyyy HH:mm:ss,fff} %5level
[%2thread] %message (%logger{1}:%line)%n")
       localRemoteAppender.Fix = log4net.Core.FixFlags.Domain
       localRemoteAppender.Lossy = False
       localRemoteAppender.Name = "Remote"
       localRemoteAppender.Threshold = log4net.Core.Level.All
       localRemoteAppender.OnlyFixPartialEventData = True
       'localRemoteAppender.Sink = "tcp://" +
My.Settings.CT_PrimaryServerIP + ":8085/LoggingSink"
       localRemoteAppender.Sink = "tcp://192.168.10.11:8085/LoggingSink"
       localRemoteAppender.ActivateOptions()

       Return localRemoteAppender
     End Function

     Private Sub MyApplication_Startup(ByVal sender As Object, ByVal e
As Microsoft.VisualBasic.ApplicationServices.StartupEventArgs) Handles
Me.Startup

       ConfigureLog()
       Tlog =
log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.ToString
+ " [Default instance]")

       Tlog.Info("Some info...")

       'Some more work done here.....
     End Sub

===== Client.vb end =====