c# - NLog 缺少具有异步滚动更新文件配置的日志条目

标签 c# logging nlog

NLog 不会记录每 strip 有异步滚动文件记录器配置的日志消息。

以下是我的 NLog.config 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

然而,当我删除异步属性时,代码运行正常。

最佳答案

<targets async="true">只是用 AsyncWrapper 包装所有目标的简写目标。 IE。您的配置相当于:

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

关于c# - NLog 缺少具有异步滚动更新文件配置的日志条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33164620/

相关文章:

c# - 如何在 ASP.NET MVC 中使用 NLog 记录客户端 IP 地址

c# - 编写 .NET 对象脚本

c# - 在生成的部分类上使用 XmlIgnore

c# - 设计线程安全类

Java Swing - 从多线程更新 View

Python,想要使用日志轮换和压缩进行日志记录

使用 MS Enterprise Library 进行日志记录

asp.net-core - 在 asp.net core 应用程序的调试窗口中显示 NLog 输出

c# - 按数量递减将 x 分成 y 部分

.net - NLog 中 Callsite 布局渲染器的性能影响