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 79

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)]
  1. добавить следующее AssemblyInfo.cs

[ассамблея: такой как log4net.Конфиг.XmlConfigurator (ConfigFile = " Log4Net.конфигурация")]

  1. убедитесь, что такой как log4net.конфиг включен в проект
  2. в свойствах log4net.конфигурации

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

  1. дважды проверьте уровень журнала значение уровня= "все"