1

こんにちは、ログインしたユーザーID、ホスト名、IPアドレスなどをログパターンに表示したいと思います。同じためにlog4jを使用しています。MDCを使用しています。私のメインコントローラーでは、指定されたパターンでログを表示できますが、他のファイルログではパターンを表示できません。セッションで MDC を設定し、コンテキスト値を他のコントローラーに再度配置したようなものですか? 提案してください。

log4j.properties

log4j.rootLogger=INFO,CONSOLE,R
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=C:/Logs/Test.log
log4j.appender.R.ImmediateFlush=true
log4j.appender.R.Append=true
log4j.appender.R.MaxFileSize=10MB
log4j.appender.R.MaxBackupIndex=10
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%d %X{ipAddress} %X{hostName} %X{Asif}- %c - %p - %m%n

---------------------------------
MainController.java
try {
        MDC.put("Asif", "Asif");
        MDC.put("ipAddress", request.getRemoteAddr());
        MDC.put("hostName", request.getServerName());
        logger.info("Context Info : " +    MDC.get("userId")+MDC.get("ipAddress")+MDC.get("hostName"));

    } finally {
        MDC.remove("ipAddress");
        MDC.remove("hostName");
        MDC.remove("Asif");
        MDC.clear();
    }

他にもさまざまなコントローラーがあります。現在、メイン コントローラー内の logger ステートメントはログ パターンにコンテキスト情報を表示していますが、他のコントローラーのその他のログ メッセージにはコンテキスト情報が表示されていません。

私の質問。1. すべてのコントローラーにコンテキスト情報を追加する必要がありますか? 2. より良いアプローチはありますか? 3. 何か不足していますか?

4

1 に答える 1

1

MDC 属性は「スレッドごと」になります。2 つのコントローラーが同じスレッドを共有していない場合、それらには MDC 属性がありません。これは、説明しているケースです。

以下を試してください。

フィルターを作成します。

public class MDCFilter implements Filter {
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        try {
            MDC.put("Asif", "Asif");
            MDC.put("ipAddress", request.getRemoteAddr());
            MDC.put("hostName", request.getServerName());
            chain.doFilter(request, response);
        } finally {
            MDC.remove("ipAddress");
            MDC.remove("hostName");
            MDC.remove("Asif");
            MDC.clear();
        }
    }
}

次に、それをすべてのサーブレット (web.xml) にマップします。

<filter>
    <filter-name>MDCFilter</filter-name>
    <filter-class>{your package}MDCFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>MDCFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

上記を実行することで、すべてのコントローラー/サーブレット/エンドポイントに必要な MDC 属性が設定されます。

幸運を!

于 2015-09-26T13:02:50.063 に答える