web-dev-qa-db-ja.com

Log4netはランダムにロギングを停止します。

現在、log4netを使用してロギングにASP.Net-MVCアプリケーションを構築していますが、ロガーがランダムに停止しているようです。しばらくの間は問題なくログに記録され、その後停止し、しばらくすると再開されます。ロギングを再開する理由が何であるかさえわかりません。いくつかのメッセージが失われることについて話しているのではありません。1時間程度など、長期間にわたってメッセージが消えることがあります。

なぜこのように停止して開始するのでしょうか?これを適切に構成して、ランダムに停止しないようにするにはどうすればよいですか?

これが私の設定です:

<log4net debug="true">
<appender name="RollingLogFileAppender"
        type="log4net.Appender.RollingFileAppender">

  <file value="..\Logs\\CurrentLog.txt" />
  <appendToFile value="true" />
  <datePattern value="yyyyMMdd" />

  <rollingStyle value="Date" />
  <filter type="log4net.Filter.LevelRangeFilter">
    <acceptOnMatch value="true" />

    <levelMin value="INFO" />
    <levelMax value="FATAL" />
  </filter>

  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern
    value="%-5p %d %5rms %-22.22c{1} %-18.18M - %m%n" />
  </layout>

</appender>

<root>
  <level value="INFO" />
  <appender-ref ref="RollingLogFileAppender" />
</root>
33
Jacob Bellamy

Log4Netは サイレントに失敗します 何か問題が発生し、アペンダーに書き込めない場合。これは実際には良いことです。これは、ロギングに少し失敗しても、他の点では正常なシステムがダウンしないことを意味しますが、期待どおりにロギングが行われていないと煩わしい場合があります。

あなたの最善の策は、log4net自体をオンにすることです 内部ロギング いくつかの診断を行い、(うまくいけば)それが失敗する理由を解明します。

したがって、アプリの構成ファイルに次を追加します。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <appSettings>
        <add key="log4net.Internal.Debug" value="true"/>
    </appSettings>
</configuration>

これにより、System.Diagnostics.Traceに送信される内部ログがオンになるため、次を追加できます。

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

これをファイルにキャプチャします。

58
Alconja

アプリケーションのライフサイクルのできるだけ早い段階でテストログメッセージを送信します。単純なLogManager.GetLogger("Init").Info("Starting logging")で十分です。他の参照コードが最初にロギングを開始すると、初期化プロセスの一部が失敗する可能性があります(別のアセンブリから設定をロードするため、一度だけ実行されます)。

ここを読んでください: https://logging.Apache.org/log4net/release/faq.html#first-log

1
user3638471

Log4Netでしばらく苦労した後、ログ記録が完全に停止することがわかりました。何を試しても、元に戻すことができませんでした。コードの最初の数行でログを初期化しないと問題があるようですが、別のプログラムなどによってロードされたdll内でログを確実に機能させるには、あいまいな表示では不十分でした。

私も内部ログをアクティブにすることができませんでした。

私はついに、Log4Netを使用してログを確実に作成するためにプログラムが呼び出すことができる専用のdllを作成することを決心しました。 dllはそれだけを行い、ログを作成するコードは分離され、変更されることはありません。このようにして、ログファイルを確実に作成して書き込むことができると思います。これまでのところ、このアプローチにより、私が数え切れないほどの苛立たしい時間を費やしていたログオンの問題が修正されました。

私はこのSOスレッドにコードを投稿しました:

stackoverflow.com/questions/308436/log4net-programmatically-specify-multiple-loggers-with-multiple-file-appenders

0
pasx

また、log4netがAssemblyInfo.csファイルでまだ構成されているかどうかも確認してください。私の場合、チェックインにより、このファイルから次の行が削除されました。

[アセンブリ:log4net.Config.XmlConfigurator(Watch = true)]

その結果、log4netはロギングを停止しました...

0
Sego