如何将所有nlog文件目标指向附加的临时路径?

问题描述 投票:1回答:1

假设我有两个记录器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}。一个人如何做到这一点?

我目前能想到的唯一复杂的解决方案是以编程方式进行

  1. 遍历所有文件目标,并基于这些文件目标添加新目标,并使用更改后的名称,FileName和ArchiveFileName属性指向新路径。
  2. 重复所有规则并添加带有writeTo的新规则,以更新为新的目标名称。
  3. 稍后再删除这些目标和规则。
c# nlog
1个回答
0
投票

有多种方法可以使其正常工作。我认为您的解决方案会起作用。我个人将选择以下解决方案之一:

GDC方法

这是一个非常简单的解决方案。使用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"

无代码方式

您也可以不使用任何代码来执行此操作,但是配置会变得很复杂,并且在以很高的负载记录时可能会对性能产生影响。

  • 使用基本路径和interimPath复制目标
  • 使用配置中的条件,每个目标有2条规则,如下所示:
     <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>
    
© www.soinside.com 2019 - 2024. All rights reserved.