c# - NLog 跟踪目标仅适用于跟踪和调试级别,不适用于信息、警告、错误或致命级别

标签 c# .net nlog

请注意,我回答自己的问题是为了帮助将来的人。

当我使用 NLog 记录跟踪目标类型时,只有当级别为 TraceDebug 时,它才能正常工作。如果是 InfoWarnError,它会在我的布局之前添加额外的信息。如果级别为致命,我会收到一个弹出窗口,提示断言失败,并且在输出中也如此。跟踪目标是否被窃听?

Program.cs

using System;

namespace TraceLoggingTest
{
    class Program
    {
        private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();

        static void Main(string[] args)
        {
            logger.Trace("Hello Trace");
            logger.Debug("Hello Debug");
            logger.Info("Hello Info");
            logger.Warn("Hello Warn");
            logger.Error("Hello Error");
            logger.Fatal("Hello Fatal");

            Console.ReadLine();
            NLog.LogManager.Shutdown();
        }
    }
}

NLog.config

<?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>
    <target name="logTrace" xsi:type="Trace" layout="${message}" />
  </targets>

  <rules>
    <logger name="*" minlevel="Trace" writeTo="logTrace" />
  </rules>
</nlog>

预期输出

Hello Trace
Hello Debug
Hello Info
Hello Warn
Hello Error
Hello Fatal

实际输出

Hello Trace
Hello Debug
TraceLoggingTest.exe Information: 0 : Hello Info
TraceLoggingTest.exe Warning: 0 : Hello Warn
TraceLoggingTest.exe Error: 0 : Hello Error
---- DEBUG ASSERTION FAILED ----
---- Assert Short Message ----
Hello Fatal
---- Assert Long Message ----

最佳答案

Nlog 4.5 中引入了针对前置问题的修复。您需要将 rawWrite="true" 添加到目标语句中。它还恰好修复了断言问题。

更改:

<target name="logTrace" xsi:type="Trace" layout="${message}" />

对此:

<target name="logTrace" xsi:type="Trace" layout="${message}" rawWrite="true" />

来自https://github.com/NLog/NLog/wiki/Trace-target :

Layout Options

rawWrite - Always use Trace.WriteLine independent of LogLevel. Default: False

Introduced with NLog 4.5, fixes the issue with output being prefixed with exe-filename.

以下是对原始问题的两次讨论:

关于c# - NLog 跟踪目标仅适用于跟踪和调试级别,不适用于信息、警告、错误或致命级别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50808619/

相关文章:

c# - .net 中的测试驱动开发和单元测试

c# - 无法加载文件或程序集 'Microsoft.Data.Edm'

c# - "Deleted row information cannot be accessed through the row"试图从我的数据表中删除未使用的行

c# - facebook登录Win10应用程序的问题

javascript - 握手期间 ASP.NET Core WebSocket 失败

c++ - DataContractSerialize 错误

amazon-s3 - AppHarbor 和 Amazon S3 的良好日志记录策略

c# - NLog 减慢并破坏了我的 ASP.net MVC 应用程序

c# - 同步多个 observable 的顺序

asp.net - 在 AspNet vNext (MVC 6) 中将 NLog 与 asp-net 布局渲染器一起使用