0

データベースのデバッグにlog4netのadonetアペンダーを使用しています。ロギングレベルがエラーに設定されています。データベースロギングは、Oracleデータベース上の同じテーブルに書き込む異なるサーバーで実行されている2つのアプリケーション用に構成されています。テーブルの列はloginId、levelでした。私が直面している問題は次のとおりです。

  1. ロギングレベルがエラーに設定されていても、一部の情報レベルのステートメントもテーブルに表示され、対応するレベルの列はエラーとして表示されています。

  2. 一部のステートメントの間に、ログインIDは、アプリケーションを実行している実際のユーザーのログインIDとは異なって表示されます。

  3. したがって、自律的に動作するようにさまざまなサーバーでlog4netを構成する方法。

編集:これらの問題に直面しているのは、アプリケーションの複数のインスタンスを実行している場合のみです。それ以外の場合は、log4netロギングで問題ありません。

シナリオ:公開されたバージョンのアプリケーションを、ログインIDが異なる2つのブラウザーで参照し、ブラウザーごとに異なるフローを実行しました。その結果、ログインIDがごちゃごちゃになりました。コードのユーザーセッションからログインID値を取得し、log4net.GlobalContext.Propertiesに保存しています。

いくつかの調査の結果、http://logging.apache.org/log4net/release/manual/contexts.htmllog4net.GlobalContext.Propertiesにある代替案があることがわかりました。グローバルの代わりに使うべきだと思います。ThreadContext.Properties

に保存することで問題に直面していると思いますlog4net.GlobalContext.Properties

問題1:コードを確認したところ、ステートメントはでしたlogger.info。しかし、データベーステーブルでは、エラーレベルでログに記録されていました。

問題2:ログインIDのコード:

user = (User)Session["User"]; 
log4net.GlobalContext.Properties["LOGINID"] = user.Login;

web.configで。

global.propertiesの代わりにThreadContext.Propertiesを使用できると思われる場合は、login_idに使用する方法を教えてください。

4

1 に答える 1

0

これをコメントとして投稿し始めましたが、具体的な回答を提供するために必要な詳細はありませんが、正しい方向に向けることができることに気付きました.

問題 1 : Info ステートメントであるが、エラー ステートメントとしてマークされているデータベース内のステートメントを取得している場合、これはコードの問題です。ログステートメントがどのレベルであるかをlog4netに伝える必要があります。「Hello World」ステートメントは致命的なエラーであると言えます。プログラムは、情報メッセージとしてマークしたいメッセージをログに送信しているようですが、エラーステートメントとしてマークされています。これらのステートメントがログ ファイルに送信される場所を確認すると、ステートメントが表示されますlog.ERROR。それをに変更すると、準備log.INFO完了です。

問題 2 : ログイン ID は、ログ ステートメントを実行したユーザーを示す必要があります。つまり、別のアカウントで (アクセス許可のために) 何かを実行した場合、またはサービス アカウントを使用した場合、マウスをクリックした人ではなく、そのユーザーがログに記録されます。ユーザー情報をどのように記録しているかを示していただければ、これを修正する方法をより具体的に説明できます。

問題 3 : ここで何を意味するのかわかりません。Log4net は自律的に動作します。それがほのめかしている場合は、複数のサーバーで同じ構成を問題なく使用することもできます。

問題に固有のより完全な回答が必要な場合は、log4net 構成ファイルと関連するコードを投稿してください (INFO ステートメントをログに記録している場所と、ユーザー ID をログに記録する方法が適切な出発点になります)。 .

于 2011-07-10T15:43:28.090 に答える