我使用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*****/
你可以看到starup打印6次,并且在Ninjatrader onStartup程序开始时程序中只调用一次。
我也有范围的全球诊断,但我认为不会导致这种情况发生
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);
}
}
答案 0 :(得分:5)
如果您有多个针对实例文件的规则,那么您将获得多次写入。
答案 1 :(得分:2)
我发生了同样的事情。一些搜索导致其他人遇到相同的问题,但没有解决方案。我认为这是一个错误,如果您正在运行多个线程和/或在Linq查询中调用日志记录。请记住,Linq总是立即执行。虽然这不是一个答案,但它应该可以帮助您找到问题的根源。
答案 2 :(得分:1)
在已记录计算的布局时进行匹配。如果拥有积极的记录器并且想要限制输出,则很有用。
与NLog版本一起引入。 4.5
这似乎是nlog引入的去抖动/节流日志输出的解决方案。
答案 3 :(得分:0)
就我而言,将规则标记为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>
答案 4 :(得分:0)
向记录器添加最终属性解决了我的问题
<logger name="*" minlevel="Info" writeTo="log" final="true"/>