web-dev-qa-db-ja.com

log4Netに構成データにアプリケーション構成ファイルを使用させる

Log4net構成データをapplication.configファイルに保存したいと思います。ドキュメントの理解に基づいて、次のことを行いました。

  1. Log4net.dllへの参照を追加します

  2. AssemblyInfo.csに次の行を追加します。

    [Assembly: log4net.Config.XmlConfigurator(Watch = true)]
    
  3. 次のようにロガーを初期化します。

    private static readonly ILog log = LogManager.GetLogger(typeof(frmWizard));
    
  4. App.configに次のコードがあります。

    <configSections>
      <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
    </configSections>
    <log4net>
      <appender name="EventLogAppender" type="log4net.Appender.EventLogAppender" >
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
        </layout>
      </appender>
      <root>
        <level value="INFO" />
        <appender-ref ref="ConsoleAppender" />
      </root>
    </log4net>

ただし、アプリケーションを実行すると、コンソールに次のエラーが表示されます。

[Consoleappender]という名前のアペンダーが見つかりませんでした。

設定ファイルから設定を読み取るためにlog4netを取得するにはどうすればよいですか?

ありがとう!

49
laconicdev

ConfigSections要素でapp.configに行を追加します

<configSections>
 <section name="log4net" 
   type="log4net.Config.Log4NetConfigurationSectionHandler, log4net, Version=1.2.10.0, 
         Culture=neutral, PublicKeyToken=1b44e1d426115821" />
</configSections>

その後、後でlog4Netセクションを追加しますが、実際のlog4Net構成ファイルに委任します...

<log4net configSource="Config\Log4Net.config" />

アプリケーションコードで、ログを作成するときに次のように記述します。

private static ILog GetLog(string logName)
{
    ILog log = LogManager.GetLogger(logName);
    return log;
}
38
Charles Bretana

質問に示されている構成から、構成されているアペンダーが1つだけあり、「EventLogAppender」という名前が付けられています。しかし、ルートの構成では、作成者は「ConsoleAppender」という名前のアペンダーを参照しているため、エラーメッセージが表示されます。

35
Konstantin

configsectionハンドラーをapp.configに追加しようとしましたか?例えば.

<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>

@Charles Bretanaの答えを完全にサポートします。ただし、機能しない場合は、<section>要素が1つだけ存在し、configSectionsルート要素の最初の子

configsectionsは、構成後のapp.Configの最初の要素である必要があります。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="log4net"  type="log4net.Config.Log4NetConfigurationSectionHandler, log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=1b44e1d426115821" />
  </configSections>
  <!-- add log 4 net config !-->
  <!-- add others e.g. <startup> !-->
</configuration>
2
Nick N.

すべてのアペンダー名はルートセクションに反映する必要があります。
あなたの場合、アペンダー名はEventLogAppenderですが、<root> <appender-ref ..セクションではConsoleAppender。彼らは一致する必要があります。

ログ設定に複数のアペンダーを追加できますが、それぞれを<root>セクションに登録する必要があります。

<appender-ref ref="ConsoleAppender" />
<appender-ref ref="EventLogAppender" />

Log4netの設定でApache documentation を参照することもできます。

1
Shekhar