【问题标题】:log4net log file not being written when the app is deployed部署应用程序时未写入 log4net 日志文件
【发布时间】:2016-11-03 15:07:41
【问题描述】:

我有一个使用 log4net 的 WPF 应用程序。当我在 Visual Studio 中运行它时,会按预期在 Debug 或 Release 文件夹中创建日志文件。

但是,当我创建安装程序并运行已安装的应用程序时,不会创建日志文件。我在代码中添加了以下几行...

  string logFilePath = ((Hierarchy)LogManager.GetRepository())
                 .Root.Appenders.OfType<FileAppender>()
                 .FirstOrDefault()?.File;
  using (StreamWriter sw = new StreamWriter(@"d:\log.log")) {
    sw.WriteLine("Log file: " + logFilePath);
  }

...使我能够检查日志文件是否正在写入我预期的位置。它告诉我日志文件应该被写入C:\Program Files (x86)\Physio Diary\PhysioDiaryClient.log,这是我所期望的。

但是,该文件不存在。知道为什么吗?

这里是 App.config 文件的顶部...

<?xml version="1.0"
      encoding="utf-8"?>

<configuration>
  <configSections>
    <section name="log4net"
             type="log4net.Config.Log4NetConfigurationSectionHandler,Log4net" />
  </configSections>

  <log4net>
    <appender name="RollingFileAppender"
              type="log4net.Appender.RollingFileAppender">
      <param name="File"
             value="PhysioDiaryClient.log" />
      <appendToFile value="true" />
      <rollingStyle value="Size" />
      <maxSizeRollBackups value="2" />
      <maximumFileSize value="1MB" />
      <staticLogFileName value="true" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-7level %logger - %message%newline%exception" />
      </layout>
    </appender>
    <root>
      <level value="DEBUG" />
      <appender-ref ref="RollingFileAppender" />
    </root>
  </log4net>

文件底部是这样的……

  <startup>
    <supportedRuntime version="v4.0"
                      sku=".NETFramework,Version=v4.5.2" />
  </startup>

</configuration>

中间的部分都与应用使用的 WCF 服务有关。

有人有什么想法吗?

编辑:作为测试,我尝试将 App.config 中的日志文件路径硬编码到我的 D: 驱动器(因此它是硬编码的,并且没有权限问题),但该文件仍未创建。

【问题讨论】:

  • 您不应将 %ProgramFiles% 目录配置为日志记录目标,因为一般来说不允许应用程序写入该目录。
  • @dymanoid 理想情况下,我想将日志文件写入用户本地文件夹中的客户文件夹。知道我会怎么做吗?但不确定这是否是答案,因为即使我硬编码了我绝对拥有权限的 D: 驱动器的路径,也没有写入文件。仍然值得先修复位置,看看是否有帮助。谢谢

标签: wpf log4net


【解决方案1】:

感谢@dymanoid 为我指明了正确的方向。 log4net 文档在这方面有点薄弱,但我发现this answer 指出您可以在配置文件中使用普通的环境变量。

借助这个list of environment variables,我最终得到了以下...

  <param name="File"
         value="${LOCALAPPDATA}\Physio Diary\PhysioDiaryClient.log" />

这会正确地将文件写入C:\Users\MyUsername\AppData\Local\Physio Diary\PhysioDiaryClient.log

希望这对某人有所帮助。

【讨论】:

    猜你喜欢
    • 2016-05-08
    • 2012-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多