【问题标题】:How to use 1 FileAppender for multiple Logger in log4net如何在 log4net 中为多个 Logger 使用 1 个 FileAppender
【发布时间】:2018-05-02 15:43:34
【问题描述】:

基本上,我需要生成多个日志文件。 在我的示例中,我有 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="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);

【问题讨论】:

  • 你并没有真正提到问题到底是什么。根据您发布的代码,我假设您将获得一个(null).txt 输出日志文件。如果是这种情况,那么您需要在GlobalContext 中设置LogName 之后调用XmlConfigurator.Configure();。然后,每次您想使用相同的附加程序切换日志文件时再次调用它。丑陋...我宁愿有多个附加程序。
  • LogName 属性将是动态的。例如,我从配置中添加新的 logger-C,我将只使用现有的 FileAppender,它应该创建一个新的日志文件。
  • 我们知道LogName 是动态的,但您仍然没有告诉我们运行代码时究竟发生了什么。
  • 每个 Logger 应该有单独的日志文件。如果我有 3 个记录器,我希望有 3 个日志文件。

标签: c# log4net


【解决方案1】:

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

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 时,它将使用 logger 名称作为 FileAppender 的 LogName
  • 对引用记录器名称的奇怪请求,因为您正在请求具有两个不同输出文件的文件附加程序。也许我没有完全理解。祝你好运!
【解决方案2】:

我并没有完全理解你的要求,无论如何我试图回答你。

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多