4

Web アプリケーションに log4net を組み込もうとしています。.net mvc に基づく新しい部分を既に使用していますが、アプリの Web フォーム ベースの部分に組み込むのに問題があります。例を探してみましたが、見つけられませんでした。

質問を絞り込むために、web.config ファイルの構成方法を知っていると仮定しましょう。私の質問は次のとおりです。

(1)log4netへの実際の呼び出しを「Global.asax」ファイルに配置することと、ベースページ(他のすべてのページが構築されている)に配置することを検討しました。これらの場所のいずれかに実際のコードを配置する必要がありますか? そうでない場合は、どこにコードを配置する必要がありますか?

(2) コードについての私の理解では、ログをインスタンス化する必要があり、必要なときにそのログログを取得する必要があります (ログの詳細は web.config によって処理されます) が、わかりませんそのコードが実際にどのように見えるべきか。では、実際にファイルに配置する必要があるコードは何ですか? (例をいただければ幸いです)

ありがとう

4

3 に答える 3

7

必要な場所にコードを配置するだけです。

開始するには、必要なすべてのページでこの行を使用するだけです...

static Logger log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

そのため、ロガーは完全な名前空間を含む現在のクラスの名前を取得します。また、global.asax でロガーを使用して、エラー ログを記録します。

protected void Application_Error(object sender, EventArgs e)
    {
        StringBuilder sb = new StringBuilder();
        sb.Append("Unhandled error occured in application. Sender: ");
        sb.AppendLine(Request.RawUrl);
        sb.Append("Query: ");
        sb.AppendLine(Request.QueryString.ToString());

        Exception ex = Server.GetLastError().GetBaseException();

        log.Error(sb.ToString(), ex);
        Server.ClearError();

        Response.Redirect("~/Error.aspx");
    }

しかし、私はログ構成をweb.configから分離しています。私にとっては簡単で、それほど大きなファイルを処理する必要はありません。また、ログ構成ファイルを変更すると、アプリケーションが再起動されないと思います。web.config を更新すると、私の知る限り、アプリケーションは常に再起動されます。

これを達成するには、追加でweb.configに以下を追加するだけです

<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>

この行を web.config のどこかに追加するよりも

<log4net configSource="log.config"/>

そして、ファイル「log.config」にはすべてのリスナーが構成されています。ただし、ファイルを本番/テスト環境にコピーすることを忘れないでください。そうしないと、奇妙なエラー メッセージが表示される場合があります。

h番目

于 2012-08-01T15:10:32.990 に答える
1

ベースページに配置するのは良い考えのように思えます。GetLoggerを使用してインスタンス化するときに、ログを記録しているページを渡すことができます(ログ呼び出しの発信元をできるだけ具体的に指定すると、デバッグに役立ちます)。また、インスタンス化後に.Configureを呼び出す必要があります。これは、常に私を捕らえるものです(これには、Log4Net.Configureをインポートする必要があります)。

リスナー構成をweb.configに配置し、LevelRangeFilterを介して最小/最大レベルを定義します(DEBUGが最も低く、FATALが最も高くなります)。

使用法は非常に簡単です-必要なレベルでログを記録するだけです、例えば:log.Info、log.InfoFormat、log.Error、log.ErrorFormat(フォーマットはString.Formatのように機能します)-最小構成ログレベルより下のすべては無視されるので、好きなだけログインできます。

Elmahもチェックしましたか?これにより、未処理の例外を追跡できます。http://code.google.com/p/elmah/

于 2012-08-01T14:56:46.193 に答える
0

ロガーを使用した私の経験を共有しましょう。通常は IOC コンテナー、つまり Windsor で使用します。そのため、アプリケーションごとに 1 回実行され、すべての要求を無視するため、Global.asax ファイルで作成するロガーの初期化を行います。これは、ロガーを初期化する適切な場所です。ログを呼び出す場所については、推奨事項はありません。必要なところに電話する必要があります。ページのライフサイクルに基づいていくつかのイベントをログに記録している場合は、もちろん、ページ コード ビハインド ファイルでロガーを使用する必要があります。ただし、コンポーネントをトレースする場合は、ロジックを別のライブラリに抽出し、その中でロガーを使用することをお勧めします。

于 2012-08-01T15:01:00.443 に答える