Log4net在Windows服务中不起作用

时间:2017-02-18 07:18:31

标签: c# windows-services log4net log4net-configuration

我在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");

但没有任何反应,我写日志时不会出现日志文件。

有人可以帮我吗?

我花了一整天时间寻找解决方案,但一无所获。

谢谢,

1 个答案:

答案 0 :(得分:1)

看起来你上面有配置问题:

<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}是上面的关键。此目录通常没有作为虚拟目录和程序文件目录的安全限制。我发现自从我使用这条路以来,我没有遇到任何麻烦。

此envrionment变量将您带到Windows Vista,7,8,Server 2008等中的ProgramData目录。我认为XP会将您带到另一个地方,但仍然是具有宽松权限的目录。您所要做的就是在文件资源管理器中键入%allusersprofile%,它将带您到那里。