log4net无法在Windows服务中运行

时间:2010-06-29 09:42:32

标签: c# logging windows-services

我有一个控制台应用程序,我正在转换为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>

任何想法或提示?

4 个答案:

答案 0 :(得分:6)

您刚刚在app.config文件中添加了log4net部分吗?在你的问题中,你提到你有&#34;特定的log4net配置文件&#34;,但你提供的样本看起来像app.config的全部内容。 如果是app.config,那么你可以在AssemblyInfo.cs中使用更简单的字符串:

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

还添加requirePermission =&#34; false&#34;我修复了app.config中的部分,当我修复类似的问题时,log4net没有登录到Windows服务的文件(参见额外的属性 - requirePermission =&#34; false&#34;):

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

答案 1 :(得分:1)

有些事情要尝试:

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

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

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

答案 2 :(得分:1)

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尝试创建事件日志时,将检查所有日志是否已存在。 因此,对于Windows服务,Windows Server的用户需要管理员权限(这不是很好)。

解决方案:在log4net配置中配置显式Source(正如您所做的那样:<applicationName value="Lantic YCS WebServer" />, Lantic YCS WebServer是您的源)并在您的安装程序中创建此源(因为Setup-User应具有管理员权限)。

答案 3 :(得分:0)

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