Nlog 日志位置被代码覆盖,仍在配置位置记录



NLog 版本 - 4.4.3

平台 - .Net 4.5.2

当前 NLog 配置 -

<nlog autoReload="true" xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<variable name="layout" value="${longdate}|${level:uppercase=true}|${threadid}|${logger}|${message}" />
<variable name="logLocation" value="logs" />
<targets async="true">
<target name="debugger" xsi:type="Debugger" layout="${layout}" />
<target name="console" xsi:type="Console" layout="${layout}" />
<target name="logfile" 
xsi:type="File" 
fileName="${logLocation}${processname}.log" 
archiveFileName="${logLocation}\${processname}.{###}.log" 
archiveEvery="Day" 
archiveAboveSize="2048000" 
archiveNumbering="Rolling" 
maxArchiveFiles="10" 
concurrentWrites="false" 
keepFileOpen="false" 
layout="${layout}" />
</targets>
<rules>
<logger name="*" minlevel="Info" writeTo="logfile" />
<logger name="*" minlevel="Debug" writeTo="debugger" />
<logger name="*" minlevel="Info" writeTo="console" />
</rules>
</nlog>

用于替代位置的代码

LogManager.ReconfigExistingLoggers();
var target = (FileTarget)LogManager.Configuration.FindTargetByName<AsyncTargetWrapper>("logfile").WrappedTarget;
target.FileName = $@"........logsFoobar.log";
  • 目前的结果是什么?
    当应用程序/服务启动时,它会写入覆盖的位置,但有时(不确定场景 -可能是翻转(它开始写入配置位置。

  • 预期结果是什么?
    日志应始终写入覆盖位置。

  • 您是否检查了内部日志?

  • 请发布完整的异常详细信息(消息、堆栈跟踪、内部异常(
    无异常

  • 是否有任何解决方法? 是/否
    重新启动服务/应用程序。

  • 是否有它确实有效的版本?
    不知道。这是我们开始并坚持的版本。

  • 你能通过编写单元测试来帮助我们吗?
    单元测试无济于事,因为它是间歇性方案。

您启用了自动重新加载(<nlog autoReload="true”(,因此如果它需要重新加载(在睡眠或更改配置后(,您将丢失在代码中所做的更改。

解决方案是禁用自动重新加载,或在再次重新加载后设置更改。请参阅代码示例:

static void Main(string[] args)
{
UpdateNLogConfig();
LogManager.ConfigurationReloaded += LogManager_ConfigurationReloaded;
log.Info("Entering Application.");
Console.WriteLine("Press any key to exit ...");
Console.Read();
}

private static void LogManager_ConfigurationReloaded(object sender, LoggingConfigurationReloadedEventArgs e)
{
UpdateNLogConfig();
}
private static void UpdateNLogConfig()
{
//note: don't set  LogManager.Configuration because that will overwrite the nlog.config settings
var target = (FileTarget)LogManager.Configuration.FindTargetByName<AsyncTargetWrapper>("logfile").WrappedTarget;
target.FileName = $@"........logsFoobar.log";   
LogManager.ReconfigExistingLoggers();
}

另请参阅将 XML 配置与 C# 配置相结合 ·NLog/NLog Wiki

而不是执行目标查找,并直接修改目标属性。然后我建议使用 NLog 布局逻辑。

<nlog autoReload="true" xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<targets async="true">
<target name="logfile" 
xsi:type="File" 
fileName="${gdc:item=logFile:whenEmpty=log/${processname}.log}" />
</targets>
<rules>
<logger name="*" minlevel="Info" writeTo="logfile" />
</rules>
</nlog>

然后只需分配日志位置:

NLog.GlobalDiagnosticsContext.Set("logFile", $@"........logsFoobar.log");

使用 GDC 也可以很好地与autoReload=true配合使用,无需调用LogManager.ReconfigExistingLoggers().

相关内容

  • 没有找到相关文章

最新更新