3

各ログにユーザー名を追加しようとしています。MDC がそれを行うための適切なソリューションであることがわかり、そのチュートリアルに従いました。

テスト用のログ スニペットを次に示します。ユーザー名の代わりに「TEST」という単語を出力します。

2013-09-30 11:24:03,087 INFO  company.filter.AuthenticationFilter - TEST - AuthenticationFilter is called
2013-09-30 11:24:03,089 INFO  company.filter.AuthenticationFilter - TEST - userName is removed
2013-09-30 11:24:03,089 INFO  company.filter.AuthenticationFilter - TEST - AuthenticationFilter is called
2013-09-30 11:24:03,089 INFO  company.filter.AuthenticationFilter - TEST - userName is removed
2013-09-30 11:24:03,093 INFO  company.interceptors.AuthentificationInterceptor -  - Interceptor, actionName : Company_getTab redirect to Login_timeOut : false
2013-09-30 11:24:03,094 INFO  company.interceptors.AuthentificationInterceptor -  - Interceptor, actionName : Company_getTop redirect to Login_timeOut : false
2013-09-30 11:24:03,095 INFO  company.interceptors.AuthentificationInterceptor -  - Interceptor, actionName : Company_getBottom redirect to Login_timeOut : false
2013-09-30 11:24:03,124 INFO  company.actions.CompanyAction -  - sample log

ご覧のとおりAuthenticationFilter、Struts2 のインターセプターやアクションでは機能せず、 でのみ機能するようです。私はこのように実装AuthenticationFilterしました:

public class AuthenticationFilter implements Filter {
  private final Logger logger = Logger.getLogger(AuthenticationFilter.class);

  @Override
  public void doFilter(ServletRequest request, ServletResponse response,
        FilterChain chain) throws IOException, ServletException {

    try {
        MDC.put("userName", "TEST");
        logger.info("AuthenticationFilter is called");
        chain.doFilter(request, response);
    } finally {
        logger.info("userName is removed.");
        MDC.remove("userName");
    }
  }

  @Override
  public void destroy() {}

  @Override
  public void init(FilterConfig arg0) throws ServletException {}
}

これをファイルに追加しましたweb.xml

    <filter>
        <filter-name>AuthFilter</filter-name>
        <filter-class>company.filter.AuthenticationFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>AuthFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

そして、これは私が使用するパターンですlog4j.xml

<layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d %-5p %c - %X{userName} - %m%n"/>
</layout>

MDCについてわからないことがあると思います。MDCはリクエストごとに呼び出されるので、マップを設定できThreadLocal、各リクエストには独自のスレッドがあると思いました(私ThreadLocalも正しく理解していない可能性があります)。

構成で MDC を使用できるようにするには、何を調べて変更する必要がありますか?

編集:

ログを追加したので、マップからのデータがいつ削除されたかを確認できます。最初のアクション/インターセプター ログの前のマップには何もありません。私は次のようなものを見ると思っていました:

  • AuthenticationFilter - テスト -
  • インターセプターのログ
  • AuthenticationFilter userName が削除されました
4

0 に答える 0