NLog:如何在一种配置下添加 2 个不同的数据库目标和规则?
NLog: How to add 2 different database targets and rules under one configuration?
我一直在研究如何以编程方式添加多个数据库目标。我只需要 2 个,但我似乎无法弄清楚如何让它们工作。
我只能让 1 个目标和记录器工作。例如,下面的 2 个代码块有效:
我的配置代码(1个目标):
var config = new LoggingConfiguration();
// Add another NLog Target (ChangeTracking)
var changeTrackingDbTarget = new DatabaseTarget()
{
Name = "ChangeTracking",
ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["NLogConnection"].ConnectionString,
CommandText = "INSERT INTO Common.ChangeTracking (ApplicationID, UserName, EntityName, PropertyName, PrimaryKeyValue, OldValue, NewValue, DateChanged) " +
"VALUES (@ApplicationID, @UserName, @EntityName, @PropertyName, @PrimaryKeyValue, @OldValue, @NewValue, @DateChanged);"
};
changeTrackingDbTarget.Parameters.Add(new DatabaseParameterInfo() { Name = "@ApplicationID", Layout = "${appsetting:name=AppID:default=null}" });
changeTrackingDbTarget.Parameters.Add(new DatabaseParameterInfo() { Name = "@UserName", Layout = "${identity:authType=false:isAuthenticated=false}" });
changeTrackingDbTarget.Parameters.Add(new DatabaseParameterInfo() { Name = "@EntityName", Layout = "${event-properties:item=ENTITYNAME}" });
changeTrackingDbTarget.Parameters.Add(new DatabaseParameterInfo() { Name = "@PropertyName", Layout = "${event-properties:item=PROPNAME}" });
changeTrackingDbTarget.Parameters.Add(new DatabaseParameterInfo() { Name = "@PrimaryKeyValue", Layout = "${event-properties:item=PRIMARYKEY}" });
changeTrackingDbTarget.Parameters.Add(new DatabaseParameterInfo() { Name = "@OldValue", Layout = "${event-properties:item=OLDVALUE}" });
changeTrackingDbTarget.Parameters.Add(new DatabaseParameterInfo() { Name = "@NewValue", Layout = "${event-properties:item=NEWVALUE}" });
changeTrackingDbTarget.Parameters.Add(new DatabaseParameterInfo() { Name = "@DateChanged", Layout = "${date}" });
config.LoggingRules.Add(new LoggingRule("*", LogLevel.Info, changeTrackingDbTarget));
//LogManager.Configuration.AddTarget("ExceptionTracking", dbTarget);
LogManager.Configuration = config;
我调用日志的代码(1 个目标):
private static Logger _logger = LogManager.GetLogger("ChangeTracking");
LogEventInfo changeEvent = new LogEventInfo(LogLevel.Info, "ChangeTracking", "A change event has been fired");
changeEvent.Properties["ENTITYNAME"] = entityName;
changeEvent.Properties["PROPNAME"] = prop;
changeEvent.Properties["PRIMARYKEY"] = primaryKey;
changeEvent.Properties["OLDVALUE"] = originalValueString;
changeEvent.Properties["NEWVALUE"] = currentValueString;
_logger.Log(changeEvent);
我的配置代码(2个目标):
// Setup NLOG Database Target for Exception Tracking
LogManager.ThrowExceptions = true;
var dbTargetExceptions = new DatabaseTarget()
{
Name = "ExceptionTracking",
ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["NLogConnection"].ConnectionString,
CommandText = "INSERT INTO Common.ExceptionTracking ( ApplicationID, Url, IP, Referrer, UserName, ExceptionDescription, Action, Controller, InsertedBy, InsertedDate) " +
"VALUES (@ApplicationID, @Url, @IP, @Referrer, @UserName, @ExceptionDescription, @Action, @Controller, @InsertedBy, @InsertedDate);"
};
dbTargetExceptions.Parameters.Add(new DatabaseParameterInfo() { Name = "@ApplicationID", Layout = "${appsetting:name=AppID:default=null}" });
dbTargetExceptions.Parameters.Add(new DatabaseParameterInfo() { Name = "@Url", Layout = "${aspnet-Request-Url}" });
dbTargetExceptions.Parameters.Add(new DatabaseParameterInfo() { Name = "@IP", Layout = "${aspnet-Request-IP}" });
dbTargetExceptions.Parameters.Add(new DatabaseParameterInfo() { Name = "@Referrer", Layout = "${aspnet-Request-Referrer}" });
dbTargetExceptions.Parameters.Add(new DatabaseParameterInfo() { Name = "@UserName", Layout = "${identity:authType=false:isAuthenticated=false}" });
dbTargetExceptions.Parameters.Add(new DatabaseParameterInfo() { Name = "@ExceptionDescription", Layout = "${exception:tostring}" });
dbTargetExceptions.Parameters.Add(new DatabaseParameterInfo() { Name = "@Action", Layout = "${aspnet-MVC-Action}" });
dbTargetExceptions.Parameters.Add(new DatabaseParameterInfo() { Name = "@Controller", Layout = "${aspnet-MVC-Controller}" });
dbTargetExceptions.Parameters.Add(new DatabaseParameterInfo() { Name = "@InsertedBy", Layout = "${gdc:BEMSID}" });
dbTargetExceptions.Parameters.Add(new DatabaseParameterInfo() { Name = "@InsertedDate", Layout = "${date}" });
// Setup NLOG Database Target for Change Tracking
var changeTrackingDbTarget = new DatabaseTarget()
{
Name = "ChangeTracking",
ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["NLogConnection"].ConnectionString,
CommandText = "INSERT INTO Common.ChangeTracking (ApplicationID, UserName, EntityName, PropertyName, PrimaryKeyValue, OldValue, NewValue, DateChanged) " +
"VALUES (@ApplicationID, @UserName, @EntityName, @PropertyName, @PrimaryKeyValue, @OldValue, @NewValue, @DateChanged);"
};
changeTrackingDbTarget.Parameters.Add(new DatabaseParameterInfo() { Name = "@ApplicationID", Layout = "${appsetting:name=AppID:default=null}" });
changeTrackingDbTarget.Parameters.Add(new DatabaseParameterInfo() { Name = "@UserName", Layout = "${identity:authType=false:isAuthenticated=false}" });
changeTrackingDbTarget.Parameters.Add(new DatabaseParameterInfo() { Name = "@EntityName", Layout = "${event-properties:item=ENTITYNAME}" });
changeTrackingDbTarget.Parameters.Add(new DatabaseParameterInfo() { Name = "@PropertyName", Layout = "${event-properties:item=PROPNAME}" });
changeTrackingDbTarget.Parameters.Add(new DatabaseParameterInfo() { Name = "@PrimaryKeyValue", Layout = "${event-properties:item=PRIMARYKEY}" });
changeTrackingDbTarget.Parameters.Add(new DatabaseParameterInfo() { Name = "@OldValue", Layout = "${event-properties:item=OLDVALUE}" });
changeTrackingDbTarget.Parameters.Add(new DatabaseParameterInfo() { Name = "@NewValue", Layout = "${event-properties:item=NEWVALUE}" });
changeTrackingDbTarget.Parameters.Add(new DatabaseParameterInfo() { Name = "@DateChanged", Layout = "${date}" });
//Setup NLOG Configuration. Adding DB Targets and Rules for Targets
LoggingConfiguration nLogConfig = new LoggingConfiguration();
nLogConfig.AddTarget("ExceptionTracking", dbTargetExceptions);
nLogConfig.AddTarget("ChangeTracking", dbTargetChanges);
nLogConfig.LoggingRules.Add(new LoggingRule("ChangeLogger", LogLevel.Info, dbTargetChanges));
nLogConfig.LoggingRules.Add(new LoggingRule("*", LogLevel.Trace, dbTargetExceptions));
//Finally set the configuration above to the LogManager config property
LogManager.Configuration = nLogConfig;
我调用日志的代码(2 个目标):
private static Logger _logger = LogManager.GetLogger("ChangeTracking");
LogEventInfo changeEvent = new LogEventInfo(LogLevel.Info, "ChangeTracking", "A change event has been fired");
changeEvent.Properties["ENTITYNAME"] = entityName;
changeEvent.Properties["PROPNAME"] = prop;
changeEvent.Properties["PRIMARYKEY"] = primaryKey;
changeEvent.Properties["OLDVALUE"] = originalValueString;
changeEvent.Properties["NEWVALUE"] = currentValueString;
_logger.Log(changeEvent);
您的配置正确。 AddTarget 并不是真正必需的,因为您将 Target 传递给规则并且 Target 具有相同的名称 属性。所以这应该足够了:
LoggingConfiguration nLogConfig = new LoggingConfiguration();
nLogConfig.LoggingRules.Add(new LoggingRule("ChangeLogger", LogLevel.Info, dbTargetChanges));
nLogConfig.LoggingRules.Add(new LoggingRule("*", LogLevel.Trace, dbTargetExceptions));
//Finally set the configuration above to the LogManager config property
LogManager.Configuration = nLogConfig;
我个人更喜欢 LoggingConfiguration
上的 AddRule
。这和上面一样,但是AddRule
-style:
LoggingConfiguration nLogConfig = new LoggingConfiguration();
nLogConfig.AddRule(LogLevel.Info, LogLevel.Fatal, dbTargetChanges, "ChangeLogger");
nLogConfig.AddRule(LogLevel.Trace, LogLevel.Fatal, dbTargetExceptions);
//Finally set the configuration above to the LogManager config property
LogManager.Configuration = nLogConfig;
如果这在您的更改中不起作用,enable and check the internal log 在跟踪级别。
and the other I want to call by default everywhere else
请注意,规则是从上到下处理的,只有在您添加 "final"(或不匹配的条件)时才会停止。
因此对于上述配置,写入 "ChangeLogger" 将写入 两个 目标。我不确定这是否是您所需要的。如果不是那么:
或在第一条规则中添加Final = true
// Old style
nLogConfig.LoggingRules.Add(new LoggingRule("ChangeLogger", LogLevel.Info, dbTargetChanges){Final = true});
nLogConfig.LoggingRules.Add(new LoggingRule("*", LogLevel.Trace, dbTargetExceptions));
// Or AddRule style:
nLogConfig.AddRule(LogLevel.Info, LogLevel.Fatal, dbTargetChanges, "ChangeLogger", true);
nLogConfig.AddRule(LogLevel.Trace, LogLevel.Fatal, dbTargetExceptions);
或在第二条规则中添加condition/filter。
更新后
我认为你的问题出在这里,它将目标添加到名称 "ExceptionTracking" 下,而规则是 "ChangeTracking"。我认为这是在测试时启用的:
//LogManager.Configuration.AddTarget("ExceptionTracking", dbTarget);
我添加了一些评论以使事情更清楚:
var changeTrackingDbTarget = new DatabaseTarget()
{
Name = "ChangeTracking",
...
};
...
// add rule to target with name ChangeTracking
config.LoggingRules.Add(new LoggingRule("*", LogLevel.Info, changeTrackingDbTarget));
// register target not under ChangeTracking, but under ExceptionTracking
LogManager.Configuration.AddTarget("ExceptionTracking", dbTarget);
LogManager.Configuration = config;
我一直在研究如何以编程方式添加多个数据库目标。我只需要 2 个,但我似乎无法弄清楚如何让它们工作。
我只能让 1 个目标和记录器工作。例如,下面的 2 个代码块有效:
我的配置代码(1个目标):
var config = new LoggingConfiguration();
// Add another NLog Target (ChangeTracking)
var changeTrackingDbTarget = new DatabaseTarget()
{
Name = "ChangeTracking",
ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["NLogConnection"].ConnectionString,
CommandText = "INSERT INTO Common.ChangeTracking (ApplicationID, UserName, EntityName, PropertyName, PrimaryKeyValue, OldValue, NewValue, DateChanged) " +
"VALUES (@ApplicationID, @UserName, @EntityName, @PropertyName, @PrimaryKeyValue, @OldValue, @NewValue, @DateChanged);"
};
changeTrackingDbTarget.Parameters.Add(new DatabaseParameterInfo() { Name = "@ApplicationID", Layout = "${appsetting:name=AppID:default=null}" });
changeTrackingDbTarget.Parameters.Add(new DatabaseParameterInfo() { Name = "@UserName", Layout = "${identity:authType=false:isAuthenticated=false}" });
changeTrackingDbTarget.Parameters.Add(new DatabaseParameterInfo() { Name = "@EntityName", Layout = "${event-properties:item=ENTITYNAME}" });
changeTrackingDbTarget.Parameters.Add(new DatabaseParameterInfo() { Name = "@PropertyName", Layout = "${event-properties:item=PROPNAME}" });
changeTrackingDbTarget.Parameters.Add(new DatabaseParameterInfo() { Name = "@PrimaryKeyValue", Layout = "${event-properties:item=PRIMARYKEY}" });
changeTrackingDbTarget.Parameters.Add(new DatabaseParameterInfo() { Name = "@OldValue", Layout = "${event-properties:item=OLDVALUE}" });
changeTrackingDbTarget.Parameters.Add(new DatabaseParameterInfo() { Name = "@NewValue", Layout = "${event-properties:item=NEWVALUE}" });
changeTrackingDbTarget.Parameters.Add(new DatabaseParameterInfo() { Name = "@DateChanged", Layout = "${date}" });
config.LoggingRules.Add(new LoggingRule("*", LogLevel.Info, changeTrackingDbTarget));
//LogManager.Configuration.AddTarget("ExceptionTracking", dbTarget);
LogManager.Configuration = config;
我调用日志的代码(1 个目标):
private static Logger _logger = LogManager.GetLogger("ChangeTracking");
LogEventInfo changeEvent = new LogEventInfo(LogLevel.Info, "ChangeTracking", "A change event has been fired");
changeEvent.Properties["ENTITYNAME"] = entityName;
changeEvent.Properties["PROPNAME"] = prop;
changeEvent.Properties["PRIMARYKEY"] = primaryKey;
changeEvent.Properties["OLDVALUE"] = originalValueString;
changeEvent.Properties["NEWVALUE"] = currentValueString;
_logger.Log(changeEvent);
我的配置代码(2个目标):
// Setup NLOG Database Target for Exception Tracking
LogManager.ThrowExceptions = true;
var dbTargetExceptions = new DatabaseTarget()
{
Name = "ExceptionTracking",
ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["NLogConnection"].ConnectionString,
CommandText = "INSERT INTO Common.ExceptionTracking ( ApplicationID, Url, IP, Referrer, UserName, ExceptionDescription, Action, Controller, InsertedBy, InsertedDate) " +
"VALUES (@ApplicationID, @Url, @IP, @Referrer, @UserName, @ExceptionDescription, @Action, @Controller, @InsertedBy, @InsertedDate);"
};
dbTargetExceptions.Parameters.Add(new DatabaseParameterInfo() { Name = "@ApplicationID", Layout = "${appsetting:name=AppID:default=null}" });
dbTargetExceptions.Parameters.Add(new DatabaseParameterInfo() { Name = "@Url", Layout = "${aspnet-Request-Url}" });
dbTargetExceptions.Parameters.Add(new DatabaseParameterInfo() { Name = "@IP", Layout = "${aspnet-Request-IP}" });
dbTargetExceptions.Parameters.Add(new DatabaseParameterInfo() { Name = "@Referrer", Layout = "${aspnet-Request-Referrer}" });
dbTargetExceptions.Parameters.Add(new DatabaseParameterInfo() { Name = "@UserName", Layout = "${identity:authType=false:isAuthenticated=false}" });
dbTargetExceptions.Parameters.Add(new DatabaseParameterInfo() { Name = "@ExceptionDescription", Layout = "${exception:tostring}" });
dbTargetExceptions.Parameters.Add(new DatabaseParameterInfo() { Name = "@Action", Layout = "${aspnet-MVC-Action}" });
dbTargetExceptions.Parameters.Add(new DatabaseParameterInfo() { Name = "@Controller", Layout = "${aspnet-MVC-Controller}" });
dbTargetExceptions.Parameters.Add(new DatabaseParameterInfo() { Name = "@InsertedBy", Layout = "${gdc:BEMSID}" });
dbTargetExceptions.Parameters.Add(new DatabaseParameterInfo() { Name = "@InsertedDate", Layout = "${date}" });
// Setup NLOG Database Target for Change Tracking
var changeTrackingDbTarget = new DatabaseTarget()
{
Name = "ChangeTracking",
ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["NLogConnection"].ConnectionString,
CommandText = "INSERT INTO Common.ChangeTracking (ApplicationID, UserName, EntityName, PropertyName, PrimaryKeyValue, OldValue, NewValue, DateChanged) " +
"VALUES (@ApplicationID, @UserName, @EntityName, @PropertyName, @PrimaryKeyValue, @OldValue, @NewValue, @DateChanged);"
};
changeTrackingDbTarget.Parameters.Add(new DatabaseParameterInfo() { Name = "@ApplicationID", Layout = "${appsetting:name=AppID:default=null}" });
changeTrackingDbTarget.Parameters.Add(new DatabaseParameterInfo() { Name = "@UserName", Layout = "${identity:authType=false:isAuthenticated=false}" });
changeTrackingDbTarget.Parameters.Add(new DatabaseParameterInfo() { Name = "@EntityName", Layout = "${event-properties:item=ENTITYNAME}" });
changeTrackingDbTarget.Parameters.Add(new DatabaseParameterInfo() { Name = "@PropertyName", Layout = "${event-properties:item=PROPNAME}" });
changeTrackingDbTarget.Parameters.Add(new DatabaseParameterInfo() { Name = "@PrimaryKeyValue", Layout = "${event-properties:item=PRIMARYKEY}" });
changeTrackingDbTarget.Parameters.Add(new DatabaseParameterInfo() { Name = "@OldValue", Layout = "${event-properties:item=OLDVALUE}" });
changeTrackingDbTarget.Parameters.Add(new DatabaseParameterInfo() { Name = "@NewValue", Layout = "${event-properties:item=NEWVALUE}" });
changeTrackingDbTarget.Parameters.Add(new DatabaseParameterInfo() { Name = "@DateChanged", Layout = "${date}" });
//Setup NLOG Configuration. Adding DB Targets and Rules for Targets
LoggingConfiguration nLogConfig = new LoggingConfiguration();
nLogConfig.AddTarget("ExceptionTracking", dbTargetExceptions);
nLogConfig.AddTarget("ChangeTracking", dbTargetChanges);
nLogConfig.LoggingRules.Add(new LoggingRule("ChangeLogger", LogLevel.Info, dbTargetChanges));
nLogConfig.LoggingRules.Add(new LoggingRule("*", LogLevel.Trace, dbTargetExceptions));
//Finally set the configuration above to the LogManager config property
LogManager.Configuration = nLogConfig;
我调用日志的代码(2 个目标):
private static Logger _logger = LogManager.GetLogger("ChangeTracking");
LogEventInfo changeEvent = new LogEventInfo(LogLevel.Info, "ChangeTracking", "A change event has been fired");
changeEvent.Properties["ENTITYNAME"] = entityName;
changeEvent.Properties["PROPNAME"] = prop;
changeEvent.Properties["PRIMARYKEY"] = primaryKey;
changeEvent.Properties["OLDVALUE"] = originalValueString;
changeEvent.Properties["NEWVALUE"] = currentValueString;
_logger.Log(changeEvent);
您的配置正确。 AddTarget 并不是真正必需的,因为您将 Target 传递给规则并且 Target 具有相同的名称 属性。所以这应该足够了:
LoggingConfiguration nLogConfig = new LoggingConfiguration();
nLogConfig.LoggingRules.Add(new LoggingRule("ChangeLogger", LogLevel.Info, dbTargetChanges));
nLogConfig.LoggingRules.Add(new LoggingRule("*", LogLevel.Trace, dbTargetExceptions));
//Finally set the configuration above to the LogManager config property
LogManager.Configuration = nLogConfig;
我个人更喜欢 LoggingConfiguration
上的 AddRule
。这和上面一样,但是AddRule
-style:
LoggingConfiguration nLogConfig = new LoggingConfiguration();
nLogConfig.AddRule(LogLevel.Info, LogLevel.Fatal, dbTargetChanges, "ChangeLogger");
nLogConfig.AddRule(LogLevel.Trace, LogLevel.Fatal, dbTargetExceptions);
//Finally set the configuration above to the LogManager config property
LogManager.Configuration = nLogConfig;
如果这在您的更改中不起作用,enable and check the internal log 在跟踪级别。
and the other I want to call by default everywhere else
请注意,规则是从上到下处理的,只有在您添加 "final"(或不匹配的条件)时才会停止。
因此对于上述配置,写入 "ChangeLogger" 将写入 两个 目标。我不确定这是否是您所需要的。如果不是那么:
或在第一条规则中添加
Final = true
// Old style nLogConfig.LoggingRules.Add(new LoggingRule("ChangeLogger", LogLevel.Info, dbTargetChanges){Final = true}); nLogConfig.LoggingRules.Add(new LoggingRule("*", LogLevel.Trace, dbTargetExceptions)); // Or AddRule style: nLogConfig.AddRule(LogLevel.Info, LogLevel.Fatal, dbTargetChanges, "ChangeLogger", true); nLogConfig.AddRule(LogLevel.Trace, LogLevel.Fatal, dbTargetExceptions);
或在第二条规则中添加condition/filter。
更新后
我认为你的问题出在这里,它将目标添加到名称 "ExceptionTracking" 下,而规则是 "ChangeTracking"。我认为这是在测试时启用的:
//LogManager.Configuration.AddTarget("ExceptionTracking", dbTarget);
我添加了一些评论以使事情更清楚:
var changeTrackingDbTarget = new DatabaseTarget()
{
Name = "ChangeTracking",
...
};
...
// add rule to target with name ChangeTracking
config.LoggingRules.Add(new LoggingRule("*", LogLevel.Info, changeTrackingDbTarget));
// register target not under ChangeTracking, but under ExceptionTracking
LogManager.Configuration.AddTarget("ExceptionTracking", dbTarget);
LogManager.Configuration = config;