log4netの問題を追跡する方法


191

私はいつもlog4netを使用していますが、内部で何が行われているのかをどのようにして伝えるかは、私が理解できなかったことの1つです。たとえば、プロジェクトにコンソールアペンダーとデータベースアペンダーがあります。データベースとコードにいくつかの変更を加えたところ、データベースアペンダーが機能しなくなりました。最終的には理由を理解しますが、log4netの内部で何が起こっているのかを確認できれば非常に役立ちます。

log4netは、問題の原因を特定するために表示できる出力を生成しますか?

回答:


293

まず、この値をアプリケーション構成ファイルに設定する必要があります。

<configuration>
   <appSettings>
      <add key="log4net.Internal.Debug" value="true"/>
   </appSettings>
</configuration>

次に、出力を保存するファイルを決定するために、同じ.configファイルに次のコードを追加できます。

<configuration>
...

<system.diagnostics>
    <trace autoflush="true">
        <listeners>
            <add 
                name="textWriterTraceListener" 
                type="System.Diagnostics.TextWriterTraceListener" 
                initializeData="C:\tmp\log4net.txt" />
        </listeners>
    </trace>
</system.diagnostics>

...
</configuration>

詳細な説明については、「log4netの内部デバッグを有効にするにはどうすればよいですか?」を参照してください。でlog4netのFAQページ


10
アプリケーションが実行されているプロセスに、ログテキストファイルを作成するパス(上の例では "C:\ tmp \ log4net.txt")に対する権限があることを確認してください
NMrt

3
内部デバッグにはタイムスタンプがないようです
snit80

4
からに変更するC:\tmp\log4net.txtC:\log4net.txt、テキストファイルを生成できます。
フランクMyat木2017

6
ちょっとしたメモ、楽しい方法を見つけました。<configSections></configSections>がの下の最初のエントリであることを確認してください<configuration>。そうしないと、エラーが発生します。
ニック

2
ログファイルのエントリの時間は表示されません。私は属性を設定しようとしましたtraceOutputOptions="TimeStamp"traceOutputOptions="DateTime"addタグが、それは、ログファイルの内容には何も変化しません。誰かがlog4netを設定して、トレースログファイルの各行/エントリの時間を表示する方法を知っていますか?
ユリシーズアルベス

43

log4net構成ファイルを使用している場合は、最上位ノードを次のように変更して、そこでデバッグをオンにすることもできます。

<log4net debug="true">

これは、設定がリロードされ、トレースリスナーが適切に設定されていると仮定すると機能します。


6
このフラグが有効になると、Visual Studioの[出力]ウィンドウ内でlog4netからの診断ログを表示できるようになります
Naren

24

上記の回答に加えて、この行を使用して、c:\ tmp \ log4net.txt出力の代わりにリアルタイムでログを表示できます。

log4net.Util.LogLog.InternalDebugging = true;

たとえば、コンソールアプリでは、これを追加して、出力をリアルタイムで監視できます。小さなテストハーネスでlog4netをデバッグして、テストしているアペンダーで何が起こっているかを確認するのに適しています。


8

エントリポイントのあるルートアプリケーションが、何かをlog4netに記録していることを確認してください。次のいずれかを指定します。

private static ILog logger = LogManager.GetLogger(typeof(Program));
static void Main(string[] args)
{
    logger.InfoFormat("{0} v.{1} started.", Assembly.GetExecutingAssembly().GetName().Name, Assembly.GetExecutingAssembly().GetName().Version.ToString());

2.0.8で、面白い状況になりました。ライブラリプロジェクトと、その機能をデモするテストexeプロジェクトを作成しました。ライブラリプロジェクトは、exeプロジェクトと同様にLog4netを使用するように設定されました。exeプロジェクトはassemblyinfo属性を使用して構成を登録しましたが、コンソールまたはログファイルへのログ出力がありませんでした。log4netの内部デバッグロギングをオンにすると、いくつかの内部メッセージがコンソールに書き込まれましたが、それでも通常のログはありません。エラーは報告されていません。上記のコードをプログラムに追加すると、すべてが機能し始めました。そうでない場合、Log4netは正しくセットアップされました。


1
保存された鉱山も:-)
コスタ

2

内部ログで十分な情報が得られない場合、ソースコードのビルドとデバッグは非常に簡単です。これを開発プロジェクトと混同したくない場合は、メッセージを記録するだけの単純なコンソールアプリケーションを追加し、プロジェクトlog4net.configをこのアプリケーションにコピーして、問題のクラスをデバッグします。


2

log4net 2.0.8では、別のDLLでlog4netを使用してロギングを行うことができないようです。私がこれを試した場合、結果は非常に奇妙です:ロギングはもはや実行されません。また、デバッグオプションを使用したlog4netの初期化では、エラーは表示されません。

K0D4が言ったように、メインモジュールにlog4netへの参照があり、プログラムの開始時に一度呼び出すだけで問題ありません。

log4netの次のバージョンでは、このバグはおそらく修正されるでしょう。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.