4

私は Log4Net の初心者であり、それがどのように機能するかについて基本的/安全な理解を得ようとしています。Logger を FileAppender に構成し、以下のような複数のステートメントを次々に作成した場合:

this.GetLogger().Info("...");
this.GetLogger().Error("....");

各呼び出しは実際にファイルを開き、文字列を書き込んで閉じますか? 毎回?それとも他に何かありますか?ファイル リソースがいつ使用されているかを知りたい。それはどのように機能しますか?

4

1 に答える 1

8

ドキュメント:

このアペンダーは、ActivateOptions が呼び出されると、最初に書き込み用にファイルを開こうとします。これは通常、構成中に行われます。ファイルを書き込み用に開くことができない場合、メッセージがアペンダーに記録されるたびに、アペンダーはファイルを再度開こうとします。メッセージがログに記録されたときに書き込み用にファイルを開くことができない場合、メッセージはこのアペンダーによって破棄されます。

つまり、ログを記録しようとするたびに余分なオーバーヘッドが発生しないように、できるだけ早くファイルを開こうとします。それが失敗すると、何かを記録しようとするたびにファイルを開こうとします。

特定のインスタンスでログがどのように動作するかを簡単に確認できます。ファイルが開かれるたびにレイアウトのヘッダー値がファイルに書き込まれ、ファイルが閉じられるたびにレイアウトのフッター値が書き込まれます。

ただし、これがデフォルトの動作であることに注意してください。FileAppenderは、FileAppender.ExclusiveLockデフォルトでロック モデルを使用します。もう 1 つのオプションは、FileAppender.MinimalLock各ログ操作の前にロックを取得し、後で解放しようとするロック モデルです。アペンダーを使用するには、次のように構成できます。

<appender name="FileAppender" type="log4net.Appender.FileAppender">
    <file value="${TMP}\log-file.txt" />
    <appendToFile value="true" />
    <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
    <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
    </layout>
</appender>

ロギング操作ごとにロックを取得することは、デフォルトの「1 回取得して 1 回解放する」モデルよりも明らかに時間がかかります。ただし、これには正当な理由があります。たとえば、長時間実行されるアプリケーションの実行中にログファイルをローテーションする必要がある場合などです。

于 2013-01-15T21:11:19.587 に答える