Log4net和Windows服务。我还应该做些什么来完成这项工作

时间:2011-08-02 20:33:04

标签: c# windows-services log4net

请帮助我,我想在我的Windows服务上运行log4net。简而言之 - 任务是不可能的。

首先,使用Win表单 - 工作得很好。

以下是我对Windows服务的处理方法:

添加到程序集:

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

我的配置:

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

  <log4net>
    <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender">
      <param name="File" value="log-file.txt" />
      <param name="AppendToFile" value="true" />
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%d [%t] %-5p %c: %m%n" />
      </layout>
    </appender>
    <root>
      <level value="ALL" />
      <appender-ref ref="LogFileAppender" />
    </root>
  </log4net>

我的课程:

public class LogProvider
{
    private ILog _Log;


    public LogProvider(string className)
    {
        XmlConfigurator.Configure();
        _Log = LogManager.GetLogger(className);
    }

    public void Info(object message)
    {
        _Log.Info(message);
    }
}

在主程序中:

using log4net;
using log4net.Config;

(...)

private LogProvider _logProvider;

(...)

                _logProvider = new LogProvider("Test");
                _logProvider.Info("asds");

什么事?

如果有可能,请告诉我示例项目 - 因为,上面的代码大约是100个版本或更多。我开始相信这是不可能使用Windows服务的log4net。


更新:

所以,关于权限: 实际上我得到一个关于权限的例外。我用这一行解决了这个问题(requirePermission =“false”):

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

现在,它仍然无法正常工作,也不例外。

这是我的最终执行代码:

protected override void OnStart(string[] args)
{
    try
    {

        LogProvider lp = new LogProvider("asd");
        lp.Info("asd2");
    }
    catch (Exception ex)
    {
         System.IO.FileInfo _file;
         System.IO.StreamWriter _writer;
         _file = new System.IO.FileInfo("D:\\Log\\asdCatch.txt");
         _writer = _file.CreateText();
         _writer.WriteLine("[" + DateTime.Now.ToString() + "] Init Log");
         _writer.WriteLine("[" + DateTime.Now.ToString() + "] " + ex.ToString());
         _writer.Close();

    }
}

现在我真的很困惑,我已经创建了另一个Windows服务并且它正在工作 - 没有权限的那一行。天哪,这很奇怪。


UPDATE2: 好的,我知道了。我不知道这是怎么发生的,但我在app.config中找到了这一行:

  <runtime>
    <NetFx40_LegacySecurityPolicy enabled="true"/>
  </runtime>

我正在研究15个子项目计划并且认真,我不知道它来自哪里:/

3 个答案:

答案 0 :(得分:6)

我们遇到了问题,因为服务运行时目录是C:\Windows\SystemC:\Windows\System32。因此,log4net.config必须位于系统目录中,这是不可取的,或者您必须提供log4net.config文件的路径。

答案 1 :(得分:4)

如果此日志记录在Windows应用程序中有效,则很可能是权限问题。当您登录Windows服务时,运行Windows服务的用户必须对您尝试登录的文件夹具有写入权限。

此外,您应该尝试启用log4net调试,看看这是否对您有所帮助。

<log4net debug="true">

    ... configuration ...

</log4net>

如果还有其他问题,您还应该在与此非常类似的帖子中查看我的答案:

log4net doesn't create log file when deployed on IIS7

答案 2 :(得分:2)

我已经成功使用log4net + windows服务,你可以启用log4net内部调试(http://log4net.sourceforge.net/release/1.2.0.30316/doc/manual/faq.html#internalDebug)并运行您在控制台模式下的服务,以查看任何可能的错误配置

试试这个:

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