Logging 将变量作为前缀添加到所有nLog消息中
我正在使用Nlog记录我的Ninjatrader策略。我希望能够将策略id作为前缀添加到我的所有nLog消息中,以便我可以分别筛选与策略上每个帐户相关的条目Logging 将变量作为前缀添加到所有nLog消息中,logging,nlog,Logging,Nlog,我正在使用Nlog记录我的Ninjatrader策略。我希望能够将策略id作为前缀添加到我的所有nLog消息中,以便我可以分别筛选与策略上每个帐户相关的条目 fileTarget.Layout = "${longdate} ${callsite} ${level} ${event-context:item=MyValue} ${message}";` 我当前的布局如上所示。我尝试使用event-context:item,但不知道如何打印所有消息的上下文项 我试了以下方法 Logger l
fileTarget.Layout = "${longdate} ${callsite} ${level} ${event-context:item=MyValue} ${message}";`
我当前的布局如上所示。我尝试使用event-context:item,但不知道如何打印所有消息的上下文项
我试了以下方法
Logger log = LogManager.GetCurrentClassLogger();
LogEventInfo theEvent = new LogEventInfo(NLog.LogLevel.Debug, "", this.Account.Name);
logger.Log(theEvent);
但它只在第一行Sim101上打印了一行内容信息,而没有在其他行上打印
2012-11-26 15:09:47.9777 NinjaTrader.Strategy.LODHOD.OnStartUp Debug Sim101
2012-11-26 15:09:48.3996 NinjaTrader.Strategy.LODHOD.OnBarUpdate Trace BAR UPDATE
2012-11-26 15:09:49.7902 NinjaTrader.Strategy.LODHOD.EntryOrders Info PLACED ENTRY ORDERS
如何在所有日志行上打印Sim101?the
{event context}
LayoutRenderer
从LogEventInfo
对象的属性中写入一个值
属性是一个字典,您可以在其中存储希望NLog添加到每个日志消息的命名值
如果要使用“StrategyId”标记每条日志消息,并且在记录消息时有效,则应创建类似以下内容的LogEventInfo对象:
LogEventInfo theEvent = new LogEventInfo(NLog.LogLevel.Debug, "", this.Account.Name);
theEvent.Properties["StrategyId"] = "Sim101";
Logger.Log(theEvent);
fileTarget.Layout = "${longdate} ${callsite} ${level} ${event-context:item=StrategyId} ${message}";
fileTarget.Layout = "${longdate} ${callsite} ${level} ${gdc:item=StrategyId} ${message}";
var theEvent = new LogEventInfo(NLog.LogLevel.Debug, "", this.Account.Name).WithProperty("StrategyId", "ABC");
LogEventInfo WithStrategy(this LogEventInfo theEvent, string strategy)
{
theEvent.Properties["StrategyId"] = strategy;
return theEvent;
}
LogEventInfo WithCurrency(this LogEventInfo theEvent, string currency)
{
theEvent.Properties["Currency"] = currency;
return theEvent;
}
var theEvent = new LogEventInfo(NLog.LogLevel.Debug, "", this.Account.Name).WithStrategy("ABC").WithCurrency("US dollars");
fileTarget.Layout = "${longdate} ${callsite} ${level} ${gdc:item=StrategyId} ${message}";
public class MyClass
{
private static readonly Logger logger = LogManager.GetCurrentClassLogger();
private void ApplyStrategyABC()
{
NLog.GlobalDiagnosticContext.Set("StrategyId","ABC");
//Do some stuff
logger.Debug("Hello from ABC!");
var x = CalculateSomeValue();
logger.Debug("Value = {0}", x);
NLog.GlobalDiagnosticContext.Remove("StrategyId");
}
private void ApplyStrategyDEF()
{
NLog.GlobalDiagnosticContext.Set("StrategyId","DEF");
//Do some stuff
logger.Debug("Hello from DEF");
var x = CalculateSomeValue();
logger.Debug("Value = {0}", x);
NLog.GlobalDiagnosticContext.Remove("StrategyId");
}
}
In you program call your two strategies:
var myClass = new MyClass();
myClass.ApplyStrategyABC();
myClass.ApplyStrategyDEF();
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);
}
}
private void ApplyStrategyDEF()
{
using (new ScopedGlobalContext("StrategyId", "DEF"))
{
//Do some stuff
logger.Debug("Hello from DEF");
var x = CalculateSomeValue();
logger.Debug("Value = {0}", x);
}
}
您的布局如下所示:
LogEventInfo theEvent = new LogEventInfo(NLog.LogLevel.Debug, "", this.Account.Name);
theEvent.Properties["StrategyId"] = "Sim101";
Logger.Log(theEvent);
fileTarget.Layout = "${longdate} ${callsite} ${level} ${event-context:item=StrategyId} ${message}";
fileTarget.Layout = "${longdate} ${callsite} ${level} ${gdc:item=StrategyId} ${message}";
var theEvent = new LogEventInfo(NLog.LogLevel.Debug, "", this.Account.Name).WithProperty("StrategyId", "ABC");
LogEventInfo WithStrategy(this LogEventInfo theEvent, string strategy)
{
theEvent.Properties["StrategyId"] = strategy;
return theEvent;
}
LogEventInfo WithCurrency(this LogEventInfo theEvent, string currency)
{
theEvent.Properties["Currency"] = currency;
return theEvent;
}
var theEvent = new LogEventInfo(NLog.LogLevel.Debug, "", this.Account.Name).WithStrategy("ABC").WithCurrency("US dollars");
fileTarget.Layout = "${longdate} ${callsite} ${level} ${gdc:item=StrategyId} ${message}";
public class MyClass
{
private static readonly Logger logger = LogManager.GetCurrentClassLogger();
private void ApplyStrategyABC()
{
NLog.GlobalDiagnosticContext.Set("StrategyId","ABC");
//Do some stuff
logger.Debug("Hello from ABC!");
var x = CalculateSomeValue();
logger.Debug("Value = {0}", x);
NLog.GlobalDiagnosticContext.Remove("StrategyId");
}
private void ApplyStrategyDEF()
{
NLog.GlobalDiagnosticContext.Set("StrategyId","DEF");
//Do some stuff
logger.Debug("Hello from DEF");
var x = CalculateSomeValue();
logger.Debug("Value = {0}", x);
NLog.GlobalDiagnosticContext.Remove("StrategyId");
}
}
In you program call your two strategies:
var myClass = new MyClass();
myClass.ApplyStrategyABC();
myClass.ApplyStrategyDEF();
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);
}
}
private void ApplyStrategyDEF()
{
using (new ScopedGlobalContext("StrategyId", "DEF"))
{
//Do some stuff
logger.Debug("Hello from DEF");
var x = CalculateSomeValue();
logger.Debug("Value = {0}", x);
}
}
如果希望日志调用站点不那么冗长,可以使用GlobalDiagnosticContext或MappedDiagnosticContext
private void ApplyStrategyABC()
{
NLog.GlobalDiagnosticContext.Set("StrategyId","ABC");
//Do some stuff
LogEventInfo theEvent = new LogEventInfo(NLog.LogLevel.Debug, "", this.Account.Name);
Logger.Log(theEvent);
NLog.GlobalDiagnosticContext.Remove("StrategyId");
}
private void ApplyStrategyDEF()
{
NLog.GlobalDiagnosticContext.Set("StrategyId","DEF");
//Do some stuff
LogEventInfo theEvent = new LogEventInfo(NLog.LogLevel.Debug, "", this.Account.Name);
Logger.Log(theEvent);
NLog.GlobalDiagnosticContext.Remove("StrategyId");
}
使用如下布局:
LogEventInfo theEvent = new LogEventInfo(NLog.LogLevel.Debug, "", this.Account.Name);
theEvent.Properties["StrategyId"] = "Sim101";
Logger.Log(theEvent);
fileTarget.Layout = "${longdate} ${callsite} ${level} ${event-context:item=StrategyId} ${message}";
fileTarget.Layout = "${longdate} ${callsite} ${level} ${gdc:item=StrategyId} ${message}";
var theEvent = new LogEventInfo(NLog.LogLevel.Debug, "", this.Account.Name).WithProperty("StrategyId", "ABC");
LogEventInfo WithStrategy(this LogEventInfo theEvent, string strategy)
{
theEvent.Properties["StrategyId"] = strategy;
return theEvent;
}
LogEventInfo WithCurrency(this LogEventInfo theEvent, string currency)
{
theEvent.Properties["Currency"] = currency;
return theEvent;
}
var theEvent = new LogEventInfo(NLog.LogLevel.Debug, "", this.Account.Name).WithStrategy("ABC").WithCurrency("US dollars");
fileTarget.Layout = "${longdate} ${callsite} ${level} ${gdc:item=StrategyId} ${message}";
public class MyClass
{
private static readonly Logger logger = LogManager.GetCurrentClassLogger();
private void ApplyStrategyABC()
{
NLog.GlobalDiagnosticContext.Set("StrategyId","ABC");
//Do some stuff
logger.Debug("Hello from ABC!");
var x = CalculateSomeValue();
logger.Debug("Value = {0}", x);
NLog.GlobalDiagnosticContext.Remove("StrategyId");
}
private void ApplyStrategyDEF()
{
NLog.GlobalDiagnosticContext.Set("StrategyId","DEF");
//Do some stuff
logger.Debug("Hello from DEF");
var x = CalculateSomeValue();
logger.Debug("Value = {0}", x);
NLog.GlobalDiagnosticContext.Remove("StrategyId");
}
}
In you program call your two strategies:
var myClass = new MyClass();
myClass.ApplyStrategyABC();
myClass.ApplyStrategyDEF();
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);
}
}
private void ApplyStrategyDEF()
{
using (new ScopedGlobalContext("StrategyId", "DEF"))
{
//Do some stuff
logger.Debug("Hello from DEF");
var x = CalculateSomeValue();
logger.Debug("Value = {0}", x);
}
}
将使用全局字典中的当前值“StrategyId”标记每个日志消息
为了好玩,您还可以创建一种fluent API扩展方法,将您的属性应用于您创建的LogEventInfo对象。类似这样(未经测试):
然后您可以这样使用它:
LogEventInfo theEvent = new LogEventInfo(NLog.LogLevel.Debug, "", this.Account.Name);
theEvent.Properties["StrategyId"] = "Sim101";
Logger.Log(theEvent);
fileTarget.Layout = "${longdate} ${callsite} ${level} ${event-context:item=StrategyId} ${message}";
fileTarget.Layout = "${longdate} ${callsite} ${level} ${gdc:item=StrategyId} ${message}";
var theEvent = new LogEventInfo(NLog.LogLevel.Debug, "", this.Account.Name).WithProperty("StrategyId", "ABC");
LogEventInfo WithStrategy(this LogEventInfo theEvent, string strategy)
{
theEvent.Properties["StrategyId"] = strategy;
return theEvent;
}
LogEventInfo WithCurrency(this LogEventInfo theEvent, string currency)
{
theEvent.Properties["Currency"] = currency;
return theEvent;
}
var theEvent = new LogEventInfo(NLog.LogLevel.Debug, "", this.Account.Name).WithStrategy("ABC").WithCurrency("US dollars");
fileTarget.Layout = "${longdate} ${callsite} ${level} ${gdc:item=StrategyId} ${message}";
public class MyClass
{
private static readonly Logger logger = LogManager.GetCurrentClassLogger();
private void ApplyStrategyABC()
{
NLog.GlobalDiagnosticContext.Set("StrategyId","ABC");
//Do some stuff
logger.Debug("Hello from ABC!");
var x = CalculateSomeValue();
logger.Debug("Value = {0}", x);
NLog.GlobalDiagnosticContext.Remove("StrategyId");
}
private void ApplyStrategyDEF()
{
NLog.GlobalDiagnosticContext.Set("StrategyId","DEF");
//Do some stuff
logger.Debug("Hello from DEF");
var x = CalculateSomeValue();
logger.Debug("Value = {0}", x);
NLog.GlobalDiagnosticContext.Remove("StrategyId");
}
}
In you program call your two strategies:
var myClass = new MyClass();
myClass.ApplyStrategyABC();
myClass.ApplyStrategyDEF();
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);
}
}
private void ApplyStrategyDEF()
{
using (new ScopedGlobalContext("StrategyId", "DEF"))
{
//Do some stuff
logger.Debug("Hello from DEF");
var x = CalculateSomeValue();
logger.Debug("Value = {0}", x);
}
}
这是:
var theEvent = new LogEventInfo(NLog.LogLevel.Debug, "", this.Account.Name).WithProperty("StrategyId", "ABC").WithProperty("SomethingElse", someLocalVariable);
如果您希望更明确(并减少可能的打字错误),可以使用以下更具体的扩展方法:
LogEventInfo theEvent = new LogEventInfo(NLog.LogLevel.Debug, "", this.Account.Name);
theEvent.Properties["StrategyId"] = "Sim101";
Logger.Log(theEvent);
fileTarget.Layout = "${longdate} ${callsite} ${level} ${event-context:item=StrategyId} ${message}";
fileTarget.Layout = "${longdate} ${callsite} ${level} ${gdc:item=StrategyId} ${message}";
var theEvent = new LogEventInfo(NLog.LogLevel.Debug, "", this.Account.Name).WithProperty("StrategyId", "ABC");
LogEventInfo WithStrategy(this LogEventInfo theEvent, string strategy)
{
theEvent.Properties["StrategyId"] = strategy;
return theEvent;
}
LogEventInfo WithCurrency(this LogEventInfo theEvent, string currency)
{
theEvent.Properties["Currency"] = currency;
return theEvent;
}
var theEvent = new LogEventInfo(NLog.LogLevel.Debug, "", this.Account.Name).WithStrategy("ABC").WithCurrency("US dollars");
fileTarget.Layout = "${longdate} ${callsite} ${level} ${gdc:item=StrategyId} ${message}";
public class MyClass
{
private static readonly Logger logger = LogManager.GetCurrentClassLogger();
private void ApplyStrategyABC()
{
NLog.GlobalDiagnosticContext.Set("StrategyId","ABC");
//Do some stuff
logger.Debug("Hello from ABC!");
var x = CalculateSomeValue();
logger.Debug("Value = {0}", x);
NLog.GlobalDiagnosticContext.Remove("StrategyId");
}
private void ApplyStrategyDEF()
{
NLog.GlobalDiagnosticContext.Set("StrategyId","DEF");
//Do some stuff
logger.Debug("Hello from DEF");
var x = CalculateSomeValue();
logger.Debug("Value = {0}", x);
NLog.GlobalDiagnosticContext.Remove("StrategyId");
}
}
In you program call your two strategies:
var myClass = new MyClass();
myClass.ApplyStrategyABC();
myClass.ApplyStrategyDEF();
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);
}
}
private void ApplyStrategyDEF()
{
using (new ScopedGlobalContext("StrategyId", "DEF"))
{
//Do some stuff
logger.Debug("Hello from DEF");
var x = CalculateSomeValue();
logger.Debug("Value = {0}", x);
}
}
编辑:
大多数人使用Logger.Info
、Logger.Debug
、Logger.Trace
等方法来编写日志消息,而不是创建LogEventInfo
并为每条消息调用日志。如果显式创建LogEventInfo
对象,可能会有更大的灵活性,但这也会使工作更加复杂
如果您想使用Logger.Info
、Logger.Debug
等方法,并用其他属性装饰每个日志消息,您仍然可以这样做
假设您有两种方法(如上所述)来应用两种不同的策略:ABC和DEF:
使用如下布局:
LogEventInfo theEvent = new LogEventInfo(NLog.LogLevel.Debug, "", this.Account.Name);
theEvent.Properties["StrategyId"] = "Sim101";
Logger.Log(theEvent);
fileTarget.Layout = "${longdate} ${callsite} ${level} ${event-context:item=StrategyId} ${message}";
fileTarget.Layout = "${longdate} ${callsite} ${level} ${gdc:item=StrategyId} ${message}";
var theEvent = new LogEventInfo(NLog.LogLevel.Debug, "", this.Account.Name).WithProperty("StrategyId", "ABC");
LogEventInfo WithStrategy(this LogEventInfo theEvent, string strategy)
{
theEvent.Properties["StrategyId"] = strategy;
return theEvent;
}
LogEventInfo WithCurrency(this LogEventInfo theEvent, string currency)
{
theEvent.Properties["Currency"] = currency;
return theEvent;
}
var theEvent = new LogEventInfo(NLog.LogLevel.Debug, "", this.Account.Name).WithStrategy("ABC").WithCurrency("US dollars");
fileTarget.Layout = "${longdate} ${callsite} ${level} ${gdc:item=StrategyId} ${message}";
public class MyClass
{
private static readonly Logger logger = LogManager.GetCurrentClassLogger();
private void ApplyStrategyABC()
{
NLog.GlobalDiagnosticContext.Set("StrategyId","ABC");
//Do some stuff
logger.Debug("Hello from ABC!");
var x = CalculateSomeValue();
logger.Debug("Value = {0}", x);
NLog.GlobalDiagnosticContext.Remove("StrategyId");
}
private void ApplyStrategyDEF()
{
NLog.GlobalDiagnosticContext.Set("StrategyId","DEF");
//Do some stuff
logger.Debug("Hello from DEF");
var x = CalculateSomeValue();
logger.Debug("Value = {0}", x);
NLog.GlobalDiagnosticContext.Remove("StrategyId");
}
}
In you program call your two strategies:
var myClass = new MyClass();
myClass.ApplyStrategyABC();
myClass.ApplyStrategyDEF();
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);
}
}
private void ApplyStrategyDEF()
{
using (new ScopedGlobalContext("StrategyId", "DEF"))
{
//Do some stuff
logger.Debug("Hello from DEF");
var x = CalculateSomeValue();
logger.Debug("Value = {0}", x);
}
}
在每种情况下,记录的消息都将被标记为在相应函数内设置的“StrategyId”
如果您确实希望创建并使用LogEventInfo对象来创建消息,那么您必须意识到一个LogEventInfo对象实例的属性仅适用于该实例。如果创建LogEventInfo,设置其属性,记录它,然后使用Logger.Info、Logger.Debug等记录消息,则将看不到在原始LogEventInfo上设置的属性
比如说,
var logger = LogManager.GetCurrentClassLogger();
var theEvent = new LogEventInfo(NLog.LogLevel.Debug, "", "Hello 1");
theEvent.Properties["StrategyId"] = "ABC";
//This message will be tagged with StrategyId = ABC if the layout uses the event-context LayoutRenderer
logger.Log(theEvent);
//This message will NOT be tagged with StrategyId = ABC because that value was only added to the LogEventInfo
//object that was created above. Another way to think about this is that internally
//NLog creates a LogEventInfo for each message that is logged via the Debug, Trace, etc
//methods.
logger.Debug("Hello 2");
我建议使用Logger.Info
、Logger.Debug
、Logger.Trace
等方法记录消息,并使用GlobalDiagnosticsContext
或MappedDiagnosticsContext
指定要包含在每个日志消息中的其他信息
通常,我认为我还建议您使用Logger.Info
、Logger.Debug
、Logger.Trace
方法或LogEventInfo
+Logger.Log
,但不能同时使用这两种方法。使用这两种方法,尤其是当您试图添加额外的上下文值(StrategyId)时,可能会令人困惑
我可以类比安装软件。通常,当您在计算机上安装软件时,您可以选择在“典型”安装中让安装程序安装它想要安装的组件,或者在“自定义”中选择您想要安装的组件。我不知道你的情况,但我通常选择“典型”安装。使用Logger.Info
,Logger.Debug
,Logger.Trace
与“典型”安装类似。这些是最常用的日志记录方法。使用LogEventInfo
+Logger.Log
更像是选择“自定义”安装。如果您使用的是LogEventInfo
,这意味着“典型”的日志记录方法不能满足您的需要
当您使用NLog时,您将更加熟悉它的工作原理,其中一些问题将变得更加明显
请注意,GlobalDiagnosticsContext
确实是全局的。它是一个静态对象。因此,如果您是多线程的,那么如果两个线程试图向字典添加具有相同名称的值,则可能会发生冲突
MappedDiagnosticsContext
是线程本地的(它使用线程静态字典存储其值),因此最好在多线程环境中使用
如果您想对GlobalDiagnosticsContext(或MappedDiagnosticsContext)中的值进行调整并自动确定范围,可以创建如下类:
LogEventInfo theEvent = new LogEventInfo(NLog.LogLevel.Debug, "", this.Account.Name);
theEvent.Properties["StrategyId"] = "Sim101";
Logger.Log(theEvent);
fileTarget.Layout = "${longdate} ${callsite} ${level} ${event-context:item=StrategyId} ${message}";
fileTarget.Layout = "${longdate} ${callsite} ${level} ${gdc:item=StrategyId} ${message}";
var theEvent = new LogEventInfo(NLog.LogLevel.Debug, "", this.Account.Name).WithProperty("StrategyId", "ABC");
LogEventInfo WithStrategy(this LogEventInfo theEvent, string strategy)
{
theEvent.Properties["StrategyId"] = strategy;
return theEvent;
}
LogEventInfo WithCurrency(this LogEventInfo theEvent, string currency)
{
theEvent.Properties["Currency"] = currency;
return theEvent;
}
var theEvent = new LogEventInfo(NLog.LogLevel.Debug, "", this.Account.Name).WithStrategy("ABC").WithCurrency("US dollars");
fileTarget.Layout = "${longdate} ${callsite} ${level} ${gdc:item=StrategyId} ${message}";
public class MyClass
{
private static readonly Logger logger = LogManager.GetCurrentClassLogger();
private void ApplyStrategyABC()
{
NLog.GlobalDiagnosticContext.Set("StrategyId","ABC");
//Do some stuff
logger.Debug("Hello from ABC!");
var x = CalculateSomeValue();
logger.Debug("Value = {0}", x);
NLog.GlobalDiagnosticContext.Remove("StrategyId");
}
private void ApplyStrategyDEF()
{
NLog.GlobalDiagnosticContext.Set("StrategyId","DEF");
//Do some stuff
logger.Debug("Hello from DEF");
var x = CalculateSomeValue();
logger.Debug("Value = {0}", x);
NLog.GlobalDiagnosticContext.Remove("StrategyId");
}
}
In you program call your two strategies:
var myClass = new MyClass();
myClass.ApplyStrategyABC();
myClass.ApplyStrategyDEF();
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);
}
}
private void ApplyStrategyDEF()
{
using (new ScopedGlobalContext("StrategyId", "DEF"))
{
//Do some stuff
logger.Debug("Hello from DEF");
var x = CalculateSomeValue();
logger.Debug("Value = {0}", x);
}
}
你可以这样使用它:
LogEventInfo theEvent = new LogEventInfo(NLog.LogLevel.Debug, "", this.Account.Name);
theEvent.Properties["StrategyId"] = "Sim101";
Logger.Log(theEvent);
fileTarget.Layout = "${longdate} ${callsite} ${level} ${event-context:item=StrategyId} ${message}";
fileTarget.Layout = "${longdate} ${callsite} ${level} ${gdc:item=StrategyId} ${message}";
var theEvent = new LogEventInfo(NLog.LogLevel.Debug, "", this.Account.Name).WithProperty("StrategyId", "ABC");
LogEventInfo WithStrategy(this LogEventInfo theEvent, string strategy)
{
theEvent.Properties["StrategyId"] = strategy;
return theEvent;
}
LogEventInfo WithCurrency(this LogEventInfo theEvent, string currency)
{
theEvent.Properties["Currency"] = currency;
return theEvent;
}
var theEvent = new LogEventInfo(NLog.LogLevel.Debug, "", this.Account.Name).WithStrategy("ABC").WithCurrency("US dollars");
fileTarget.Layout = "${longdate} ${callsite} ${level} ${gdc:item=StrategyId} ${message}";
public class MyClass
{
private static readonly Logger logger = LogManager.GetCurrentClassLogger();
private void ApplyStrategyABC()
{
NLog.GlobalDiagnosticContext.Set("StrategyId","ABC");
//Do some stuff
logger.Debug("Hello from ABC!");
var x = CalculateSomeValue();
logger.Debug("Value = {0}", x);
NLog.GlobalDiagnosticContext.Remove("StrategyId");
}
private void ApplyStrategyDEF()
{
NLog.GlobalDiagnosticContext.Set("StrategyId","DEF");
//Do some stuff
logger.Debug("Hello from DEF");
var x = CalculateSomeValue();
logger.Debug("Value = {0}", x);
NLog.GlobalDiagnosticContext.Remove("StrategyId");
}
}
In you program call your two strategies:
var myClass = new MyClass();
myClass.ApplyStrategyABC();
myClass.ApplyStrategyDEF();
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);
}
}
private void ApplyStrategyDEF()
{
using (new ScopedGlobalContext("StrategyId", "DEF"))
{
//Do some stuff
logger.Debug("Hello from DEF");
var x = CalculateSomeValue();
logger.Debug("Value = {0}", x);
}
}
当using
作用域开始时,这将把StrategyId、DEF name-value对放入GlobalDiagnosticsContext
字典,并在using
作用域退出时将其删除。这是我的全部问题:每次调用跟踪函数之前是否必须添加事件?当我添加事件属性并执行logger.info(theEvent)时,它会立即打印日志的后缀。例如2012-11-28 14:18:52.3277 NinjaTrader.Strategy.LODHOD.OnStartUp Info Log事件:Logger=''Level=Info Message='d4d0d3849c2440f5b41de65d744ede61'SequenceID=270,但是下一个Logger.Info没有捕获我的属性2012-11-28 14:18:52.9996 NinjaTrader.Strategy.LODHOD.OnBar更新信息栏更新我使用的代码在这里。你不必告诉我们