Конфигурация log4Net во внешнем файле не работает
Мы используем log4net и хотим указать его конфигурацию во внешнем файле конфигурации (как это было сделано с другими разделами). Для этого мы изменили раздел log4net в App.config на:
...
<section name="log4net"
type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
...
<log4net configSource="Log.config" />
...
И в файле Log.Config(тот же каталог, что и App.config):
<log4net>
<appender name="General" type="log4net.Appender.FileAppender">
<file value="log.txt" />
<layout type="log4net.Layout.SimplyLayout" />
</appender>
<root>
<appender-ref ref="General" />
</root>
</log4net>
Однако, когда мы запускаем приложение, файл журнала не создается (и никаких протоколов не выполняется). На консоль выводятся сообщения об ошибках.
Если мы переместим содержимое файла Log.config обратно в App.config(заменив первую строку кода выше), он работает так, как ожидалось. Любая идея, почему он не работает во внешнем файле?
Ответы
Ответ 1
У вас есть следующий атрибут в файле AssemblyInfo.cs
:
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "Log4Net.config", Watch = true)]
и код, подобный этому, в начале каждого класса, который требует функции ведения журнала:
private static readonly ILog log =
LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
У меня есть сообщение в блоге с этой и другой информацией здесь.
Ответ 2
В этой проблеме есть открытый дефект. Log4Net не поддерживает атрибут configSource элементов конфигурации. Чтобы использовать чисто конфигурационное решение, вы используете ключ log4net.Config в appSettings.
Шаг 1: Включите определение нормальной конфигурации:
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>
Шаг 2: Используйте волшебный ключ log4net.Config в appSettings.
<appSettings>
<add key="log4net.Config" value="log4net.simple.config" />
</appSettings>
Шаг 3: Внесите исправление для исправления обработки configSource.
Ответ 3
Пропущенный шаг
log4net.Config.XmlConfigurator.Configure();
это приведет к использованию configSource.
Убедитесь, что вы вызываете его один раз перед вызовом GetLogger();
Ответ 4
Убедитесь, что файл log4net.config установлен со следующими свойствами:
Действие сборки: содержимое
Скопировать в выходной каталог: Копировать всегда
Ответ 5
Используйте либо
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>
<appSettings>
<add key="log4net.Config" value="Log4Net.config" />
</appSettings>
или просто,
log4net.Config.XmlConfigurator.ConfigureAndWatch(new System.IO.FileInfo("Log4Net.config"));
В обоих случаях файл, Log4Net.config, должен находиться в каталоге вывода.
Вы можете сделать это, установив свойства файла Log4Net.config в проводнике решений.
Создание действия - Контент и копирование в выходной каталог - Копирование всегда
Ответ 6
Предполагая, что у вас есть файл внешней конфигурации с именем log4net.config, который скопирован в каталог развертывания, вы можете настроить его так:
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Reflection;
using log4net;
namespace MyAppNamespace {
static class Program {
//declare it as static and public so all classes in the project can access it
//like so: Program.log.Error("got an error");
public static readonly log4net.ILog log = log4net.LogManager.GetLogger(typeof(Program));
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main() {
//configure it to use external file
log4net.Config.XmlConfigurator.Configure(new Uri(Application.StartupPath + "\\log4net.config"));
//use it
log.Debug("############# STARING APPLICATION #################");
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new FormMain());
}
}
}
Ответ 7
Следите за этой проблемой...
В моем случае все было правильно настроено. Проблема в том, что я использовал Web Deploy внутри Visual Studio 2013 для загрузки сайта в WinHost.com и reset ACLs на сервере. Это, в свою очередь, отозвало все разрешения на папки и файлы - log4net не смог записать файл.
Подробнее об этом можно прочитать здесь:
Как остановить веб-развертывание/MSBuild от нарушения настроек сервера
Я попросил там службу поддержки reset списки ACL, а затем log4net начал записывать журналы.:)
Ответ 8
@Mitch. Оказывается, есть файл с объявлением [assembly:...], но у него не было свойства ConfigFile.
Как только я добавил его и указал на Log.config, он начал работать. Я бы подумал, что он будет работать, как и все остальные разделы конфигурации (например, AppSettings), и принимать внешние файлы конфигурации без каких-либо изменений.
У нас нет второго заявления, которое вы упомянули, поскольку мы завершаем его в глобальном статическом поставщике журналов.
Ответ 9
У меня была та же проблема, кроме
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net")]
в запущенном проекте, я также имел следующую строку в эталонном проекте:
[assembly: log4net.Config.XmlConfigurator]
Когда я удалял эту строку в проектах, на которые ссылаются, журналы начинают появляться.
Ответ 10
Также можно включить режим отладки для log4net
. Вставьте это в файл App.config:
<appSettings>
<add key="log4net.Internal.Debug" value="true"/>
</appSettings>
<system.diagnostics>
<trace autoflush="true">
<listeners>
<add
name="textWriterTraceListener"
type="System.Diagnostics.TextWriterTraceListener"
initializeData="link\to\your\file.log" />
</listeners>
</trace>
</system.diagnostics>
и вы, по крайней мере, получите сообщения об ошибках, из которых вы можете получить то, что пошло не так. В моем случае я просто забыл установить Copy to output directory
в Copy Always
.