是否有办法通过变量设置NLog记录器的最低级别?
使用NLog v4.4.12,我的App.config中有这个 下面是我的Variables.xml文件内容 但我在启动我的应用程序时遇到了一个例外是否有办法通过变量设置NLog记录器的最低级别?,nlog,Nlog,使用NLog v4.4.12,我的App.config中有这个 下面是我的Variables.xml文件内容 但我在启动我的应用程序时遇到了一个例外 Unknown log level: ${logLevel} 我是做错了什么还是根本不可能 这样做的目标是最终为每个需要记录事情的项目创建一个xml文件,这样每个项目都可以有自己的minlevel,并能够在运行时通过该xml版本对其进行更改 编辑:在抛出异常之前添加此代码表明我的变量具有所需的值 var nl = NLog.LogManager.
Unknown log level: ${logLevel}
我是做错了什么还是根本不可能
这样做的目标是最终为每个需要记录事情的项目创建一个xml文件,这样每个项目都可以有自己的minlevel,并能够在运行时通过该xml版本对其进行更改
编辑:在抛出异常之前添加此代码表明我的变量具有所需的值
var nl = NLog.LogManager.Configuration;
if (nl != null)
{
if (nl.Variables.ContainsKey("logLevel"))
{
Console.WriteLine(nl.Variables["logLevel"]);
}
}
**最新答案**
NLog版本。4.6增加了对在minLevel中使用NLog配置变量的支持。看
NLog版本。4.6.7通过修改NLog配置变量和调用ReconfigeExistingLogger,增加了对运行时调整minLevel的支持。看
**原始答案**
不幸的是,您不能在minLevel、level等属性中使用布局渲染器${…}
有两种选择:
使用过滤器
缺点:
可读性较差
与minLevel属性相比,对性能的伤害更大
更改代码中的规则
var rule=config.LoggingRules[0];
//禁用旧级别,启用新级别
rule.disableloggingforleveloglevel.Debug;
rule.DisableLoggingForLevelLogLevel.Trace;
rule.enablegloggingforlevelsloglevel.Info,LogLevel.Fatal;
//应用配置
LogManager.Configuration=config;
**最新答案**
NLog版本。4.6增加了对在minLevel中使用NLog配置变量的支持。看
NLog版本。4.6.7通过修改NLog配置变量和调用ReconfigeExistingLogger,增加了对运行时调整minLevel的支持。看
**原始答案**
不幸的是,您不能在minLevel、level等属性中使用布局渲染器${…}
有两种选择:
使用过滤器
缺点:
可读性较差
与minLevel属性相比,对性能的伤害更大
更改代码中的规则
var rule=config.LoggingRules[0];
//禁用旧级别,启用新级别
rule.disableloggingforleveloglevel.Debug;
rule.DisableLoggingForLevelLogLevel.Trace;
rule.enablegloggingforlevelsloglevel.Info,LogLevel.Fatal;
//应用配置
LogManager.Configuration=config;
我将变量作为Service Fabric应用程序的一部分保存在配置文件中,该应用程序因环境而异,并希望这些变量覆盖Nlog.config文件中的值。 正如上面的用户所说,当我希望为loglevel设置最低级别时,我遇到了与loglevel相同的问题。我没有硬编码代码中的级别,而是创建了一个变量从配置文件中检索值,与原始用户所做的相同:
var config = context.CodePackageActivationContext.GetConfigurationPackageObject("Config");
ILoggerFactory logger = new LoggerFactory().AddNLog();
var nlogConfigSection = config.Settings.Sections["MyService_NlogSettings"];
我使用GlobalDiagnosticsContext设置了可以设置的变量,例如连接字符串等,但是显然不能这样设置loglevel,因为它不喜欢变量
因此,我采取了以下措施:
LogManager.Configuration.LoggingRules[0].SetLoggingLevels((NLog.LogLevel.FromString(nlogConfigSection.Parameters["AzureNLogLevel"].Value)),
NLog.LogLevel.FromString("Fatal"));
“SetloggingLevels”方法需要日志记录的Minlevel和MaxLevel的值,因此我的配置值是min,而我硬编码Fatal为max,因为我是在复制“Minlevel”类型日志记录之后,虽然很明显这也可以在我的配置文件中设置 我将变量作为服务结构应用程序的一部分保存在配置文件中,该应用程序因环境而异,并希望这些变量覆盖Nlog.config文件中的值。 正如上面的用户所说,当我希望为loglevel设置最低级别时,我遇到了与loglevel相同的问题。我没有硬编码代码中的级别,而是创建了一个变量从配置文件中检索值,与原始用户所做的相同:
var config = context.CodePackageActivationContext.GetConfigurationPackageObject("Config");
ILoggerFactory logger = new LoggerFactory().AddNLog();
var nlogConfigSection = config.Settings.Sections["MyService_NlogSettings"];
我使用GlobalDiagnosticsContext设置了可以设置的变量,例如连接字符串等,但是显然不能这样设置loglevel,因为它不喜欢变量
因此,我采取了以下措施:
LogManager.Configuration.LoggingRules[0].SetLoggingLevels((NLog.LogLevel.FromString(nlogConfigSection.Parameters["AzureNLogLevel"].Value)),
NLog.LogLevel.FromString("Fatal"));
“SetloggingLevels”方法需要日志记录的Minlevel和MaxLevel的值,因此我的配置值是min,而我硬编码Fatal为max,因为我是在复制“Minlevel”类型日志记录之后,虽然很明显这也可以在我的配置文件中设置 你能试试minlevel=${var:logLevel}吗?在它前面放一个var:。变量可能仅用于布局。可能使用筛选器:已尝试在变量名称前面使用var:。我将在假期后尝试使用筛选器,并将发回。可能重复:您可以尝试minlevel=${var:logLevel}吗?在它前面放一个var:。变量可能仅用于布局。可能使用筛选器:已尝试在变量名称前面使用var:。我将在假期后尝试使用过滤器,并将发回。可能重复:谢谢@Julian!最后,我使用了过滤器方法。我认为在我们的案例中,性能不会是一个很大的问题。有什么理由我们不能在这个特定的案例中使用变量吗?尽管如此,性能
只读变量不会影响performanceThanks@Julian!最后,我使用了过滤器方法。我认为性能在我们的例子中不会是一个很大的问题。有什么理由我们不能在这种特殊情况下使用变量吗?性能,尽管只读变量不会影响性能