使用NLog v4.4.12,我在App.config中有这个
<nlog>
<include file="..\Common\Logs\Variables.xml" />
<rules>
<logger name="*" minlevel="${logLevel}" writeTo="LogFile, Wcf"/>
</rules>
</nlog>
这是我的Variables.xml文件内容
<?xml version="1.0" encoding="utf-8"?>
<nlog autoReload="true">
<variable name="logLevel" value="Fatal" />
</nlog>
但是在启动我的应用时出现了异常
Unknown log level: ${logLevel}
我做错了什么或者只是不可能?
这样做的目的是最终为每个需要记录事物的项目提供一个xml文件,这样每个项目都可以拥有自己的最小级别,并且能够在运行时通过此xml的版本对其进行更改。
编辑:在抛出异常之前添加此代码会显示我的变量是否具有所需的值。
var nl = NLog.LogManager.Configuration;
if (nl != null)
{
if (nl.Variables.ContainsKey("logLevel"))
{
Console.WriteLine(nl.Variables["logLevel"]);
}
}
答案 0 :(得分:3)
很遗憾,您无法在${...}
属性(如minLevel,level等)中使用布局渲染器(<logger>
)
有两种选择:
<logger name="*" writeTo="LogFile, Wcf">
<filters>
<when condition="(level < ${logLevel})" action="Ignore"/>
</filters>
</logger>
缺点:
var rule = config.LoggingRules[0];
// disable old levels, enable new
rule.DisableLoggingForLevel(LogLevel.Debug);
rule.DisableLoggingForLevel(LogLevel.Trace);
rule.EnableLoggingForLevels(LogLevel.Info, LogLevel.Fatal);
//apply config
LogManager.Configuration = config;
答案 1 :(得分:1)
我将变量作为Service Fabric应用程序的一部分存储在配置文件中,该变量会因环境而异,并希望这些变量覆盖Nlog.config文件中的值。 对于上述用户,当我希望为日志级别设置最低级别时,我遇到了同样的问题。我创建了一个变量来从配置文件中检索值,而不是对代码中的级别进行硬编码,就像原始用户所做的那样:
var config = context.CodePackageActivationContext.GetConfigurationPackageObject("Config");
ILoggerFactory logger = new LoggerFactory().AddNLog();
var nlogConfigSection = config.Settings.Sections["MyService_NlogSettings"];
我使用GlobalDiagnosticsContext设置了可以设置的变量,例如连接字符串等,但是由于不喜欢变量,因此显然无法以这种方式设置日志级别!
因此,我做了以下事情:
LogManager.Configuration.LoggingRules[0].SetLoggingLevels((NLog.LogLevel.FromString(nlogConfigSection.Parameters["AzureNLogLevel"].Value)),
NLog.LogLevel.FromString("Fatal"));
“ SetloggingLevels”方法需要记录日志的Minlevel和MaxLevel值,因此我的Config值为min,并且由于复制了“ minLevel”类型的日志记录,所以我将“致命”值硬编码为最大值,尽管显然也可以在我的配置文件中设置。