Log4net config во внешнем файле не работает
мы используем log4net и хотим указать его конфигурацию во внешнем конфигурационном файле (как и в других разделах). Для этого мы изменили раздел log4net в приложении.конфиг:
...
<section name="log4net"
type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
...
<log4net configSource="Log.config" />
...
и в журнале.Конфигурационный файл (тот же каталог, что и приложение.конфиг) у нас есть:
<log4net>
<appender name="General" type="log4net.Appender.FileAppender">
<file value="myapp.log" />
<layout type="log4net.Layout.SimpleLayout" />
</appender>
<root>
<appender-ref ref="General" />
</root>
</log4net>
однако, когда мы запускаем приложение, файл журнала не создается (и не регистрируется). На консоль не выводятся сообщения об ошибках.
Если мы двигаем Содержание журнала.конфигурационный файл возвращается в приложение.config (замена первой строки кода выше), он работает так, как ожидалось. Есть идеи, почему он не работает во внешнем файле?
12 ответов:
у вас есть следующий атрибут в вашей
AssemblyInfo.cs
file:[assembly: log4net.Config.XmlConfigurator(ConfigFile = "Log4Net.config", Watch = true)]
и код, как это в начале каждого класса, который требует ведения журнала функциональность:
private static readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
у меня есть сообщение в блоге, содержащее эту и другую информацию здесь.
есть открыть дефекта по этому вопросу. Log4Net не поддерживает атрибут configSource элементов конфигурации. Чтобы использовать чисто файл конфигурации решения вы используете log4net.Конфигурационный ключ в appSettings.
Шаг 1: Включите определение раздела нормальной конфигурации:
<configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> </configSections>
Шаг 2: используйте магию log4net.Конфигурационный ключ в appSettings.
<appSettings> <add key="log4net.Config" value="log4net.simple.config" /> </appSettings>
Шаг 3: Внесите патч, чтобы исправить обработку configSource.
шаг, который был пропущен
log4net.Config.XmlConfigurator.Configure();
это приведет к использованию configSource. Убедитесь, что вы вызываете его один раз перед вызовом GetLogger();
убедитесь, что ваш log4net.конфигурационный файл имеет следующие свойства:
Build Action: Content
копировать в выходной каталог: копировать всегда
Как использовать
<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.свойства файла конфигурации в обозревателе решений. Построить действие-содержание и скопировать в выходной каталог-копировать всегда
предполагая, что у вас есть внешний конфигурационный файл log4net.конфигурация, скопированная в каталог развертывания, можно настроить следующим образом:
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()); } } }
следите за этой проблемой...
в моем случае все было правильно настроено. Проблема в том, что я использовал Web Deploy внутри Visual Studio 2013 для загрузки сайта в WinHost.com и он сбросил ACLs на сервере. Это в свою очередь отозвало все разрешения на папки и файлы - log4net не смог записать файл.
вы можете прочитать больше об этом здесь:
как остановить Web Deploy/MSBuild от испортить сервер разрешения
Я попросил команду поддержки сбросить ACL, а затем log4net начал плеваться журналами. :)
также можно включить режим отладки для
log4net
. Вставьте это в приложение.конфигурационный файл:<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
.
@Mitch, оказывается есть файл с [assembly:...] объявление, но у него не было свойства ConfigFile.
Как только я добавил его и указал на журнал.конфиг, он начал работать. Я бы подумал, что он будет работать, как и все другие разделы конфигурации (ie AppSettings) и принимать внешние файлы конфигурации без каких-либо изменений.
У нас нет второго оператора, о котором вы упомянули, поскольку мы заключаем его в глобальный статический поставщик журналов.
у меня была такая же проблема, кроме того,
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net")]
в запущенном проекте у меня также была следующая строка в ссылочном проекте:
[assembly: log4net.Config.XmlConfigurator]
когда я удалил эту строку в ссылочных проектах, журналы начинают появляться.
в моем случае я получил это сообщение об ошибке:
log4net: config file [C:\........\bin\Debug\log4net.config] not found.
и
log4net.config
файл был в проекте Visual Studio 2017, но когда я проверил файл вbin\Debug
Папка я не мог найти его.моя первоначальная установка сборки была такой:
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]
после некоторого времени исследования я меняю его на следующее, И он работает:
[assembly: log4net.Config.XmlConfigurator(ConfigFile = @"..\..\log4net.config", Watch = true)]
- добавить следующее AssemblyInfo.cs
[ассамблея: такой как log4net.Конфиг.XmlConfigurator (ConfigFile = " Log4Net.конфигурация")]
- убедитесь, что такой как log4net.конфиг включен в проект
- в свойствах log4net.конфигурации
изменить копировать в выходной Dirctory до копировать, если новее
- дважды проверьте уровень журнала значение уровня= "все"