配置Log4net以写入多个文件

139
我想从同一进程将日志写入2个不同的日志文件。
使用log4net是否可以实现呢?
我需要将不同的消息写入每个日志文件。如何向特定的appender写入消息?

3
你不能将日志记录到不同的附加器中,你需要配置不同的日志记录器,并将适当的附加器附加到每一个日志记录器上。然后将不同的消息记录到不同的日志记录器中。 - Vinay Sajip
这是我使用代码配置的方法:https://dev59.com/vYbca4cB1Zd3GeqPZroO - Jay Sullivan
5个回答

216

这些答案很有帮助,但我想分享我的答案,包括app.config部分和c#代码部分,这样下一个人就不用再猜了。

<log4net>
  <appender name="SomeName" type="log4net.Appender.RollingFileAppender">
    <file value="c:/Console.txt" />
    <appendToFile value="true" />
    <rollingStyle value="Composite" />
    <datePattern value="yyyyMMdd" />
    <maxSizeRollBackups value="10" />
    <maximumFileSize value="1MB" />
  </appender>
  <appender name="Summary" type="log4net.Appender.FileAppender">
    <file value="SummaryFile.log" />
    <appendToFile value="true" />
  </appender>
  <root>
    <level value="ALL" />
    <appender-ref ref="SomeName" />
  </root>
  <logger additivity="false" name="Summary">
    <level value="DEBUG"/>
    <appender-ref ref="Summary" />
  </logger>
</log4net>

然后在代码中:

ILog Log = LogManager.GetLogger("SomeName");
ILog SummaryLog = LogManager.GetLogger("Summary");
Log.DebugFormat("Processing");
SummaryLog.DebugFormat("Processing2"));

这里的 c:/Console.txt 将会包含 "Processing" …而 \SummaryFile.log 将包含 "Processing2"。


64
我想提醒一下logger中的additivity="false"属性,它可以防止所有内容都被记录到根日志中。 - Jason Hernandez
2
这是log4net强大能力的一个很好的例子。谢谢! - crush
5
上述配置缺少<layout> ... </layout>,没有它,我在日志文件中看不到任何消息。 - CrnaStena
@Gary 当然。我刚刚验证了几次。 - CrnaStena
1
@Craig,有关如何使用它的更多信息,请参见此问题:https://dev59.com/MXI-5IYBdhLWcg3wI0x9 - Gary
显示剩余4条评论

88

是的,只需向您的日志记录器添加多个FileAppender即可。例如:

<log4net>
    <appender name="File1Appender" type="log4net.Appender.FileAppender">
        <file value="log-file-1.txt" />
        <appendToFile value="true" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date %message%newline" />
        </layout>
    </appender>
    <appender name="File2Appender" type="log4net.Appender.FileAppender">
        <file value="log-file-2.txt" />
        <appendToFile value="true" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date %message%newline" />
        </layout>
    </appender>

    <root>
        <level value="DEBUG" />
        <appender-ref ref="File1Appender" />
        <appender-ref ref="File2Appender" />
    </root>
</log4net>

6
好的.. :) 不过,我需要向每个日志文件单独写入消息。我应该如何将消息写入特定的appender中? 谢谢。ofer - ofer
2
@ofer- 请看我在如何实现该功能的答案。 - RichardOD
1
如果您想让File1Appender记录DEBUG错误并让File2Appender记录ERROR错误,该怎么办? - JsonStatham
我正在尝试实现类似的功能。如果您能回答我的问题,我会很高兴:http://stackoverflow.com/questions/24886364/log4net-writing-to-different-files - Ashish Charan

63

Vinay 是正确的。回答你在他的答案中的评论,你可以按照以下方式来实现:

<root>
    <level value="ALL" />
    <appender-ref ref="File1Appender" />
</root>
<logger name="SomeName">
    <level value="ALL" />
    <appender-ref ref="File1Appender2" />
</logger>

这是我过去的做法。然后另一个日志可以用类似这样的方式:

private static readonly ILog otherLog = LogManager.GetLogger("SomeName");

