2

参照してください: log4netを使用して IP をログに記録する方法を説明する、Log4Net で IP アドレスのログを有効にする方法。

私の問題は、場合によっては、セッションに属する余分なスレッドが生成されることです。正しいIPでログを記録できるようにするには、log4net(またはスレッド)を理解する必要があります。

現在、追加のスレッドが生成されると、スレッドは IP ではなく (null) としてログ ファイルに記録されます。

セッションに関連するすべてのスレッドがリモート ホストの IP を認識していることを確認するにはどうすればよいですか?

4

2 に答える 2

4

解決策は次のとおりです。

public static class MyLogManager
{
    public static ILog GetThreadAwareIPLogger(string loggerid)
    {
        if (log4net.ThreadContext.Properties["ip"] == null || !string.IsNullOrEmpty(log4net.ThreadContext.Properties["ip"].ToString()))
            log4net.ThreadContext.Properties["ip"] = HttpContext.Current.Request.UserHostAddress.PadLeft(15);

        return LogManager.GetLogger(loggerid);
    }
}

これは解決策の始まりにすぎません。ポイントは、独自の public static クラス内で (そうでなければ) シールされたクラスを使用して、新しい Thread-Aware/Session-Aware Logger-factory を作成することです。

どのセッションから作成/生成されたかを認識し、新しいロガーを要求するとスレッドの ThreadContext に IP を自動的に設定する log4net ILog インスタンスを取得します。これが他の誰かに役立つことを願っています:-)

于 2009-11-26T22:34:55.163 に答える
1
  1. セッションが処理している IP アドレスをセッションに認識させます。
  2. そのセッション用に新しいスレッドが作成されたら、開始する前に、コンストラクターまたはセッターを介して IP アドレスを指定します。
  3. スレッドThreadContext.Propertiesが実行を開始するときに、スレッドにその情報を入れてもらいます。

スレッド プールを使用している場合は、これを少し変更する必要があるかもしれませんが、基本的な原則は同じです。

于 2009-11-25T21:33:16.137 に答える