2

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

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

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

我也有范围内的 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);
  }
}   
4

5 回答 5

5

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

于 2013-11-04T09:32:51.573 回答
4

就我而言,将规则标记为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>
于 2019-08-02T12:44:38.327 回答
2

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

于 2013-02-20T16:45:49.057 回答
1

当重复过滤器

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

与 NLog 版本一起引入。4.5

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

于 2018-11-13T20:18:45.473 回答
0

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

<logger name="*" minlevel="Info" writeTo="log" final="true"/>
于 2019-09-27T15:18:17.360 回答