假设我有两个记录器A, B
,它们像这样写入文件目标A, B, E
:
<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<targets async="true">
<target name="A" xsi:type="File" fileName="${basepath}\A.log" archiveFileName="${basepath}\A.{##}.log" />
<target name="B" xsi:type="File" fileName="${basepath}\B.log" archiveFileName="${basepath}\B{##}.log" />
<target name="E" xsi:type="File" fileName="${basepath}\E.log" archiveFileName="${basepath}\E{##}.log" />
</targets>
<rules>
<logger name="A" minlevel="Debug" writeTo="A"/>
<logger name="B" minlevel="Debug" writeTo="B"/>
<logger name="*" minlevel="Error" writeTo="E"/>
</rules>
</nlog>
现在,我需要在程序运行时的某个时间范围内,不仅使用${basepath}
,还使用${InterimPath}
。时间窗口过去后,它应仅继续写入${basepath}
。一个人如何做到这一点?
我目前能想到的唯一复杂的解决方案是以编程方式进行
有多种方法可以使其正常工作。我认为您的解决方案会起作用。我个人将选择以下解决方案之一:
这是一个非常简单的解决方案。使用GlobalDiagnosticsContext。
将项目设置为初始值:
GlobalDiagnosticsContext.Set("myPath", basePath1);
[如果需要,例如在计时器上或单击按钮时,请更改基本路径
GlobalDiagnosticsContext.Set("myPath", basePath2);
在配置中:fileName="${gdc:myPath}\E.log"
更加自动化,创建一个返回不同路径的自定义布局渲染器
using NLog.LayoutRenderers;
LayoutRenderer.Register("myPath", () =>
{
if (DateTime.Now.Hour > 16 && DateTime.Now.Hour < 18)
{
return myTempPath;
}
return myRegularPath;
});
在配置中:fileName="${myPath}\E.log"
您也可以不使用任何代码来执行此操作,但是配置会变得很复杂,并且在以很高的负载记录时可能会对性能产生影响。
<logger name="A" writeTo="A">
<filters defaultAction="Ignore">
<when condition="${date:format=h} > 16" action="Log" />
</filters>
</logger>
<logger name="A" writeTo="A-interim">
<filters defaultAction="Log">
<when condition="${date:format=h} >= 16" action="Ignore" />
</filters>
</logger>