部署应用程序时未写入 log4net 日志文件
log4net log file not being written when the app is deployed
我有一个使用 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: 驱动器(所以它是硬编码的,并且没有权限问题),但文件仍未创建。
感谢@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
希望这对某人有所帮助。
我有一个使用 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: 驱动器(所以它是硬编码的,并且没有权限问题),但文件仍未创建。
感谢@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
希望这对某人有所帮助。