如何在log4net中为多个Logger使用1个FileAppender

时间:2018-04-19 09:56:58

标签: c# log4net

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

在配置

<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="log\all.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.Format("{0}", loggerName);
var logger = LogManager.GetLogger(loggerName);

2 个答案:

答案 0 :(得分:3)

如果要进行配置,可以使用旧的合成来执行此操作并添加更多属性。如下图所示。

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>

答案 1 :(得分:0)

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

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

    <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的appender,如下所示

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

正在寻找一个替换{LogName}的字符串。

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

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

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