MemoryAppender.GetEvents : Events Null

本文关键字:Null Events GetEvents MemoryAppender | 更新日期: 2023-09-27 18:04:26

有人能解释为什么我没有从memoryAppender中获取任何事件吗?换句话说,events变量为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);
        }
    }

*更新:

我在配置文件中提供了以下内容。我的MemoryAppender怎么没有正确连接到记录器?

<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>

MemoryAppender.GetEvents : Events Null

Log4Net适用于"Loggers"answers"Appenders"。您需要将Appender连接到Logger,以便它接收正在记录的消息。这可以在代码或配置文件中完成。通过使用配置文件初始化log4net,然后在代码中创建MemoryAppender,您似乎同时完成了这两项工作。

问题:

  1. 每次调用此函数时,您都在初始化log4net。每个流程只需要执行一次
  2. 您在每次调用函数时都创建了一个MemoryAppender的新实例,而您可能只需要一个
  3. 主要问题:MemoryAppender未连接到记录器。如果您确实想在代码中执行此操作,请参阅此处:在log4net中以编程方式添加和删除日志附加程序

更新以回答您修改后的问题:

要从.config文件中的单个MemoryAppender获取事件:

var appender = log4net.LogManager.GetRepository().GetAppenders().OfType<log4net.Appender.MemoryAppender>().Single(); // Assumes exactly one MemoryAppender
var events = appender.GetEvents();