C# - NLog 为同一个调用记录多行

Posted

技术标签:

【中文标题】C# - NLog 为同一个调用记录多行【英文标题】:C# - NLog logs multiple lines for the same call 【发布时间】:2020-05-14 08:58:56 【问题描述】:

我开始使用 NLog,我想将每一行记录到一个日志文件和一个控制台中以进行调试。 当我尝试记录每个日志操作时,控制台和日志文件都会打印 2-3 次,而不是在每个目标中打印一次。

我在 NLog.config 文件中配置了 NLog:

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

  <targets>
    <target name="logfile" xsi:type="File" fileName="C:\Users\user\source\repos\TaskSchedulerConsole\Log.txt" />
    <target name="logconsole" xsi:type="Console" />
  </targets>

  <rules>
    <logger name="*" minlevel="Trace" writeTo="logfile, logconsole" />
    <logger name="*" minlevel="Debug" writeTo="logfile, logconsole" />
    <logger name="*" minlevel="Info" writeTo="logfile, logconsole" />
    <logger name="*" minlevel="Warn" writeTo="logfile, logconsole" />
    <logger name="*" minlevel="Error" writeTo="logfile, logconsole" />
    <logger name="*" minlevel="Fatal" writeTo="logfile, logconsole" />

  </rules>
</nlog>

在每个类中我都创建了一个静态记录器:

private static readonly NLog.Logger Logger = NLog.LogManager.GetCurrentClassLogger();

三重日志记录示例: 程序.cs:

            try
            
                Logger.Info("Program Started.");

            
            catch(Exception ex)
            
                Logger.Info(ex, "Something went wrong...");
            
            finally
            
                Logger.Info("Program Finished.");
                NLog.LogManager.Shutdown();

            

在控制台和日志文件中输出:

2020-05-14 11:49:44.7542|INFO|TaskSchedulerConsole.Program|Program Started.
2020-05-14 11:49:44.7542|INFO|TaskSchedulerConsole.Program|Program Started.
2020-05-14 11:49:44.7542|INFO|TaskSchedulerConsole.Program|Program Started.
2020-05-14 11:49:44.8315|INFO|TaskSchedulerConsole.Program|Program Finished.
2020-05-14 11:49:44.8315|INFO|TaskSchedulerConsole.Program|Program Finished.
2020-05-14 11:49:44.8315|INFO|TaskSchedulerConsole.Program|Program Finished.

提前感谢大家,希望有人能帮助我理解这个问题。

【问题讨论】:

如果删除&lt;logger name="*" minlevel="Debug" writeTo="logfile, logconsole" /&gt; &lt;logger name="*" minlevel="Info" writeTo="logfile, logconsole" /&gt; &lt;logger name="*" minlevel="Warn" writeTo="logfile, logconsole" /&gt; &lt;logger name="*" minlevel="Error" writeTo="logfile, logconsole" /&gt; &lt;logger name="*" minlevel="Fatal" writeTo="logfile, logconsole" /&gt; 会发生什么?你认为这是为什么? 【参考方案1】:

1.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">

  <variable name="myvar" value="myvalue"/>
  <targets>
     <target name="logfile" xsi:type="File" fileName="log-dest\Log.txt" />
     <target name="logconsole" xsi:type="Console" />
  </targets>

  <rules>
    <logger name="*" minlevel="Info" writeTo="logfile, logconsole" />       
  </rules>
</nlog>

2.program.cs

class Program

    private static readonly NLog.Logger Logger = NLog.LogManager.GetCurrentClassLogger();
    static void Main(string[] args)
    
        try
        
            Logger.Info("Program Started.");
        
        catch (Exception ex)
        
            Logger.Error(ex, "Something went wrong...");
        
        finally
        
            Logger.Info("Program Finished.");
            NLog.LogManager.Shutdown();
        
    

3.结果

【讨论】:

meta.***.com/questions/300837/…【参考方案2】:

这是正确的行为。

您为您的 NLog.config 配置了六个规则,这六个规则中的三个将在您的代码中触发。 (跟踪/调试/信息)

【讨论】:

@谢谢,我没听懂 minlevel 属性。【参考方案3】:
        <logger name="*" minlevel="Trace" writeTo="logfile" />
        <logger name="*" minlevel="Trace" writeTo="logconsole" />

应该足以记录每个级别条目一次

问题是您要多次添加记录器,例如

    <logger name="*" minlevel="Trace" writeTo="logfile, logconsole" />
    <logger name="*" minlevel="Debug" writeTo="logfile, logconsole" />

添加两个记录器:一个用于从Trace 开始的所有事件,第二个用于从Debug 级别开始的所有级别。

【讨论】:

以上是关于C# - NLog 为同一个调用记录多行的主要内容,如果未能解决你的问题,请参考以下文章

在c#中,将一个textbox设置成多行,并在其中输入多行内容,怎样选中一行并将其显示在另外一个文本框中,

如何在 C# 中读取文本文件中的多行? [复制]

如何在 C# 中读取文本文件中的多行? [复制]

c# winform DataGridView单击选中一整行,只能单选,不能选择多行,只能选择一行

教义 - 只用一个 save() 插入多行

C# 使用NLog记录日志