0

can anyone explain why I am not getting any events from the memoryAppender? In other words, the events variable is Null.

    public void Log(string message, Category category, Priority priority)
    {
        MemoryAppender memoryAppender = new MemoryAppender();
        log4net.Config.XmlConfigurator.Configure(new System.IO.FileInfo(@"C:\Users\Username\Documents\GitHub\MassSpecStudio\MassSpecStudio 2.0\source\MassSpecStudio\Core\app.config"));
        bool log4netIsConfigured = log4net.LogManager.GetRepository().Configured;
        switch(category)
        {
            case Category.Debug:
                log.Debug(message);
                break;
            case Category.Warn:
                log.Warn(message);
                break;
            case Category.Exception:
                log.Error(message);
                break;
            case Category.Info:
                log.Info(message);
                break;
        }
        var events = memoryAppender.GetEvents(); // events is Null.
        int esize = events.Length;
        foreach (LoggingEvent loggingEvent in events)
        {
            LogItem logItem = new LogItem(loggingEvent.TimeStamp, loggingEvent.Level, loggingEvent.RenderedMessage);
            LogItems.Add(logItem);
        }
    }

*UPDATE:

I have provided the following in the config file. How isn't my MemoryAppender hooking up into the logger properly?

<log4net>
<appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender">
  <file type="log4net.Util.PatternString" value="C:\temp\Logger_.txt" />
  <param name="AppendToFile" value="true"/>
  <param name="RollingStyle" value="Once"/>
  <param name="RollingStyle" value="Date"/>
  <datePattern value="yyyy-MM-dd_HHmmss" />
  <lockingModle type="log4net.Appender.FileAppender+MinimalLock"/>
  <preserveLogFileNameExtension value="true"/>
  <maxSizeRollBackups value="30" />
  <staticLogFileName value="false" />
  <layout type="log4net.Layout.PatternLayout">
    <param name="ConversionPattern" value="%date [%thread] %-5level %logger - %message%newline" />
  </layout>
</appender>
<appender name="MemoryAppender" type="log4net.Appender.MemoryAppender">
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%date [%thread] %-5level %message%newline" />
  </layout>
</appender>
<root>
  <level value="ALL" />
  <appender-ref ref="LogFileAppender" />
  <appender-ref ref="MemoryAppender" />
</root>

DanCode
  • 525
  • 3
  • 7
  • 25

1 Answers1

1

Log4Net works on 'Loggers' and 'Appenders'. You need to connect an Appender to a Logger in order for it to receive the messages being logged. This can be done in code or in a config file. You appear to be doing a bit of both, by initialising log4net using the config file, then creating a MemoryAppender in code.

Problems:

  1. You're initialising log4net every time this function is called. You only need to do this once per process.
  2. You have created a new instance of MemoryAppender with every call to the function, when you probable only want one.
  3. THE MAIN ISSUE: the MemoryAppender is not hooked up to the logger. If you definitely want to do this in code, see here: Programmatically adding and removing log appenders in log4net

Updated to answer your revised question:

To get the events from the single MemoryAppender in your .config file:

var appender = log4net.LogManager.GetRepository().GetAppenders().OfType<log4net.Appender.MemoryAppender>().Single(); // Assumes exactly one MemoryAppender
var events = appender.GetEvents();
Community
  • 1
  • 1
smarcantonio
  • 368
  • 1
  • 5