从 NLog 配置而不是硬编码获取日志文件

Get log file from NLog configuration instead of hardcoding

我有一个 .NET Core 应用程序配置了 NLog。这是NLog.config:

的内容
<?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" autoReload="false" internalLogLevel="Error" internalLogToConsole="true" internalLogIncludeTimestamp="true" keepVariablesOnReload="true">
    <extensions>
        <add assembly="NLog.Web.AspNetCore"/>
    </extensions>
    <variable name="appId" value="" />
    <variable name="componentId" value="" />
    <variable name="file-target-path" value="" />
    <variable name="file-target-name" value="" />
    <targets>
        <target xsi:type="Console" name="console-target" layout="${date:universalTime=true:format=yyyy-MM-dd HH\:mm\:ss.fff}Z ${uppercase:${level}} APP=${var:appId} COMP=${var:componentId} [${when:when='${threadname}'=='':inner=${threadid}:else=${threadname}}] ${message} - Logger=${logger},Level=${uppercase:${level}},ThreadId=${threadid},${onexception:,Exception\=&quot;${exception:format=tostring}&quot;}" />
        <target xsi:type="File" name="file-target"
                layout="${date:universalTime=true:format=yyyy-MM-dd HH\:mm\:ss.fff}Z ${uppercase:${level}} APP=${var:appId} COMP=${var:componentId} [${when:when='${threadname}'=='':inner=${threadid}:else=${threadname}}] ${message} - Logger=${logger},Level=${uppercase:${level}},ThreadId=${threadid},${onexception:,Exception\=&quot;${exception:format=tostring}&quot;}"
                fileName="${basedir}/${var:file-target-path}/${var:file-target-name}.log"
                archiveFileName="${basedir}/${var:file-target-path}/${var:file-target-name}.{###}.txt"
                archiveEvery="Day"
                archiveNumbering="DateAndSequence"
                archiveAboveSize="5242880"
                archiveDateFormat="yyyyMMdd"
                maxArchiveDays="31" />
    </targets>
    <rules>
        <logger name="*" minLevel="Trace" writeTo="console-target" />
        <logger name="*" minLevel="Trace" writeTo="file-target" />
    </rules>
</nlog>

我现在正在编写一个 class 来解析日志中的 Regex 值 \sApplication Running\s([\-]+?)\s。我目前在 StreamReader 中硬编码了日志文件路径,如下所示:

Regex regex = new Regex(@"\sApplication Running\s([\-]+?)\s");

            using (StreamReader reader = new StreamReader(@"C:\path\to\my\log_file.log"))
            {
                ...
            }

我如何更新它以便从日志记录配置中获取日志文件而不是在我的 class 中对其进行硬编码?

您可以从 LogManager.Configuration.

检索日志文件位置
var nlogFileTarget = LogManager.Configuration.AllTargets.OfType<FileTarget>().First();
var dummyEventInfo = new LogEventInfo { TimeStamp = DateTime.UtcNow };
var logFilePath = nlogFileTarget.FileName.Render(dummyEventInfo);

类似的解决方案:

<nlog>
    <variable name="file-target-path" value="" />
    <variable name="file-target-name" value="" />
    <variable name="file-target-filename" value="${basedir}/${var:file-target-path}/${var:file-target-name}.log"" />

    <targets>
        <target xsi:type="File" name="file-target" fileName="${file-target-filename}" />
    </targets>
    <rules>
        <logger name="*" minLevel="Trace" writeTo="file-target" />
    </rules>
</nlog>

然后你可以这样做:

var filetargetPath = NLog.LogManager.Configuration?.Variables["file-target-filename"]?.Render(LogEventInfo.CreateNullEvent());