【问题标题】:log4net not working in a windows servicelog4net 在 Windows 服务中不起作用
【发布时间】:2010-06-29 09:42:31
【问题描述】:

我有一个控制台应用程序,我正在将其转换为 Windows 服务。作为控制台应用程序,我的 log4net 日志记录工作正常。但是将其转换为 Windows 服务后,我的 log4net 日志记录已停止工作。

我已将此添加到服务项目中的 assemblyInfo.cs:

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)] 

这是我的带有 onstart 和 onstop 的服务类:

private static log4net.ILog _log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
        private Builder _builder;

        public YCSWebServerService()
        {
            InitializeComponent();
            _builder = new Builder();
        }

        protected override void OnStart(string[] args)
        {
            _log.Info("YCSWebServerService started");
            _builder.Start();
        }

        protected override void OnStop()
        {
            _log.Info("YCSWebServerService stopped");
            _builder.Stop();
        }

我在我的服务项目中添加了一个“特定”的 log4net 配置文件:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>

  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
  </configSections>

  <log4net>
    <root>
      <level value="ALL" />
      <appender-ref ref="EventLogAppender" />
    </root>
    <appender name="EventLogAppender" type="log4net.Appender.EventLogAppender">
      <threshold value="DEBUG" />
      <applicationName value="Lantic YCS WebServer" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="(%-5level %date{hh}:%date{mm}:%date{ss} [%thread] %logger [%property{NDC}] ) %message %n" />
      </layout>
    </appender>
  </log4net>

</configuration>

有什么想法或提示吗?

【问题讨论】:

标签: c# logging windows-services


【解决方案1】:

您是否只是在 app.config 文件中添加了 log4net 部分?在您的问题中,您提到您有“特定的 log4net 配置文件”,但您提供的示例看起来像 app.config 的全部内容。 如果 app.config 是这种情况,那么您可以在 AssemblyInfo.cs 中使用更简单的字符串:

[assembly: log4net.Config.XmlConfigurator(Watch = true)]

当我修复 log4net 未记录到 Windows 服务文件的类似问题时,还将 requirePermission="false" 添加到我的 app.config 部分对我有帮助(请参阅额外属性 - requirePermission="false"):

<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" requirePermission="false"/>
  </configSections>

【讨论】:

  • 为我工作。我总是忘记组装部分。
【解决方案2】:

一些尝试:

运行服务的用户是否有写权限?

是否有任何异常记录到 Windows 日志中?

您是否尝试过在调试模式下运行服务以查看 Log4net 是否正常 抛出任何异常?

【讨论】:

  • EventLogAppender 不会抛出异常,因为 log4net 有自己的错误处理程序。默认情况下,此错误处理程序在第一次出现时将异常写入 Console.Error.WriteLine 和 Trace.WriteLine。所有进一步发生的事件都将被忽略。您可以使用本文底部的自己的错误处理程序:blogs.myfirstsharepoint.de/archive/2009/06/02/…(文章是德语,但这不会损害代码,对吧?)
【解决方案3】:

https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=293617

http://social.msdn.microsoft.com/Forums/en-US/windowsgeneraldevelopmentissues/thread/5bef59bc-a28f-4e6d-8ddb-730e12764162

在 Windows Vista、Windows XP SP 2、Windows Server 2003、2008 和 Windows 7 中,用户需要管理员权限才能访问安全日志。现在当 log4net 尝试创建事件日志 Source 时,会检查所有日志是否已经存在。 因此,对于 Windows 服务,Windows Server 的用户需要管理员权限(这不好)。

解决方案:在 log4net 配置中配置显式 Source(就像您所做的那样:&lt;applicationName value="Lantic YCS WebServer" /&gt;, Lantic YCS WebServer 是您的 Source)并在您的 Setup 中创建此 Source(因为 Setup-User 应该具有管理员权限)。

【讨论】:

  • 我的用户帐户有管理员权限,但仍然没有结果。通过在我的配置中定义显式源,我无法弄清楚您的确切含义?你能发布一个链接或一个例子吗?
  • 我没有从你发布的链接中得到任何东西
  • 对不起,有时我写的有点复杂。您已经配置了一个明确的 Source: ...我编辑了我的问题 ...
【解决方案4】:

这个问题很久以前就被问过了,我有一个建议可能对任何寻求解决这个问题的人有所帮助。如果您要将控制台应用程序转换为 Windows 服务...您必须已经创建了一个安装程序来安装该应用程序。当您安装应用程序时,它通常会在 ProgramFile..... 下为该服务创建一个安装文件夹(在安装服务时检查它。它会为您提供安装目录的路径)。如果您在 web.config 文件中提供了日志文件的路径为“Log\Log.txt”,那么安装文件夹中将有一个文件夹(Log),其中包含您的日志文件(Log.txt)。如果您在应用程序文件夹中查找日志文件,您就是在浪费时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-04
    • 2018-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-26
    相关资源
    最近更新 更多