你可以按如下方式获取你的普通日志记录器:

private static readonly ILog log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);

阅读文档中的记录器和追加器部分,以了解此功能的工作原理。


4
我在我的一个应用程序中也有这个“同样”的设置,但它对我不起作用 :( - Román
1
这个讨论很久了...希望你能回复...我尝试了你的方法,但是两个记录器记录相同的消息。例如log.Info("")和otherLog.Info("")同时将消息写入两个日志文件中。 - SutharMonil
1
@daniel_aren 是的,我的做法是使用了 appender 块来创建具有不同文件路径的两个 appender(就像上面这个)... ... 因此有效地创建了两个名为 fileappender1 和 fileappender2 的 appender 块... - SutharMonil
1
@SutharMonil 只需在记录器节点中添加 'additivity="false"',就像 Gary 的答案和 Jason Hernandez 强调的那样。在这种情况下,它仍将把所有消息放在根目录中,但只有来自 otherLog.Info("") 的消息才会出现在 File1Appender2 中。 - freedomn-m
迄今为止最准确的答案。 - Fabricio
1
LogManager.GetLogger("SomeName"); 出现错误,无法将字符串转换为 System.Type。缺少什么? - Benk

47

我希望将所有消息记录到根记录器中,并拥有一个单独的日志来记录错误,以下是实现方法:

<log4net>
    <appender name="FileAppender" type="log4net.Appender.FileAppender">
        <file value="allMessages.log" />
        <appendToFile value="true" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date  %-5level %logger  - %message%newline" />
        </layout>
    </appender>

    <appender name="ErrorsFileAppender" type="log4net.Appender.FileAppender">
        <file value="errorsLog.log" />
        <appendToFile value="true" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date  %-5level %logger  - %message%newline" />
        </layout>
        <filter type="log4net.Filter.LevelRangeFilter">
            <levelMin value="ERROR" />
            <levelMax value="FATAL" />
        </filter>
    </appender>

    <root>
        <level value="ALL" />
        <appender-ref ref="FileAppender" />
        <appender-ref ref="ErrorsFileAppender" />
    </root>
</log4net>
注意使用了filter元素。

5
使用以下XML配置将日志配置为两个或更多文件:
<log4net>
    <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
      <file value="logs\log.txt" />         
      <appendToFile value="true" /> 
      <rollingStyle value="Size" />
      <maxSizeRollBackups value="10" />
      <maximumFileSize value="10MB" />
      <staticLogFileName value="true" />
      <layout type="log4net.Layout.PatternLayout">           
        <conversionPattern value="%date [%thread] %level %logger - %message%newline" />
      </layout>
    </appender>
     <appender name="RollingLogFileAppender2" type="log4net.Appender.RollingFileAppender">
      <file value="logs\log1.txt" />         
      <appendToFile value="true" /> 
      <rollingStyle value="Size" />
      <maxSizeRollBackups value="10" />
      <maximumFileSize value="10MB" />
      <staticLogFileName value="true" />
      <layout type="log4net.Layout.PatternLayout">        
        <conversionPattern value="%date [%thread] %level %logger - %message%newline" />
      </layout>
    </appender>
    <root>
      <level value="All" />
      <appender-ref ref="RollingLogFileAppender" />
    </root>
     <logger additivity="false" name="RollingLogFileAppender2">
    <level value="All"/>
    <appender-ref ref="RollingLogFileAppender2" />
    </logger>
  </log4net>

上述XML配置将日志记录到两个不同的文件中。要以编程方式获取特定的记录器实例:
ILog logger = log4net.LogManager.GetLogger ("RollingLogFileAppender2");

您可以在log4net根元素中附加两个或多个appender元素,以记录到多个文件中。
有关上述XML配置结构的更多信息或最适合您的应用程序的appender,请从以下链接中阅读详细信息:

https://logging.apache.org/log4net/release/manual/configuration.html https://logging.apache.org/log4net/release/sdk/index.html


这个对我有效,谢谢! - Attila

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接