在 FileTarget 的 NLog 配置文件中使用相对路径
Use a relative path in an NLog configuration file for a FileTarget
我将 NLog 与 PowerShell 脚本一起使用,其中消息被记录到与脚本相关的目录中的文件中。
我希望能够在 Xml 配置文件中指定一个相对路径,但是这个语法不起作用:
<target name="logfile" xsi:type="File" fileName="./Logs/${logger}/${logger}.${date:format=yyyyMMdd}.${date:format=HHmmss}.log" createDirs="true" layout="${machinename}|${environment-user}|${logger}|${date:format=yyyy-MM-dd HH\:mm\:ss}|${level:uppercase=true}|${message}"/>
目前,我正在这样做:
$ScriptName = (Get-Item $PSCommandPath).Basename
$Here = Split-Path -Parent $MyInvocation.MyCommand.Path
# create logger
$Logger = [NLog.LogManager]::GetLogger($ScriptName)
# load Xml configuration file (in the same directory as script)
$Configuration = [NLog.Config.XmlLoggingConfiguration]::new("$Here/$ScriptName.NLog.config")
[NLog.LogManager]::Configuration = $Configuration
# reconfigure the file target
$target = $Configuration.FindTargetByName("logfile")
$target.FileName = "$Here/Logs/$ScriptName/$ScriptName.$( (get-date).tostring('yyyyMMdd.HHmmss') ).log"
[NLog.LogManager]::ReconfigExistingLoggers()
有没有办法在Xml配置文件中使用相对路径?
默认情况下,NLog FileTarget 将使用 AppDomain.BaseDirectory
作为“root”,所有相对路径都是相对于这个“root”的。
我想对于 PowerShell 脚本,AppDomain.BaseDirectory 将是 PowerShell 可执行目录,而不是预期的当前目录。
我认为您将通过使用 ${currentdir}:
获得预期的目录
<target name="logfile" xsi:type="File" fileName="${currentdir:cached=true}/Logs/${logger}/${logger}.${date:format=yyyyMMdd}.${date:format=HHmmss}.log" />
或者,您可以直接写入 ConsoleTarget,然后使用默认的命令提示符逻辑将 powershell-stdout 的输出通过管道传输到所需的文件名。
您可以使用 NLog-Config-Variables 的替代方法:
<nlog>
<variable name="ScriptDirectory" value="${currentdir}" />
<targets>
<target name="logfile" xsi:type="File" fileName="${var:ScriptDirectory}/Logs/${logger}/${logger}.${date:format=yyyyMMdd}.${date:format=HHmmss}.log" />
</targets>
<rules>
<logger name="*" minLevel="Debug" writeTo="logfile" />
</rules>
</nlog>
然后只需分配
NLog.LogManager.Configuration.Variables["ScriptDirectory"] = absolutePath;
然后您将不需要调整当前目录,这可能会产生不需要的副作用。
我将 NLog 与 PowerShell 脚本一起使用,其中消息被记录到与脚本相关的目录中的文件中。
我希望能够在 Xml 配置文件中指定一个相对路径,但是这个语法不起作用:
<target name="logfile" xsi:type="File" fileName="./Logs/${logger}/${logger}.${date:format=yyyyMMdd}.${date:format=HHmmss}.log" createDirs="true" layout="${machinename}|${environment-user}|${logger}|${date:format=yyyy-MM-dd HH\:mm\:ss}|${level:uppercase=true}|${message}"/>
目前,我正在这样做:
$ScriptName = (Get-Item $PSCommandPath).Basename
$Here = Split-Path -Parent $MyInvocation.MyCommand.Path
# create logger
$Logger = [NLog.LogManager]::GetLogger($ScriptName)
# load Xml configuration file (in the same directory as script)
$Configuration = [NLog.Config.XmlLoggingConfiguration]::new("$Here/$ScriptName.NLog.config")
[NLog.LogManager]::Configuration = $Configuration
# reconfigure the file target
$target = $Configuration.FindTargetByName("logfile")
$target.FileName = "$Here/Logs/$ScriptName/$ScriptName.$( (get-date).tostring('yyyyMMdd.HHmmss') ).log"
[NLog.LogManager]::ReconfigExistingLoggers()
有没有办法在Xml配置文件中使用相对路径?
默认情况下,NLog FileTarget 将使用 AppDomain.BaseDirectory
作为“root”,所有相对路径都是相对于这个“root”的。
我想对于 PowerShell 脚本,AppDomain.BaseDirectory 将是 PowerShell 可执行目录,而不是预期的当前目录。
我认为您将通过使用 ${currentdir}:
获得预期的目录<target name="logfile" xsi:type="File" fileName="${currentdir:cached=true}/Logs/${logger}/${logger}.${date:format=yyyyMMdd}.${date:format=HHmmss}.log" />
或者,您可以直接写入 ConsoleTarget,然后使用默认的命令提示符逻辑将 powershell-stdout 的输出通过管道传输到所需的文件名。
您可以使用 NLog-Config-Variables 的替代方法:
<nlog>
<variable name="ScriptDirectory" value="${currentdir}" />
<targets>
<target name="logfile" xsi:type="File" fileName="${var:ScriptDirectory}/Logs/${logger}/${logger}.${date:format=yyyyMMdd}.${date:format=HHmmss}.log" />
</targets>
<rules>
<logger name="*" minLevel="Debug" writeTo="logfile" />
</rules>
</nlog>
然后只需分配
NLog.LogManager.Configuration.Variables["ScriptDirectory"] = absolutePath;
然后您将不需要调整当前目录,这可能会产生不需要的副作用。