Конфигурация Log4Net во внешнем файле не работает - PullRequest
87 голосов
/ 15 января 2009

Мы используем 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="myapp.log" />
    <layout type="log4net.Layout.SimpleLayout" />
  </appender>
  <root>
    <appender-ref ref="General" />
  </root>
</log4net>

Однако, когда мы запускаем приложение, файл журнала не создается (и регистрация не производится). На консоль не выводятся сообщения об ошибках.

Если мы переместим содержимое файла Log.config обратно в App.config (заменив первую строчку кода выше), он будет работать как положено. Есть идеи, почему он не работает во внешнем файле?

Ответы [ 12 ]

110 голосов
/ 15 января 2009

У вас есть следующий атрибут в файле AssemblyInfo.cs:

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "Log4Net.config", Watch = true)]

и код, подобный этому, в начале каждого класса, для которого требуется функциональность ведения журнала:

private static readonly ILog log = 
LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

У меня есть запись в блоге, содержащая эту и другую информацию здесь .

36 голосов
/ 26 сентября 2009

В этом выпуске открытый дефект . 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.

24 голосов
/ 12 апреля 2011

пропущенный шаг -

log4net.Config.XmlConfigurator.Configure(); 

это приведет к использованию configSource. Убедитесь, что вы вызываете его один раз перед вызовом GetLogger ();

19 голосов
/ 28 июля 2010

Убедитесь, что ваш файл log4net.config имеет следующие свойства:

Действие сборки: содержимое

Копировать в выходной каталог: Копировать всегда

9 голосов
/ 25 февраля 2014

Либо использовать,

<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 в обозревателе решений. Действие построения - содержимое и копирование в выходной каталог - всегда копировать

2 голосов
/ 07 июля 2014

Остерегайтесь этой проблемы ...

В моем случае все было настроено правильно. Проблема в том, что я использовал Web Deploy внутри Visual Studio 2013 для загрузки сайта на WinHost.com и он сбросил ACL на сервере. Это, в свою очередь, отозвало все разрешения для папок и файлов - log4net не смог записать файл.

Подробнее об этом можно прочитать здесь:

Как запретить Web Deploy / MSBuild портить разрешения сервера

Я попросил группу поддержки там сбросить ACL, а затем log4net начал выплевывать логи. :)

1 голос
/ 31 августа 2017

Также возможно включить режим отладки для 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.

1 голос
/ 21 сентября 2014

У меня была такая же проблема, кроме того, что

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

в текущем проекте, у меня также была следующая строка в ссылочном проекте:

[assembly: log4net.Config.XmlConfigurator]

Когда я удалил эту строку в ссылочных проектах, журналы начали появляться.

1 голос
/ 16 апреля 2013

Предполагая, что у вас есть внешний файл конфигурации с именем 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());
        }
    }
}
0 голосов
/ 10 октября 2018
  1. добавить следующее к AssemblyInfo.cs

[сборка: log4net.Config.XmlConfigurator (ConfigFile = "Log4Net.config")]

  1. Убедитесь, что log4net.config включен в проект
  2. В свойствах log4net.config

изменить Копировать в выходной каталог в Копировать, если новее

  1. Двойной контроль уровня журнала значение уровня = "ВСЕ"
...