Log4Jに組み込まれているMDC/NDC機能を使用して実現するのは実際には非常に簡単です(SLF4JとLogbackはMDCのみをサポートします)。
MDCフィルターの実装
まず、ユーザー名をMDC/NDCに追加するサーブレットフィルターを実装します。Logbackは便利なMDCInsertingServletFilterを提供し、SpringフレームワークはLog4jNestedDiagnosticContextFilterもストアに追加します。それらを見てください、しかしあなたはこのようなカスタムのものを必要とするでしょう:
public class UserToMdcFilter implements javax.servlet.Filter
{
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
MDC.put("user", SecurityContextHolder.getContext().getAuthentication().getPrincipal());
try {
chain.doFilter(request, response);
} finally {
MDC.remove("user");
}
}
//...
}
ロギングパターンにMDC値を追加する
web.xml
このフィルターがSpringセキュリティフィルターの後に適用されていることを確認してください。MDC機能は非常に優れています。要求された場合、MDCスレッドローカルマップに保存されているすべての値がすべてのロギングステートメントに追加されます。あなたの場合、これを追加するだけです:
%X{user}
ロギングパターンに。
目立たないロギングメソッドのパラメータ/値
ロギングメソッド名、パラメーター、および戻り値はユーザー次第です(ユーザー名は自動的に追加されます)が、定型的なロギングコードを完全に削除するための洗練された方法がいくつかあります。このSpringの組み込みアスペクトを試してください。
<bean id="customizableTraceInterceptor" class="org.springframework.aop.interceptor.CustomizableTraceInterceptor">
<property name="enterMessage" value="Entering $[methodName]($[arguments])"/>
<property name="exitMessage" value="Leaving $[methodName](): $[returnValue]"/>
</bean>
<aop:config>
<aop:advisor advice-ref="customizableTraceInterceptor" pointcut="execution(public * BankAccountServlet.*(..))"/>
</aop:config>
最終的な考え