NLog丢失的日志条目与异步滚转文件配置

本文关键字:异步 文件 配置 日志 NLog | 更新日期: 2023-09-27 18:18:08

NLog没有使用异步滚动文件记录器配置记录每个日志消息。

以下是我的NLog。xml配置。

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
      autoReload="true"
      throwExceptions="false"
      internalLogLevel="Off" internalLogFile="c:'temp'nlog-internal.log" >
  <targets async="true">
      <target name="logfile" xsi:type="File" fileName="logs/log.txt" 
              maxArchiveFiles="10" 
              archiveAboveSize="1048576" 
              archiveNumbering="Sequence" 
              concurrentWrites="true" 
              archiveFileName="logs/log.{####}.txt"/>
    </target>
  </targets>
  <rules>
    <logger name="*" minlevel="Debug" writeTo="logfile" />
  </rules>
</nlog>

下面是我的代码。

    private static Logger log = LogManager.GetCurrentClassLogger();
    Stopwatch sw = new Stopwatch();
    public Form1()
    {
        InitializeComponent();
        LogManager.ReconfigExistingLoggers();
    }
    private void button1_Click(object sender, EventArgs e)
    {
        string toLog;
        sw.Start();
        for (int i = 0; i < 100000; i++)
        {
            toLog = "Message:" + i.ToString();
            log.Debug(toLog);
        }
        sw.Stop();
        string s = "STOP :" + sw.Elapsed.ToString();
        log.Debug(s);
    }

我只得到一个文件作为结果,一些日志条目丢失。以下是生成的log.txt文件。

2015-10-16 12:04:08.9865|DEBUG|NLogAsync.Form1|Message:11591
2015-10-16 12:04:08.9865|DEBUG|NLogAsync.Form1|Message:11592
2015-10-16 12:04:08.9865|DEBUG|NLogAsync.Form1|Message:11593
2015-10-16 12:04:08.9865|DEBUG|NLogAsync.Form1|Message:11594
2015-10-16 12:04:09.0802|DEBUG|NLogAsync.Form1|Message:80436
2015-10-16 12:04:09.0802|DEBUG|NLogAsync.Form1|Message:80437
2015-10-16 12:04:09.0802|DEBUG|NLogAsync.Form1|Message:80438
2015-10-16 12:04:09.0802|DEBUG|NLogAsync.Form1|Message:80439

然而,当我删除async属性,代码运行正常

NLog丢失的日志条目与异步滚转文件配置

<targets async="true">只是用AsyncWrapper目标包装所有目标的简写。也就是说,你的配置相当于:

<targets>
  <target name="logfile" xsi:type="AsyncWrapper">
    <target xsi:type="File" fileName="logs/log.txt"
            maxArchiveFiles="10"
            archiveAboveSize="1048576"
            archiveNumbering="Sequence"
            concurrentWrites="true"
            archiveFileName="logs/log.{####}.txt"/>
  </target>
</targets>

这个异步包装器将使用默认设置。最重要的是queueLimit默认值是10000,overflowAction默认值是Discard。这是什么意思?当写入线程在队列中有超过10000条日志消息时,所有新的日志消息将被丢弃。因此,确保所有日志消息将被处理的最简单方法是将默认overflowAction值更改为Grow。但是你需要手动指定AsyncWrapper:

<targets>
  <target name="logfile" xsi:type="AsyncWrapper" overflowAction="Grow">
    <target xsi:type="File" fileName="logs/log.txt"
            maxArchiveFiles="10"
            archiveAboveSize="1048576"
            archiveNumbering="Sequence"
            concurrentWrites="true"
            archiveFileName="logs/log.{####}.txt"/>
  </target>
</targets>