当应用程序是默认处理程序时,NLog将日志文件写入不正确的目录

时间:2015-08-25 14:41:49

标签: c# windows nlog

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

重现的步骤:

  1. 使用日志记录(C:\Program Files\FooBar\FooBar.exe
  2. 创建应用程序
  3. 使此应用程序成为特定文件类型(*.bar
  4. 的默认处理程序
  5. 双击特定文件类型的文件(C:\Desktop\foo.bar
  6. 启动应用程序
  7. 日志文件将写入文件的目录,而不是执行目录。 (C:\Desktop\log.txt代替C:\Program Files\FooBar\log.txt。)
  8. 我做错了吗?当我首先启动应用程序然后加载文件时,日志记录发生在正确的目录中。我的代码和配置非常简单:

    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使用启动文件的文件而不是可执行文件本身将日志写入目录。

1 个答案:

答案 0 :(得分:2)

它将写入它所在的位置,因为它是应用程序的当前工作目录

要解决此问题,请在目标文件名中使用${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 的文件夹中(假设它具有写入权限)。