Подтвердить что ты не робот

Log4Net с AdoNetAppender - ничего не происходит

Описание

У меня есть файл конфигурации в качестве ресурса в моей сборке и хочу программно изменить ConnectionString в моем приложении.

Загружаю конфигурацию с помощью log4net.Config.XmlConfigurator.Configure.

У меня есть некоторые точки останова и вижу, что конфигурация успешно загружена, а строка соединения Data Source=localhost\SQLExpress;Initial Catalog=Log;Integrated Security=SSPI; (локальная SQLExpress).

Проблема

Ничего не происходит, никаких исключений и записи в журнале. Любые идеи.

using (Stream stream = System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream("MyNamespace.Properties.log4net.config"))
{ 
    // stream is NOT null
    log4net.Config.XmlConfigurator.Configure(stream);
}

Hierarchy hier = LogManager.GetRepository() as Hierarchy;

if (hier != null)
{
    //get ADONetAppender
    var adoAppender = (AdoNetAppender)hier.GetAppenders().Where(appender => appender.Name.Equals("AdoNetAppender", StringComparison.InvariantCultureIgnoreCase)).FirstOrDefault();

    if (adoAppender != null)
    {
        // update connectionstring
        adoAppender.ConnectionString = configuration.GetConnectionString(ConnectionStringNames.Log).ConnectionString;
        //refresh settings of appender
        adoAppender.ActivateOptions(); 
    }
}

ILog logger = LogManager.GetLogger("MyProject"); 
logger.Warn("Test");

содержимое файла log4net.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
  </configSections>

  <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="[we will set this automatically at runtime]" />
      <commandText value="INSERT INTO Log ([Date],[Level],[Logger],[Message],[Exception])
  VALUES (@log_date, @log_level, @logger, @message, @exception)" />
      <parameter>
        <parameterName value="@log_date" />
        <dbType value="DateTime" />
        <layout type="log4net.Layout.RawTimeStampLayout" />
      </parameter>
      <parameter>
        <parameterName value="@log_level" />
        <dbType value="String" />
        <size value="50" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%p" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@logger" />
        <dbType value="String" />
        <size value="255" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%c" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@message" />
        <dbType value="String" />
        <size value="4000" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%m" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@exception" />
        <dbType value="String" />
        <size value="2000" />
        <layout type="log4net.Layout.ExceptionLayout" />
      </parameter>
    </appender>

    <root>
      <level value="ALL" />
      <appender-ref ref="AdoNetAppender" />
    </root>
  </log4net>
</configuration>
4b9b3361

Ответ 1

Вы можете отлаживать log4net, подключившись к log4net DebugAppender:

Добавьте параметр приложения log4net в файл app.config:

<appSettings>
  <!-- log4net configuration when running in debug mode. -->    
  <add key="log4net.Internal.Debug" value="true" />   
</appSettings>

Добавьте отладчик-отладчик в конфигурацию log4net:

<appender name="DebugAppender" type="log4net.Appender.DebugAppender">
  <immediateFlush value="true" />
  <layout type="log4net.Layout.SimpleLayout" />
</appender>

Добавьте приложение в корневой каталог log4net:

<root>
  <level value="ALL" />
  <appender-ref ref="AdoNetAppender" />
  <appender-ref ref="DebugAppender" />
</root>

При запуске приложения загляните в окно вывода Visual Studio, и вы увидите все внутренние протоколирования для log4net. Если нет, то конфигурационный файл log4net никогда не будет загружаться.

Edit

Если вы можете использовать строку подключения из файла app.config, удалите строку подключения из log4net AdoNetAppender и просто вызовите строку подключения по имени:

<appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
  <bufferSize value="1" />
  <!-- note: you can use the 4.0 assembly -->
  <connectionType value="System.Data.SqlClient.SqlConnection,
              System.Data, 
              Version=4.0.0.0, 
              Culture=neutral, 
              PublicKeyToken=b77a5c561934e089" />
  <!-- This will retrieve a connection string by name from the app.config -->
  <connectionStringName value="ConnectionStringNameFromAppConfig" />
  <!-- snip -->
</appender>

Ответ 2

Вот некоторые вещи, которые я пробовал, что сработало для меня...

  • Я ничего не видел, потому что мой <appender-ref ref="AdoNetAppender" /> неправильно ссылался на мой <appender name="AdoNetAppender" ... /> в Web.config. Названия 'AdoNetAppender' должны совпадать.

  • Добавлен <bufferSize value="1" /> в раздел <appender name="AdoNetAppender" /> Web.config

  • Я создал учетную запись пользователя с паролем на SQL-сервере вместо проверки подлинности Windows. Предоставленный пользовательский доступ для выполнения выбора и вставки в таблице

  • В Global.asax.cs Я инициализирую log4net, используя log4net.Config.XmlConfigurator.Configure();

  • В моем коде С# я создаю новый объект adoAppender и вызываю logger.Info("save to db");

Документация на веб-сайте Apache также полезна... http://logging.apache.org/log4net/release/config-examples.html#MS%20SQL%20Server

Надеюсь, что кто-то сэкономит время и разочарование. Спасибо!