当应用程序为默认处理程序时,将日志文件写入错误的目录

本文关键字:文件 错误 日志 默认 应用程序 处理 程序 | 更新日期: 2023-09-27 18:09:49

我遇到了一个奇怪的问题,我想知道这是配置还是错误。我在网上找不到任何东西,所以问题来了。我的问题是如何写入可执行目录而不是启动目录。

复制步骤:

  1. 创建一个带有日志记录的应用程序(C:'Program Files'FooBar'FooBar.exe)
  2. 将此应用程序设置为特定文件类型(*.bar)的默认处理程序
  3. 双击特定文件类型(C:'Desktop'foo.bar)的a文件启动应用程序
  4. 日志文件将被写入文件所在的目录,而不是执行目录。(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的文件夹,您的应用程序正在从该文件夹执行(假设它具有写权限)。