Log4net и служба Windows.Что еще я должен сделать, чтобы сделать эту работу - PullRequest
4 голосов
/ 03 августа 2011

Пожалуйста, помогите мне, я хочу запустить log4net в моей службе Windows. И это просто - миссия невыполнима.

Прежде всего, с Win формами - отлично работает.

Вот что я делаю с Windows Service:

Добавить в сборку:

[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 версии или более. Я начинаю верить, что это невозможно использовать log4net с помощью службы Windows.


ОБНОВЛЕНИЕ:

Итак, о разрешениях: На самом деле я получаю исключение, о разрешениях. Я исправляю это с помощью этой строки (requirePermission = "false"):

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

Теперь, это все еще не работает, без исключения.

Это мой последний код exec:

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 ]

6 голосов
/ 03 августа 2011

У нас возникла проблема, поскольку каталог времени выполнения служб - C:\Windows\System или C:\Windows\System32.Поэтому файл log4net.config должен находиться в системном каталоге, что нежелательно, или вы должны указать путь к файлу log4net.config.

4 голосов
/ 03 августа 2011

Скорее всего, если эта регистрация работает в приложении Windows, это проблема с разрешениями . Когда вы входите в службу Windows, пользователь, под которым работает служба Windows, должен иметь права на запись в папку, в которую вы пытаетесь войти.

Также вы должны попробовать включить отладку log4net, чтобы посмотреть, поможет ли это вам.

<log4net debug="true">

    ... configuration ...

</log4net>

Вы также должны посмотреть на мой ответ в посте, очень похожем на этот, если есть дополнительные вопросы:

log4net не создает файл журнала при развертывании на IIS7

2 голосов
/ 03 августа 2011

Я успешно справился со службой 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)]
...