Log4net可以有多个appender写入同一个文件吗?

22

我正在使用RollingFileAppender将一些信息记录到一个文件中,并且使用了一个conversionPattern(在web.config中)来指定每个日志部分的标题,格式如下:

<conversionPattern value="%date - %property{userId} - %property{method}%newline--------------------------------%newline%message%newline%newline"/>

我想将细节作为项目符号记录在此标题下。我目前正在尝试使用另一个 RollingFileAppender,使用简单的连字符转换模式将日志记录到同一文件中,如下所示:

<conversionPattern value="- %message%newline"/>

但是这些消息没有出现在日志文件中。我使用Log.Info()来作为标题,Log.Debug()来作为详细信息,并且根据它们各自的日志级别过滤每个appender。我正在尝试的方法可行吗?或者从log4net中获取标题和详细信息到日志文件中是否有更好的方法?

2个回答

39

是的,你可以拥有两个log4net appender来将日志写入同一个日志文件。

你需要在每个Appender中放置以下行:

<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />

这将使log4net使用一种最小化锁定模型,允许多个进程向同一个文件写入。

下面是一个使用两个appender向同一个日志文件写入的示例XML:

<log4net debug="false">
<appender name="RollingLogFileAppender1" type="log4net.Appender.RollingFileAppender">
  <!-- this configures a log for the application messages -->
  <file value="TestLog.log" />
  <appendToFile value="true" />
  <!-- next line uses a minimal locking model that allows multiple processes to write to the same file -->
  <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
  <rollingStyle value="Size" />
  <maxSizeRollBackups value="10" />
  <maximumFileSize value="10MB" />
  <staticLogFileName value="true" />
  <!-- make the most recent log the highest numbered log -->
  <countDirection value="1" />
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%-5level %date{MM-dd-yyyy HH:mm:ss.ff} [%property{NDC}] %message%newline [Thread: %thread] %c{1} Method:%method(%file{1}, Line:%line) %newline" />
  </layout>
  <!-- The following two filters insure only log requests of 
        version '1' use this Appender -->
</appender>
<appender name="RollingLogFileAppender2" type="log4net.Appender.RollingFileAppender">
  <file value="TestLog.log" />
  <appendToFile value="true" />
  <!-- next line uses a minimal locking model that allows multiple processes to write to the same file -->
  <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
  <rollingStyle value="Size" />
  <maxSizeRollBackups value="10" />
  <maximumFileSize value="10MB" />
  <staticLogFileName value="true" />
  <!-- make the most recent log the highest numbered log -->
  <countDirection value="1" />
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%-5level %date{MM-dd-yyyy HH:mm:ss.ff} [%property{NDC}] [Thread: %thread] %c{1} Method:%method(%file{1}, Line:%line) %newline%message" />
  </layout>
</appender>
<root>
  <level value="DEBUG" />
  <appender-ref ref="RollingLogFileAppender1" />
  <appender-ref ref="RollingLogFileAppender2" />
</root>

这个可以在Apache文档中找到,链接如下: Apache Log4Net文档 在页面上搜索“same file”即可。

希望能帮到你。


请注意,只有最近版本的log4net才具有lockingModel Xml设置和MinimalLock类。如果您使用旧版本,则不会抛出错误,但它将无法正常工作。 - Simon Mourier

1
你可以在 Visual Studio 的输出窗口中检查 log4net 是否存在任何问题。该库会在那里记录错误,非常有用以便检测配置错误。

很不幸,目前没有任何错误报告可以帮助我 :( - adam0101

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