Log4net无法在Windows服务中运行

时间:2012-08-21 23:41:37

标签: windows-services log4net

我正在尝试为我的Windows服务创建一个简单的文件记录器,但该文件未被写入。这是我的app.config文件:

<?xml version="1.0"?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
  </configSections>
  <connectionStrings>
    <add name="MyAppConnectionString" connectionString="Data Source=.;Initial Catalog=MyApp;Integrated Security=True;MultipleActiveResultSets=True" />
    <add name="MyAppEntities" connectionString="metadata=res://*/MyAppModel.csdl|res://*/MyAppModel.ssdl|res://*/MyAppModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=.;Initial Catalog=MyApp;Integrated Security=True;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>
  <startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
  </startup>
  <system.web>
    <roleManager enabled="true" defaultProvider="MyAppSqlRoleProvider">
      <providers>
        <add name="MyAppSqlRoleProvider"
             type="System.Web.Security.SqlRoleProvider"
             applicationName="MyApp"
             connectionStringName="MyAppConnectionString"/>
      </providers>
    </roleManager>
  </system.web>
  <log4net>
    <appender name="FileAppender" type="log4net.Appender.FileAppender">
      <file value="C:/logfiles/MyAppAlarms.txt" />
      <appendToFile value="true" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %message%newline" />
      </layout>
    </appender>
    <root>
      <level value="ALL" />
      <appender-ref ref="FileAppender" />
    </root>
  </log4net>
</configuration>

我知道还有其他一些与此类似的帖子,但我已经阅读过这些帖子并尝试了其中的所有内容,但我无法到达任何地方。我尝试将上面相同的标记放在控制台应用程序中并且有效。我尝试将app.config复制并粘贴到C:\驱动器并在AssemblyInfo.cs中使用它来引用它:

[assembly:log4net.Config.XmlConfigurator(Watch = true,ConfigFile = @“C:\ app.config”)]

但这不起作用。我能够使用调试器附加到服务,但我不知道如何在这里使用它对我有利。什么都没有抛出异常。我尝试使用StreamWriter写入同一个文件并且有效,所以我知道这不是写权限问题。

我对接下来的尝试感到茫然。有没有办法我可以获得一些调试信息,以便我可以找出问题所在?我尝试启用内部调试并运行DebugView,但除了低级网络消息之外我什么都没看到。我也试过设置log4net debug = true,但我认为这写入了对服务没有帮助的控制台。

4 个答案:

答案 0 :(得分:1)

我也遇到了同样的问题,我在服务运行时使用了以下语句来配置记录器。

<强> XmlConfigurator.Configure();

并且有效。

答案 1 :(得分:0)

检查app.config文件是否正确命名。如果您的服务可执行文件是MyService.exe,则配置文件应命名为MyService.exe.config。

我已经被这几次咬过了,现在它是我检查的第一件事。

另请参阅:App.Config vs. AppName.exe.Config

答案 2 :(得分:0)

如果您正在调试服务,请确保在DbgView中启用了 Capture Global Win32 。当你设置log4net debug = true时,你应该在控制台和dbgview中看到消息两者

如果在调用ServiceBase.Run(..)命令之前在程序开头有 log.Debug 调用,那么您应该可以直接从命令提示符运行exe它应该在显示错误消息之前初始化日志记录,从而初始化任何内部日志记录消息,该消息表明您无法从命令行启动服务。这可能会给出一些问题。 (当然,您必须意识到,通过执行此操作,您可能正在使用不同的凭据运行该程序。)

此外,如果您想从命令行在非服务程序中运行整个程序,通常可以通过更改几行来实现。

您的服务可能会开始使用

之类的内容
static void Main()
{
     log.Debug("Start Up");
     ServiceBase.Run(new MainService());         
}

您可以将其更改为

static void Main()
{
     log.Debug("Start Up");
     MainService ms = new MainService();
     ms.OnStart(null);
}

或者如果你想在不重新编译的情况下切换,那么就像

 // The main entry point for the process
    static void Main(string[] args)
    {
       log.Debug("Start Up");

        string cmdLine = args.Length == 0 ? "" : args[0].ToLower().Substring(1);

        // If we are debugging or if we have been passed the /NonService 
        // commandline, then start the program in non-service mode.

        if (System.Diagnostics.Debugger.IsAttached 
             || string.Equals(cmdLine, "NonService" , System.StringComparison.CurrentCultureIgnoreCase))
        {
            MainService ms = new MainService();
            ms.OnStart(null);
        }
        else
        {
            ServiceBase.Run(new MainService());
        }
    }

答案 3 :(得分:0)

写入日志的服务需要具有管理员权限才能访问事件查看器中的安全日志。您可以使用具有管理员访问权限的帐户启动服务来测试此问题。不要在生产环境中使用具有管理员访问权限的帐户,而只是作为临时测试。

要修复它,请创建自定义事件日志。它将绕过访问安全日志的需要。

<appender name="EventLogAppender" type="log4net.Appender.EventLogAppender" >
      <logName value="System" />
      <applicationName value="AppName" />
      ...
</appender>