NLog:在运行时从模板

时间:2018-10-11 13:54:22

标签: c# nlog nlog.config

我正在尝试在运行时基于另一个目标生成目标和记录器。假设我有一个功能性的Foo记录器:我想为Foo.1Foo.2等生成单独的规则,但是我不知道最后一个记录器是什么我必须创建(因此,我无法以声明方式定义它们)。

到目前为止,我做了这样的事情:

public GetNewClonedLogger(int fooId)
{
    var config = NLog.LogManager.Configuration;
    var newFooName = $"Foo.{fooId}";
    FileTarget baseTarget = NLog.LogManager.Configuration.FindTargetByName<FileTarget>("Foo");

    // Copy the base target
    var newTarget = new FileTarget(newFooName)
    {
        Layout = baseTarget.Layout,
        CreateDirs = true,
        FileName = baseTarget .FileName.ToString().Replace("${var:filename}", newFooName),
        ArchiveAboveSize = baseTarget.ArchiveAboveSize,
        BufferSize = baseTarget.BufferSize,
        ArchiveFileName = baseTarget.ArchiveFileName,
        MaxArchiveFiles = baseTarget.MaxArchiveFiles,
        ArchiveDateFormat = baseTarget.ArchiveDateFormat,
        ArchiveEvery = baseTarget.ArchiveEvery,
        FileAttributes = baseTarget.FileAttributes,
        KeepFileOpen = baseTarget.KeepFileOpen,
        ArchiveNumbering = baseTarget.ArchiveNumbering,
    };

    // Add configs & flush
    NLog.LogManager.Configuration.AddTarget(newTarget);
    NLog.LogManager.Configuration.AddRuleForAllLevels(newTarget, newFooName);

    // I tried every combinations of the following, without success
    NLog.LogManager.ReconfigExistingLoggers();
    NLog.LogManager.Configuration = config;
    NLog.LogManager.Configuration.Reload();

    NLog.LogManager.GetLogger(newFooName);
}

此函数返回一个记录器,该记录器似乎在所有方面都正常:目标名称正确,文件名正确,NLog.LogManager.Configuration具有正确名称的新规则(Foo.1,{{ 1}},...),Foo.2也是如此。但是,当我使用返回的记录器进行记录时,没有创建任何文件,这简直就像根本没有任何反应。...

我尝试了this thread中提出的解决方案,但没有成功。...我缺少什么?

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

实际上,这是一个非常愚蠢的错误,因为这可能按我预期的那样工作。问题在于baseTarget.FileNameLayout对象,使用.ToString()的字符串化通过在输出('C:\...'上加引号引起了不好的转换。因此,NLog引发了一些错误,这些错误已被NLog配置部分消除,并且无论如何还是很难理解的。我通过检查baseTarget.FileName是否为SimpleLayout(我必须处理的唯一类)来修复它,然后从该布局中检索OriginalText。然后,它就像魅力一样。