2

私の通常のロギング経験では、 のILogようなものを使用して各クラスにインスタンスを作成するだけで、インスタンスごとmylog = LogManager.GetLogger( name)に一意の Logger が得られます。すべてが同じファイルに記録され、うまく機能します。

しかし、今では 2 つの別々のファイルにログを記録したい状況があります。次の logging.xml を使用してこれを実現します。

<?xml version="1.0" encoding="utf-8"?>
<log4net>
  <appender name="Console" type="log4net.Appender.ConsoleAppender">
    <filter type="log4net.Filter.LevelRangeFilter">
      <param name="LevelMin" value="INFO"/>
      <param name="LevelMax" value="FATAL"/>
    </filter>
    <layout type="log4net.Layout.PatternLayout">
      <!-- Pattern to output the caller's file name and line number -->
      <conversionPattern value="%date{yyyy-MM-dd-HH_mm_ss.fff} [%thread] %-5level %logger - %message%newline" />
    </layout>
  </appender>

  <appender name="File" type="log4net.Appender.FileAppender">
    <file type="log4net.Util.PatternString" value="%property{LogName}" />
    <appendToFile value="true" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date{yyyy-MM-dd-HH_mm_ss.fff} [%thread] %-5level %logger - %message%newline" />
    </layout>
  </appender>

  <root>
    <level value="DEBUG" />
    <appender-ref ref="Console" />
    <appender-ref ref="File" />
  </root>
</log4net>

コード ビハインドではFileAppender、一意の名前を付けて、インスタンスごとに名前を設定します。

log4net.GlobalContext.Properties["LogName"] = unique_path_here;

「test1」というオブジェクトを 1 つインスタンス化すると、「test1.log」ファイルが作成されます。「test2」という別のオブジェクトをインスタンス化すると、「test2.log」ファイルが作成されます。各オブジェクトでメソッドを呼び出し始めるまで、すべてがうまく機能しているように見えます。呼び出しを交互に行うと、最初は 1 つのオブジェクトのデータが他のオブジェクトのファイルに書き込まれますが、その後、データが正しいファイルに記録されます。たとえば、何が起こるかの簡単な例を次に示します。

  1. test1.log() -> test1.log に書き込みます
  2. test2.log() -> test2.log に書き込みます
  3. test1.log() -> test2.log に 1 行を書き込み、残りは test1.log に書き込みます
  4. test2.log() -> lint を test1.log に書き込み、残りは test2.log に書き込みます

2 つの方法を並行して実行すると、すべての行がいずれかのファイルに書き込まれます。次に、本当に奇妙なのは、ほとんど使用されている他のファイルが二度と書き込まれないことです!

次にどこを見るべきかわかりません。GetLogger を介して Logger インスタンスを作成し、それに一意の名前を渡し、これがプライベート メンバー変数である場合、間違ったファイルへの書き込みが開始される可能性はありますか?

4

1 に答える 1

0

「GlobalContext」がクラス名に疑わしいことは明らかです。:) これを調べて、プロパティがすべての Logger インスタンスで共有されていることに問題があるかどうかを確認します。共有されている場合は、特定のログ インスタンスのログ名を設定する別の方法があるかどうかを確認します。

編集 - そうではありませんでした。logging.xml のプロパティを に置き換えて<File value="TEMP" />から、コード ビハインドで をロードし、FileAppenderそのFileプロパティを正しいパスに設定しました。動作は同じです。:(

編集 - 解決策は、FileAppenderインスタンスごとではなく、インスタンスごとに作成することLoggerです。その結論に至るまでになぜそんなに時間がかかったのかはわかりませんが、最終的にはそうしましたが、今ではうまくいっているようです.

于 2012-12-11T20:53:26.950 に答える