web-dev-qa-db-ja.com

log4netはapp.configから読み取りません

Log4net用に同じように構成された2つのプロジェクトがあります。 1つのプロジェクトは正常にログに記録されます。ただし、もう一方はまったくログに記録されません。

ログに記録されていないプロジェクトのLoggerは、IsFatalEnabled = falseIsErrorEnabled = falseIsWarnEnabled = falseIsInforEnabled = false、およびIsDebugEnabled = falseを返します。

あるプロジェクトから別のプロジェクトにコピーして貼り付け、ファイルを完全に置き換えて、すべての空白を削除してみました。

1つのプロジェクトがapp.configから正しいレベルを正しく読み取っていない原因は何でしょうか。

app.config:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
  </configSections>
  <log4net>
    <appender name="FileAppender" type="log4net.Appender.FileAppender">
      <file value="logfile.txt" />
      <appendToFile value="true" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date: %-5level – %message%newline" />
      </layout>
    </appender>
    <root>
      <level value="DEBUG" />
      <appender-ref ref="FileAppender" />
    </root>
  </log4net>
</configuration>

Program.cs

using log4net;

class Program
{
    private static readonly ILog Log = LogManager.GetLogger("SO");

    static void Main(string[] args)
    {
        Log.Info("SO starting");
    }
}
24
Even Mien

App.configファイルがlog4netで監視されるように構成されていないようです。

AssemblyInfo.csに次の行を追加すると、ログが有効になります。

[Assembly: log4net.Config.XmlConfigurator(Watch = true)]

奇妙なことに、私はこの行を作業中のプロジェクトに追加しなかったので。

編集:

結局、機能していたプロジェクトには線があったようです。忘れたに違いない。

// This will cause log4net to look for a configuration file 
// called [ThisApp].exe.config in the application base 
// directory (i.e. the directory containing [ThisApp].exe) 
// The config file will be watched for changes. 
[Assembly: log4net.Config.XmlConfigurator(Watch = true)]
43
Even Mien

私にとっての解決策は、プログラムの起動コードでXmlConfigurator.Configure()を使用することでした。ただし、Autofac.log4netモジュールを使用してILogをAutofacコンテナーに登録していたという点で状況は異なりました。この場合、XmlConfiguratorAttributeを使用すると(Watchがtrueまたはfalseに設定されている場合)、ロガーは未構成のままになります。

1
Josh Gallagher