Log4net用に同じように構成された2つのプロジェクトがあります。 1つのプロジェクトは正常にログに記録されます。ただし、もう一方はまったくログに記録されません。
ログに記録されていないプロジェクトのLogger
は、IsFatalEnabled = false
、IsErrorEnabled = false
、IsWarnEnabled = false
、IsInforEnabled = 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");
}
}
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)]
私にとっての解決策は、プログラムの起動コードでXmlConfigurator.Configure()
を使用することでした。ただし、Autofac.log4netモジュールを使用してILog
をAutofacコンテナーに登録していたという点で状況は異なりました。この場合、XmlConfiguratorAttribute
を使用すると(Watch
がtrueまたはfalseに設定されている場合)、ロガーは未構成のままになります。