1

我正在尝试为我的 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 中使用它来引用它:

[程序集:log4net.Config.XmlConfigurator(Watch = true, ConfigFile = @"C:\app.config")]

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

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

4

4 回答 4

1

我也面临同样的问题,当我的服务运行配置记录器时,我使用了下面的语句。

XmlConfigurator.Configure();

它奏效了。

于 2014-04-01T09:56:59.997 回答
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());
        }
    }
于 2012-08-23T13:39:06.220 回答
0

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

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

<appender name="EventLogAppender" type="log4net.Appender.EventLogAppender" >
      <logName value="System" />
      <applicationName value="AppName" />
      ...
</appender>
于 2013-03-15T02:03:53.120 回答
0

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

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

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

于 2012-08-22T20:25:39.243 回答