log4net не ведет журнал при использовании внешнего файла конфигурации

Я нашел другие сообщения с похожими проблемами, но пока не могу решить свой конкретный случай.

Если я помещу конфигурацию log4net в app.config, тогда все будет работать нормально, но я хочу, чтобы это было в отдельном файле.

Я просмотрел следующие ссылки и попытался реализовать некоторые из предложенных решений (но, возможно, я это неправильно понял):

Аналогичный вопрос SO, но с веб-сценарием

Документация Apache, раздел «Чтение файлов напрямую»

Учебник Тима Кори по log4net

Итак, вот содержимое моего файла Log4NetSettings.config (заключенного в элемент конфигурации):

<log4net>
<appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
  <bufferSize value="1" />
  <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
  <connectionString value="" />
  <commandText value="INSERT INTO [Calculation Engine Log] ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />
  <parameter>
    <parameterName value="@log_date" />
    <dbType value="DateTime" />
    <layout type="log4net.Layout.RawTimeStampLayout" />
  </parameter>
  <parameter>
    <parameterName value="@thread" />
    <dbType value="String" />
    <size value="255" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%thread" />
    </layout>
  </parameter>
  <parameter>
    <parameterName value="@log_level" />
    <dbType value="String" />
    <size value="50" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%level" />
    </layout>
  </parameter>
  <parameter>
    <parameterName value="@logger" />
    <dbType value="String" />
    <size value="255" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%logger" />
    </layout>
  </parameter>
  <parameter>
    <parameterName value="@message" />
    <dbType value="String" />
    <size value="4000" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%message" />
    </layout>
  </parameter>
  <parameter>
    <parameterName value="@exception" />
    <dbType value="String" />
    <size value="2000" />
    <layout type="log4net.Layout.ExceptionLayout" />
  </parameter>
</appender>


<root>
  <level value="INFO"/>
  <appender-ref ref="AdoNetAppender"/>
</root>
</log4net>

Я меняю значение строки подключения во время выполнения.

Вот что у меня есть в app.config:

<configSections>
 <section name="log4net"  type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>
<appSettings>
 <add key="log4net.Config" value="Log4NetSettings.config" />
</appSettings>
<log4net configSource="Log4NetSettings.config" />

В исполняемом классе у меня есть это:

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

а затем, как только я получаю строку подключения и настраиваю ее для AdoNetAppender, я вызываю:

 log.Info("Testing");

У меня тоже есть:

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

в классе с атрибутом сборки и первым вызовом журнала.

В файле Log4NetSettings.config для действия сборки установлено значение Content, а для параметра «Копировать в выходной каталог» установлено значение «Всегда копировать».

Я выдергивал волосы и не знаю, что делаю не так. Следует ли мне использовать Log4NetSettings.config как обычный XML-файл? Следует ли поместить атрибут сборки в файл AssemblyInfo.cs? Мне лучше позвонить:

XmlConfigurator.ConfigureAndWatch(new System.IO.FileInfo(AppDomain.CurrentDomain.BaseDirectory + "Log4NetSettings.config"));

чем у сборочного атрибута?

Такое ощущение, что я перепробовал столько разных вещей, что, возможно, перепутал их и получил неправильную комбинацию.


person Igavshne    schedule 15.04.2015    source источник
comment
Вы пробовали что-то вроде: log4net.Config.XmlConfigurator.Configure(new Uri(System.IO.Directory.GetCurrentDirectory() + @"\Config\LogConfig.xml"));   -  person o_weisman    schedule 15.04.2015
comment
Я пробовал что-то похожее на ваше предложение, но похоже, что это не работает.   -  person Igavshne    schedule 15.04.2015


Ответы (2)


Да, у вас должна быть конфигурация log4net в XML-файле. Когда у вас есть log4net в отдельном файле, он больше не связан с app.config, поэтому раздел конфигурации не требуется, и конфигурацию не следует заключать в элемент конфигурации. (Нет необходимости иметь атрибут сборки в AssemblyInfo.cs, и я отмечаю, что вы инициализировали систему ведения журнала в своем коде запуска, то есть требуется при использовании метода атрибутов сборки)

Таким образом, ваш файл log4net будет выглядеть так:

<?xml version="1.0" encoding="utf-8" ?>
<log4net>  
    <!-- config .. -->

Если у вас все еще есть проблемы, log4net имеет возможность диагностики и отладки, см. этот вопрос о том, как его включить.

(Кроме того, если вы используете log4net 1.2.11 или новее, вы можете задайте имя строки подключения в конфигурации log4net, предполагая, что оно находится в вашем app.config)

person stuartd    schedule 15.04.2015
comment
Я удалил элемент конфигурации упаковки из файла Log4NetSettings.xml (но оставил элемент log4net, как ваше предложение выше). Я также полностью удалил элементы configSections и appSettings из файла app.config. Я оставил атрибут сборки перед методом Main в исполняемом классе. Оно работает! :-D Большая радость и ликование. Я включил отладку, как предложил Райан, и увидел, что log4net не может подключиться к базе данных, как ожидалось, без строки подключения. Я не получаю свои строки подключения из app.config, но в таком случае было бы полезно имя подключения. - person Igavshne; 15.04.2015
comment
log4net слегка жалуется, если строка подключения не задана при настройке, но она будет работать нормально, если вы установите ее вручную позже. - person stuartd; 15.04.2015

Добавление debug = "true" к тегу <log4net> (т. Е. <log4net debug="true">) дает много полезной информации, которая может помочь решить.

person Ryan    schedule 15.04.2015