如何在 log4net 中将 1 个文件追加器用于多个记录器



基本上,我需要生成多个日志文件。在我的示例中,我有 2 个记录器 {logger-A, logger-B}。我发现为每个记录器创建另一个文件追加器很乏味。如何为多个记录器重复使用 1 个追加器?

在配置中

<log4net>
    <root>
      <level value="ALL" />
      <appender-ref ref="LogFileAppender" />
    </root>
    <logger additivity="false" name="logger-A">
      <level value="All"/>
      <appender-ref ref="FileAppender" />
    </logger>
    <logger additivity="false" name="logger-B">
      <level value="All"/>
      <appender-ref ref="FileAppender" />
    </logger>
    <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender" >
      <param name="File" type="log4net.Util.PatternString" value="logall.txt" />
      <param name="AppendToFile" value="true" />
      <rollingStyle value="Size" />
      <maxSizeRollBackups value="10" />
      <maximumFileSize value="2MB" />
      <staticLogFileName value="true" />
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%-5p%d{yyyy-MM-dd hh:mm:ss} – %m%n" />
      </layout>
      <filter type="log4net.Filter.PropertyFilter">
        <Key value="Version" />
        <StringToMatch value="1" />
      </filter>
    </appender>
    <appender name="FileAppender" type="log4net.Appender.RollingFileAppender" >
      <param name="File" type="log4net.Util.PatternString" value="log%property{LogName}.txt" />
      <param name="AppendToFile" value="true" />
      <rollingStyle value="Size" />
      <maxSizeRollBackups value="10" />
      <maximumFileSize value="2MB" />
      <staticLogFileName value="true" />
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%-5p%d{yyyy-MM-dd hh:mm:ss} – %m%n" />
      </layout>
    </appender>
  </log4net>

在 C# 中

GlobalContext.Properties["LogName"] = string。格式("{0}", 记录器名称(;var logger = LogManager.GetLogger(loggerName(;
如果需要配置

,您可以使用良好的旧组合来执行此操作并添加更多属性。如下图所示。

public class FileAppenderX2 : AppenderSkeleton
{
    private FileAppender _output1;
    private FileAppender _output2;
    public string Output1 { get; set; }
    public string Output2 { get; set; }
    public override void ActivateOptions()
    {
        base.ActivateOptions();
        _output1 = new FileAppender() { Layout = this.Layout, File = Output1 };
        _output2 = new FileAppender() { Layout = this.Layout, File = Output2 };
        _output1.ActivateOptions();
        _output2.ActivateOptions();
    }
    public FileAppenderX2()
    {
    }
    protected override void Append(LoggingEvent loggingEvent)
    {
        _output1.DoAppend(loggingEvent);
        _output2.DoAppend(loggingEvent);
    }
}

配置文件编辑在这里...

  <appender name="FileX2Appender" type="{Fully Qualified Namespace}.FileAppenderX2, {Assembly Name}">
    <Output1 value="C:output1.log"/>
    <Output2 value="C:output2.log"/>
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="[%date]-[%thread]-[%level]-[%logger] - %message%newline" />
    </layout>
  </appender>

我不完全理解你的要求,无论如何根据我的理解,我试图回答你。

所以你在配置中指定了多个记录器,比如

    <logger additivity="false" name="logger-A">
      <level value="All"/>
      <appender-ref ref="FileAppender" />
    </logger>
    <logger additivity="false" name="logger-B">
      <level value="All"/>
      <appender-ref ref="FileAppender" />
    </logger>

然后你有一个带有参数的附加器,如下所示

<param name="File" type="log4net.Util.PatternString" value="log%property{LogName}.txt" />

它正在寻找一个字符串来替换 {日志名称}。

并且您可以使用下面的 c# 代码获取记录器名称,

GlobalContext.Properties["LogName"] = string.Format("{0}", loggerName);
var logger = LogManager.GetLogger(loggerName);

如果我的上述理解是正确的,那么您可以参考链接。我不知道这有多实用,但至少它会为你提供我相信的信息。

最新更新