Как включить 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" из вашего веб-сервиса.