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>
任何想法或提示?
有些事情要尝试:
运行该服务的用户是否具有写权限?
是否有任何异常记录到Windows日志?
您是否尝试过在调试模式下运行服务以查看Log4net是否为 引发异常?
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
在Windows Vista中,Windows XP SP 2,Windows Server 2003中,2008和Windows 7用户需要访问安全日志管理员权限。现在,当log4net试图创建一个事件日志源,所有的日志检查,如果它已经存在。 因此,对于Windows服务,Windows服务器的用户需要管理员权限(这不是很好)。
解决方案:配置log4net的配置一个明确的来源(像你一样:<applicationName value="Lantic YCS WebServer" />,
LANTIC YCS Web服务器是您的源),并创建该来源您在安装(因为安装程序,用户应该有管理员权限)。
你刚刚添加一个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>
为我工作。我总是忘记组装部分。 – 2014-06-19 07:29:20
好这个问题被问很长一段时间回来,我有可能会有一定的帮助,任何人寻找一个建议解决这个问题。如果您要将控制台应用程序转换为Windows服务...您必须创建安装程序来安装该应用程序。当您安装应用程序时,它通常会在ProgramFile下创建一个服务的安装文件夹.....(当您安装服务时检查它,它为您提供安装目录的路径)。如果在你的web.config文件中,你已经提供了日志文件的路径为“Log \ Log”。txt“,那么你的日志文件(Log.txt)会在安装文件夹中有一个文件夹(Log),如果你正在寻找应用程序文件夹中的日志文件,那么你就是在浪费你的时间。
我解决了这个问题通过重写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