log4net不能在Windows服务工作

问题描述:

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

我已经加入这个我在服务项目的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> 

任何想法或提示?

+0

我解决了这个问题通过重写appender。检查此问题: http://stackoverflow.com/questions/1922430/how-do-you-make-log4net-output-to-current-working-directory/1922805#1922805 – RClemens 2013-05-10 23:50:29

有些事情要尝试:

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

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

您是否尝试过在调试模式下运行服务以查看Log4net是否为 引发异常?

+0

EventLogAppender不会抛出异常,因为log4net有一个自己的错误处理程序,默认情况下,这个错误处理程序在第一次发生时将异常写入Console.Error.WriteLine和Trace.WriteLine,所有进一步的发生都会被忽略,你可以使用自己的错误处理程序这篇文章的底部:http://blogs.myfirstsharepoint.de/archive/2009/06/02/aus-der-praxis-%E2%80%93-securityexception-beim-loggen-mit-eventlogappender-von-log4net。如px(文章是德文,但不会损害代码,对吧?) – Hinek 2010-06-29 09:58:21

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服务器的用户需要管理员权限(这不是很好)。

解决方案:配置log4net的配置一个明确的来源(像你一样:<applicationName value="Lantic YCS WebServer" />, LANTIC YCS Web服务器是您的源),并创建该来源您在安装(因为安装程序,用户应该有管理员权限)。

+0

我的用户帐户具有管理权限,并且没有任何结果。 我一直无法通过在我的配置中定义显式源代码来弄清楚你的意思是什么?你能发布一个链接或例子吗? – lmkk 2010-06-29 11:20:24

+0

而且我没有从你发布的链接中获得任何东西 – lmkk 2010-06-29 11:34:03

+0

对不起,有时我写得有点复杂。你已经配置了一个显式的Source: ...我编辑了我的问题... – Hinek 2010-06-29 11:34:18

你刚刚添加一个log4net节到你的app.config文件?在你提到的问题中你提到你有“特定的log4net配置文件”,但你给的样本看起来像app.config的全部内容。 如果是的app.config的情况下,那么你可以在AssemblyInfo.cs中简单的字符串:

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

还加入requirePermission =“假”在我的app.config的部分帮助我,当我固定的类似问题,log4net的没有记录到文件的Windows服务(请参阅附加属性 - requirePermission =“假”):

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

为我工作。我总是忘记组装部分。 – 2014-06-19 07:29:20

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