【问题标题】:duplicate log entries Nlog重复的日志条目 Nlog
【发布时间】:2012-12-24 10:40:00
【问题描述】:

我使用 Nlog 进行记录,我发现我的日志文件中有 5 个条目用于每次调用 nLog。我该如何解决? 例如。

2012-12-23 18:18:19.2465 NinjaTrader.Strategy.LODHOD.OnStartUp Debug   startup
2012-12-23 18:18:19.2465 NinjaTrader.Strategy.LODHOD.OnStartUp Debug   startup
2012-12-23 18:18:19.2465 NinjaTrader.Strategy.LODHOD.OnStartUp Debug   startup
2012-12-23 18:18:19.2465 NinjaTrader.Strategy.LODHOD.OnStartUp Debug   startup
2012-12-23 18:18:19.2465 NinjaTrader.Strategy.LODHOD.OnStartUp Debug   startup
2012-12-23 18:18:19.2465 NinjaTrader.Strategy.LODHOD.OnStartUp Debug   startup

我的 nLog 配置如下

/****CLASS LEVEL VARIABLES***/
// Step 1. Create configuration object 
private static LoggingConfiguration config = new LoggingConfiguration();
private static FileTarget fileTarget = new FileTarget();
private static Logger logger = LogManager.GetCurrentClassLogger();
/*** END OF CLASS LEVEL VARIABLES ***/

/*************************NLOG CONFIG*****/

fileTarget.FileName = 
  "C:\\temp\\" + Instrument.FullName + "nLog." + DateTime.Now.Ticks + ".log";
fileTarget.Layout = 
  "${longdate} ${callsite} ${level} ${event-context:item=StrategyId}  ${message}";

config.AddTarget("file", fileTarget);

// Step 4. Define rules
LoggingRule rule2 = new LoggingRule("*", NLog.LogLevel.Trace, fileTarget);
config.LoggingRules.Add(rule2);

// Step 5. Activate the configuration
LogManager.Configuration = config;


logger.Debug("startup");


/*************************NLOG CONFIG*****/

在 Ninjatrader onStartup 中,您可以看到该启动程序打印了 6 次,并且在程序开始时仅在程序中调用一次。

我也有范围内的 Global Diagnistoc,但我认为这不会导致这种情况发生

public class ScopedGlobalContext : IDisposable
{
  private string n;
  private string v;

  public ScopedGlobalContext(string name, string value)
  {
    n = name;
    v = value;
    NLog.GlobalDiagnosticsContext.Set(n, v);
  }

  public void Dispose()
  {
    NLog.GlobalDiagnosticsContext.Remove(n);
  }
}   

【问题讨论】:

  • 你的规则叫rule2,你有多个吗?
  • 没有。这就是我为 nLog 提供的所有代码。我删除了 rule1 但忘记重命名变量。我仍然不确定为什么它会被打印 6 次
  • 您是否有任何 NLog 配置,在 app.config 或 NLog.config 中?您是否发布了所有 NLog 配置代码?我看到你有一个变量“config”,它是从哪里来的?
  • 这些只是我使用的类级别变量。我将它剪切并粘贴到我展示的代码示例中。
  • 在第一个代码块中,您有一个名为“CLASS LEVEL VARIABLES”的部分(如 cmets 中所述)。每个班级都有相同的代码吗?我问这个是因为,你应该在你的应用程序中只配置一次 NLog,而不是每个类一次。您是否尝试过制作一个精简的程序/库来试验 NLog?如果您要做的事情较少,可能更容易弄清楚 NLog 发生了什么。

标签: logging nlog


【解决方案1】:

如果您有多个针对实例文件的规则,那么您将获得多次写入。

【讨论】:

【解决方案2】:

在我的例子中,将规则标记为final 解决了这个问题。

<rules>
   <logger name="*" minlevel="Warn"  appendTo="database" final="true"/>
   <logger name="*" minlevel="Fatal" appendTo="database" final="true"/>
   <logger name="*" minlevel="Error" appendTo="database" final="true"/>
   <logger name="*" minlevel="Info"  appendTo="database" final="true"/>
   <logger name="*" minlevel="Debug" appendTo="database" final="true"/>
   <logger name="*" minlevel="Trace" appendTo="database" final="true"/>
</rules>

【讨论】:

    【解决方案3】:

    我也遇到过同样的事情。多次搜索导致其他人遇到相同的问题,但没有解决方案。我认为这是一个错误,如果您正在运行多个线程和/或如果执行日志记录的代码被 Linq 查询调用。请记住,Linq 并不总是立即执行或执行一次。

    【讨论】:

    • 真正的问题是你为什么要在 linq 查询中登录?日志记录是一种副作用,因此如果在 linq 查询中完成,则会在本地评估 linq 语句。如果您需要 foreach,请使用 foreach。不要破解 Select。这就像在 RxJs 中使用 Tap。除了调试目的之外,这是不好的做法。
    • 没有。我不是指实际的 linq 方法,而是您使用它们调用的任何对象方法,例如“从 Object.GetItems() 中选择 p”,其中 GetItems() 执行日志本身。
    【解决方案4】:

    WhenRepeated-Filter

    当计算的布局已经被记录时匹配。如果有一个激进的记录器,并且想要限制输出,这很有用。

    在 NLog 版本中引入。 4.5

    它看起来是 nlog 引入的用于去抖动/限制日志输出的解决方案。

    【讨论】:

    • WhenRepeated-Filter 是主机应用程序中不良日志记录行为的解决方法。这并不是针对错误配置的 NLog 日志规则的解决方法(最好只是修复日志规则配置)
    【解决方案5】:

    向记录器添加最终属性解决了我的问题

    <logger name="*" minlevel="Info" writeTo="log" final="true"/>
    

    【讨论】:

      猜你喜欢
      • 2013-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-15
      相关资源
      最近更新 更多