Как включить log4net для библиотеки классов?

Я хочу реализовать функцию ведения журнала в библиотеке классов, которая сама упоминается в веб-сервисе. Я попытался добавить app.config и сделал все необходимое, но кажется, что когда генерируется исключение, log4net просто ничего не делает.

my app.config

<configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
  </configSections>
  <log4net>
    <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
      <file value="D:\\mylogfile.txt" />
      <appendToFile value="true" />
      <rollingStyle value="Size" />
      <maxSizeRollBackups value="5" />
      <maximumFileSize value="10MB" />
      <staticLogFileName value="true" />
      <filter type="log4net.Filter.StringMatchFilter">
        <stringToMatch value="test" />
      </filter>
      <filter type="log4net.Filter.StringMatchFilter">
        <stringToMatch value="error" />
      </filter>
      <filter type="log4net.Filter.DenyAllFilter" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %level %logger - %message%newline%exception" />
      </layout>
    </appender>
    <root>
      <level value="INFO"/>
      <appender-ref ref="RollingFileAppender"/>
      <appender-ref ref="ConsoleAppender" />
    </root>
  </log4net>

в AssemblyInfo.cs:

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

в LogManager.cs:

private static readonly ILog Log = log4net.LogManager.GetLogger
            (MethodBase.GetCurrentMethod().DeclaringType);
public static void WriteLog(Exception ex)
{
    Log.Error(ex);
}

Не могли бы вы рассказать мне, что случилось? Как я могу заставить log4net работать в моей библиотеке классов?

Спасибо

Ответ 1

Во время выполнения конфигурационный файл всегда используется из хост-приложения, если не указано явно. Здесь в случае, если используется web.config, не app.cofig. Скорее упомяните другое имя настраиваемого конфигурационного файла и убедитесь, что файл скопирован в виртуальный каталог веб-службы. Также, как говорится, обеспечьте разрешение на файл журнала. Лучше сохраните его в папке app_data для хоста веб-службы.

Ответ 2

Вы можете использовать какую-то инъекцию, либо вы строите простой, например:

public interface ILogger
{
    void LogInfo(string message);
       .
       .
       .
}

И тогда вы просто вводите что-то, что соответствует этому интерфейсу, например, обертку для log4net или тому подобное.

Но, я думаю, самая правильная вещь - не входить в библиотеку классов. Почему я так думаю, потому что сама библиотека не является приложением, ваш веб-сервис так что ваш веб-сервис должен решить, что делать в журнале. Если вы хотите регистрировать исключения, просто не поймайте их в библиотеке классов и пусть ваш веб-сервис обрабатывает ведение журнала. Это также упростит централизацию ведения журнала.

Ответ 3

Пожалуйста, см. мой ответ на следующий вопрос:

Использовать log4net в SDK

В нем есть процедура настройки журнала, которая построит полный путь к файлу конфигурации log4net. Поскольку вы находитесь в веб-сервисе, я не смотрю, где вы ожидаете "app.config".

Также убедитесь, что у вас есть разрешение на запись в "D:\mylogfile.txt" из вашего веб-сервиса.