Log4Net 不写入输出文件
Log4Net Not Writing to Output File
我在让 log4net 与 Windows 服务(多项目解决方案)一起工作时遇到了严重的问题。
我首先通过 NuGet 将对 log4net.dll 的引用添加到相应的项目中。然后,我在 Windows 服务项目的根文件夹中创建了一个新的 Log4Net.config
文件。在文件的属性中,我设置了 Copy to Output Directory = Copy always
。下面是配置文件:
<?xml version="1.0"?>
<configuration>
<log4net>
<appender name="TestServiceLog" type="log4net.Appender.RollingFileAppender">
<file value="C:\Temp\Test.log" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="100" />
<maximumFileSize value="10MB" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %level %logger - %message%newline" />
</layout>
</appender>
<root>
<level value="INFO" />
<priority value="ALL" />
<appender-ref ref="TestServiceLog" />
</root>
</log4net>
</configuration>
在我的 Windows 服务项目中,在 AssemblyInfo.cs
文件中,我添加了这一行:
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "Log4Net.config", Watch = true)]
在我的主 TestService.cs
class 中,我引用了 log4net 并像这样初始化了记录器(省略了非记录代码):
public partial class TestService : ServiceBase
{
private ILog Log { get; set; }
protected override void OnStart(string[] args)
{
Log = LogManager.GetLogger(this.GetType());
Log.Info("Hear me log.");
}
}
然后我安装了 运行 服务。我验证了服务是 运行 正常,但是没有日志文件是 created/written 到。没有异常被抛出。调试时一切都按顺序出现。我打开了 log4net 的内部调试并得到了这个:
log4net: Creating repository for assembly [TestService, Version=3.6.5570.17497, Culture=neutral, PublicKeyToken=null]
log4net: Assembly [TestService, Version=3.6.5570.17497, Culture=neutral, PublicKeyToken=null] Loaded From [C:\ProgramData\Company\Applications\TestService\TestService\TestService.exe]
log4net: Assembly [TestService, Version=3.6.5570.17497, Culture=neutral, PublicKeyToken=null] does not have a RepositoryAttribute specified.
log4net: Assembly [TestService, Version=3.6.5570.17497, Culture=neutral, PublicKeyToken=null] using repository [log4net-default-repository] and repository type [log4net.Repository.Hierarchy.Hierarchy]
log4net: repository [log4net-default-repository] already exists, using repository type [log4net.Repository.Hierarchy.Hierarchy]
输出似乎没有暗示任何问题。我还尝试将以下行添加到我的配置中,但没有成功:
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" requirePermission="false"/>
我使用完全相同的配置向解决方案添加了一个 WinForms 项目,并且日志记录工作正常,所以我确信这不是我的设置。关于我可能错过的步骤还有其他想法吗?
我能够通过将 Log
变量设为静态并像这样实例化它来让它工作:
private static ILog Log = LogManager.GetLogger(typeof(TestService));
我不太清楚为什么这是必要的。希望其他人知道答案。
我在让 log4net 与 Windows 服务(多项目解决方案)一起工作时遇到了严重的问题。
我首先通过 NuGet 将对 log4net.dll 的引用添加到相应的项目中。然后,我在 Windows 服务项目的根文件夹中创建了一个新的 Log4Net.config
文件。在文件的属性中,我设置了 Copy to Output Directory = Copy always
。下面是配置文件:
<?xml version="1.0"?>
<configuration>
<log4net>
<appender name="TestServiceLog" type="log4net.Appender.RollingFileAppender">
<file value="C:\Temp\Test.log" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="100" />
<maximumFileSize value="10MB" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %level %logger - %message%newline" />
</layout>
</appender>
<root>
<level value="INFO" />
<priority value="ALL" />
<appender-ref ref="TestServiceLog" />
</root>
</log4net>
</configuration>
在我的 Windows 服务项目中,在 AssemblyInfo.cs
文件中,我添加了这一行:
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "Log4Net.config", Watch = true)]
在我的主 TestService.cs
class 中,我引用了 log4net 并像这样初始化了记录器(省略了非记录代码):
public partial class TestService : ServiceBase
{
private ILog Log { get; set; }
protected override void OnStart(string[] args)
{
Log = LogManager.GetLogger(this.GetType());
Log.Info("Hear me log.");
}
}
然后我安装了 运行 服务。我验证了服务是 运行 正常,但是没有日志文件是 created/written 到。没有异常被抛出。调试时一切都按顺序出现。我打开了 log4net 的内部调试并得到了这个:
log4net: Creating repository for assembly [TestService, Version=3.6.5570.17497, Culture=neutral, PublicKeyToken=null]
log4net: Assembly [TestService, Version=3.6.5570.17497, Culture=neutral, PublicKeyToken=null] Loaded From [C:\ProgramData\Company\Applications\TestService\TestService\TestService.exe]
log4net: Assembly [TestService, Version=3.6.5570.17497, Culture=neutral, PublicKeyToken=null] does not have a RepositoryAttribute specified.
log4net: Assembly [TestService, Version=3.6.5570.17497, Culture=neutral, PublicKeyToken=null] using repository [log4net-default-repository] and repository type [log4net.Repository.Hierarchy.Hierarchy]
log4net: repository [log4net-default-repository] already exists, using repository type [log4net.Repository.Hierarchy.Hierarchy]
输出似乎没有暗示任何问题。我还尝试将以下行添加到我的配置中,但没有成功:
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" requirePermission="false"/>
我使用完全相同的配置向解决方案添加了一个 WinForms 项目,并且日志记录工作正常,所以我确信这不是我的设置。关于我可能错过的步骤还有其他想法吗?
我能够通过将 Log
变量设为静态并像这样实例化它来让它工作:
private static ILog Log = LogManager.GetLogger(typeof(TestService));
我不太清楚为什么这是必要的。希望其他人知道答案。