3

JBoss で実行される Java EE Web アプリケーションを開発しています。

次のことをしたい: ユーザーが http 要求を送信すると (ページを開くか、AJAX を介して)、この要求に関連するすべてのログが収集され、データベースに保存されます。関連とは、現在のリクエストを処理するプロセス中にログに記録されていることを意味します。最も難しいのは、単一のリクエストに関連するログを収集することです。

私はこの解決策を調べていました:

JBoss はロギングに log4j を使用します。アプリが起動すると、開始リスナーは、すべてのログを ThreadLocal フィールドに収集する log4j アペンダーを登録します。リクエスト処理の最後に、フィールドからログが取得され、DB に保存されます。

しかし、今では、log4j アペンダーが他のスレッドで動作するようです。これにより、このソリューションは不可能になります。

どうやってこれを作ることができるか、何か考えがありますか?

ありがとう、アルテム B.

4

1 に答える 1

7

log4j MDC クラス(Mapped Diagnostic Context) を使用して、特定のデータを現在のスレッドに関連付けることができます。

私はこれをよく使用して、そのセッションで行われているログのログ出力にセッション ID を追加します。

public class AddSessionIdToLogFilter implements Filter {

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException,
            ServletException {

            if (request instanceof HttpServletRequest) {
                HttpServletRequest httpRequest = (HttpServletRequest) request;
                String sessionID = httpRequest.getSession().getId();

                MDC.put("SessionID", sessionID);
            }   

            ...

次に、PatternLayout のキーで MDC を参照するだけです。DBアペンダーがどのように機能するかはわかりませんが、MDCフィールドもログに記録できると思います...

log4j.appender.LOGFILE.layout.ConversionPattern= ... [SessionID=%X{SessionID}] ...
于 2009-04-23T14:39:51.293 に答える