Log4net 在 windows 服务中不起作用
Log4net doesn't work in windows service
我对在 windows 服务中制作 log4net 感到非常沮丧。
我尝试在 Google 上搜索,但没有解决方案可以解决我的问题。
这是我的 App.config:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="log4net"
type="log4net.Config.Log4NetConfigurationSectionHandler, log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=1b44e1d426115821" />
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
</startup>
<appSettings>
<add key="ApplicationSettings" value="Configurations/ApplicationSettings.json" />
<add key="ClientSettingsProvider.ServiceUri" value="" />
</appSettings>
<!-- log4net rolling file configuration -->
<log4net debug="true">
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="log.txt" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="10" />
<maximumFileSize value="100KB" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
</layout>
</appender>
<root>
<level value="DEBUG" />
<appender-ref ref="RollingLogFileAppender" />
</root>
</log4net>
<system.web>
<membership defaultProvider="ClientAuthenticationMembershipProvider">
<providers>
<add name="ClientAuthenticationMembershipProvider"
type="System.Web.ClientServices.Providers.ClientFormsAuthenticationMembershipProvider, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" serviceUri="" />
</providers>
</membership>
<roleManager defaultProvider="ClientRoleProvider" enabled="true">
<providers>
<add name="ClientRoleProvider"
type="System.Web.ClientServices.Providers.ClientRoleProvider, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" serviceUri="" cacheTimeout="86400" />
</providers>
</roleManager>
</system.web>
</configuration>
在 Main 函数的 program.cs 中,我尝试调用:
System.IO.Directory.SetCurrentDirectory(AppDomain.CurrentDomain.BaseDirectory);
XmlConfigurator.Configure();
在 Main.cs(我的服务)的 OnStart 函数中,我试过:
_log = LogManager.GetLogger(typeof(Main));
_log.Error("Service started");
但是没有任何反应,当我写日志时没有出现日志文件。
有人能帮帮我吗?
我花了一整天的时间寻找解决方案,但一无所获。
谢谢,
您似乎遇到了上述配置问题:
<appender name="RollingFileAppender"
<root>
<level value="DEBUG" />
<appender-ref ref="RollingLogFileAppender" />
以上名称必须匹配。例如,两者都必须设置为 RollingFileAppender
。
此外,在编写日志文件时,我倾向于不尝试将我的日志文件写入程序文件目录中的任何位置或任何虚拟目录中的任何位置,这仅仅是因为我之前遇到过安全问题。目前,我对我的所有 log4net 日志文件都使用如下内容:
<file type="log4net.Util.PatternString" value="${ALLUSERSPROFILE}/<Product Name>/Logs/<Program Name>/<Program Name>.log" />
${ALLUSERSPROFILE}
是上面的关键。该目录通常没有虚拟目录和程序文件目录的安全限制。我发现自从我一直使用这条路径以来,我没有遇到任何麻烦。
此环境变量将您带到 Windows Vista、7、8、Server 2008 等中的 ProgramData
目录。我认为 XP 将您带到一个不同的地方,但仍然是一个权限宽松的目录.您所要做的就是在文件资源管理器中输入 %allusersprofile%,它会带您到那里。
我对在 windows 服务中制作 log4net 感到非常沮丧。 我尝试在 Google 上搜索,但没有解决方案可以解决我的问题。
这是我的 App.config:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="log4net"
type="log4net.Config.Log4NetConfigurationSectionHandler, log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=1b44e1d426115821" />
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
</startup>
<appSettings>
<add key="ApplicationSettings" value="Configurations/ApplicationSettings.json" />
<add key="ClientSettingsProvider.ServiceUri" value="" />
</appSettings>
<!-- log4net rolling file configuration -->
<log4net debug="true">
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="log.txt" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="10" />
<maximumFileSize value="100KB" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
</layout>
</appender>
<root>
<level value="DEBUG" />
<appender-ref ref="RollingLogFileAppender" />
</root>
</log4net>
<system.web>
<membership defaultProvider="ClientAuthenticationMembershipProvider">
<providers>
<add name="ClientAuthenticationMembershipProvider"
type="System.Web.ClientServices.Providers.ClientFormsAuthenticationMembershipProvider, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" serviceUri="" />
</providers>
</membership>
<roleManager defaultProvider="ClientRoleProvider" enabled="true">
<providers>
<add name="ClientRoleProvider"
type="System.Web.ClientServices.Providers.ClientRoleProvider, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" serviceUri="" cacheTimeout="86400" />
</providers>
</roleManager>
</system.web>
</configuration>
在 Main 函数的 program.cs 中,我尝试调用:
System.IO.Directory.SetCurrentDirectory(AppDomain.CurrentDomain.BaseDirectory);
XmlConfigurator.Configure();
在 Main.cs(我的服务)的 OnStart 函数中,我试过:
_log = LogManager.GetLogger(typeof(Main));
_log.Error("Service started");
但是没有任何反应,当我写日志时没有出现日志文件。
有人能帮帮我吗?
我花了一整天的时间寻找解决方案,但一无所获。
谢谢,
您似乎遇到了上述配置问题:
<appender name="RollingFileAppender"
<root>
<level value="DEBUG" />
<appender-ref ref="RollingLogFileAppender" />
以上名称必须匹配。例如,两者都必须设置为 RollingFileAppender
。
此外,在编写日志文件时,我倾向于不尝试将我的日志文件写入程序文件目录中的任何位置或任何虚拟目录中的任何位置,这仅仅是因为我之前遇到过安全问题。目前,我对我的所有 log4net 日志文件都使用如下内容:
<file type="log4net.Util.PatternString" value="${ALLUSERSPROFILE}/<Product Name>/Logs/<Program Name>/<Program Name>.log" />
${ALLUSERSPROFILE}
是上面的关键。该目录通常没有虚拟目录和程序文件目录的安全限制。我发现自从我一直使用这条路径以来,我没有遇到任何麻烦。
此环境变量将您带到 Windows Vista、7、8、Server 2008 等中的 ProgramData
目录。我认为 XP 将您带到一个不同的地方,但仍然是一个权限宽松的目录.您所要做的就是在文件资源管理器中输入 %allusersprofile%,它会带您到那里。