当应用程序是默认处理程序时,NLog 将日志文件写入不正确的目录
NLog Writing Log File to Incorrect Directory when Application Is Default Handler
我遇到了一个奇怪的问题,我想知道它是配置问题还是错误。我在网上找不到任何东西,所以这就是问题所在。我的问题是如何写入可执行目录而不是启动目录。
重现步骤:
- 创建带日志记录的应用程序(
C:\Program Files\FooBar\FooBar.exe
)
- 使该应用程序成为特定文件类型的默认处理程序(
*.bar
)
- 双击特定文件类型的文件启动应用程序 (
C:\Desktop\foo.bar
)
- 日志文件将写入文件目录,而不是执行目录。 (
C:\Desktop\log.txt
而不是 C:\Program Files\FooBar\log.txt
。)
我是不是做错了什么?当我首先启动应用程序然后加载文件时,日志记录发生在正确的目录中。我的代码和配置非常简单:
public partial class Form1 : Form {
private static Logger logger = LogManager.GetCurrentClassLogger();
public Form1() {
InitializeComponent();
MessageBox.Show("Continue");
}
}
和配置:
<?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"
xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
autoReload="true"
throwExceptions="false"
internalLogLevel="Off" internalLogFile="c:\temp\nlog-internal.log" >
<targets>
<target name="logfile" xsi:type="File" fileName="FooBar.txt" />
</targets>
<rules>
<logger name="*" minlevel="Info" writeTo="logfile" />
</rules>
</nlog>
我已经安装了一个调试器来查看 Assembly.GetExecutingAssmebly()
所在的位置并且它位于正确的位置 (C:\Program Files\FooBar\foobar.exe
)。所以我不确定为什么 NLog 将日志写入包含启动文件的目录而不是可执行目录本身。
它会写入它所在的位置,因为那是应用程序的当前工作目录。
要解决此问题,请在目标文件名中使用类似 ${basedir}
的内容,例如:
<target
xsi:type="File"
name="File"
fileName="${basedir}/logs/${shortdate}.log"
layout="${level:uppercase=true} ${longdate} ${message} ${exception:format=ToString}"
encoding="utf-8"
/>
这会将日志输出到名为 logs 的文件夹,您的应用程序将从该文件夹执行(假设它具有写入权限)。
我遇到了一个奇怪的问题,我想知道它是配置问题还是错误。我在网上找不到任何东西,所以这就是问题所在。我的问题是如何写入可执行目录而不是启动目录。
重现步骤:
- 创建带日志记录的应用程序(
C:\Program Files\FooBar\FooBar.exe
) - 使该应用程序成为特定文件类型的默认处理程序(
*.bar
) - 双击特定文件类型的文件启动应用程序 (
C:\Desktop\foo.bar
) - 日志文件将写入文件目录,而不是执行目录。 (
C:\Desktop\log.txt
而不是C:\Program Files\FooBar\log.txt
。)
我是不是做错了什么?当我首先启动应用程序然后加载文件时,日志记录发生在正确的目录中。我的代码和配置非常简单:
public partial class Form1 : Form {
private static Logger logger = LogManager.GetCurrentClassLogger();
public Form1() {
InitializeComponent();
MessageBox.Show("Continue");
}
}
和配置:
<?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"
xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
autoReload="true"
throwExceptions="false"
internalLogLevel="Off" internalLogFile="c:\temp\nlog-internal.log" >
<targets>
<target name="logfile" xsi:type="File" fileName="FooBar.txt" />
</targets>
<rules>
<logger name="*" minlevel="Info" writeTo="logfile" />
</rules>
</nlog>
我已经安装了一个调试器来查看 Assembly.GetExecutingAssmebly()
所在的位置并且它位于正确的位置 (C:\Program Files\FooBar\foobar.exe
)。所以我不确定为什么 NLog 将日志写入包含启动文件的目录而不是可执行目录本身。
它会写入它所在的位置,因为那是应用程序的当前工作目录。
要解决此问题,请在目标文件名中使用类似 ${basedir}
的内容,例如:
<target
xsi:type="File"
name="File"
fileName="${basedir}/logs/${shortdate}.log"
layout="${level:uppercase=true} ${longdate} ${message} ${exception:format=ToString}"
encoding="utf-8"
/>
这会将日志输出到名为 logs 的文件夹,您的应用程序将从该文件夹执行(假设它具有写入权限)。