6

server code

public class RemoteSink : MarshalByRefObject, RemotingAppender.IRemoteLoggingSink
{
    public void LogEvents(LoggingEvent[] events)
    {
        foreach (var loggingEvent in events)
        {
            LoggingEventData logData = loggingEvent.GetLoggingEventData();
            logData.Message = "[" + logData.Domain + "] " + logData.Message;
            log4net.LogManager.GetRepository().Log(new LoggingEvent(logData));
        }
    }
}

private static void SetRemoteLoggingServer()
{
    TcpChannel channel = new TcpChannel(15642);
    ChannelServices.RegisterChannel(channel, false);
    RemotingConfiguration.RegisterWellKnownServiceType(new WellKnownServiceTypeEntry(typeof(RemoteSink), "LoggingSinkInConsoleDaemon", WellKnownObjectMode.SingleCall));
}

and server has a RollingFileAppender

RollingFileAppender rollingFileAppender = new RollingFileAppender();
rollingFileAppender.DatePattern = @"yyyy-MM-dd.lo\g.\tx\t";
rollingFileAppender.RollingStyle = log4net.Appender.RollingFileAppender.RollingMode.Date;
rollingFileAppender.AppendToFile = true;
rollingFileAppender.File = logPath;
rollingFileAppender.Threshold = Level.All;
rollingFileAppender.StaticLogFileName = false;
rollingFileAppender.Layout = new PatternLayout(@"%date [t:%thread] %-5level ConsoleDaemon - %message%newline");
rollingFileAppender.MaxSizeRollBackups = 5;
rollingFileAppender.LockingModel = new FileAppender.MinimalLock();
rollingFileAppender.ActivateOptions();

BasicConfigurator.Configure(rollingFileAppender);

so the server also can log.Info("xxxxx")

client use remote appender to server

server's RemoteSink::LogEvents runs in a work thread, and server log something in mainthread, and i find sometimes it stuck, i attched and VC shows it stuck at log4net.dll!log4net.Appender.AppenderSkeleton.DoAppend(log4net.Core.LoggingEvent loggingEvent = {log4net.Core.LoggingEvent}) + 0x52 bytes, maybe where is the source line "lock(this)"

i search internet, everyone says log4net is threadsafe, where am i wrong?

===============================solved============================================ i'm misleading by call stack which make me think about log4net's error

i also used a RichTextBoxAppender(RichTextBoxAppender using log4net) in my server

the RichTextBoxAppender use Invoke, it should use BeginInvoke to make thread-safe

CSDev
  • 3,177
  • 6
  • 19
  • 37
lsaturn
  • 145
  • 1
  • 11

0 Answers0