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



我有一个配置了NLog.NET Core应用程序。这是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>

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

Regex regex = new Regex(@"sApplication Runnings([-]+?)s");
using (StreamReader reader = new StreamReader(@"C:pathtomylog_file.log"))
{
...
}

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

您可以从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());

最新更新