从 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\="${exception:format=tostring}"}" />
<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\="${exception:format=tostring}"}"
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());
我有一个 .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\="${exception:format=tostring}"}" />
<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\="${exception:format=tostring}"}"
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());