7

アプリケーションで log4j と spring-security を使用しています。ロガーはすべてのメッセージにユーザー名を含むログを書き込む必要があります。私はこれらすべてに非常に慣れていません。誰かがアドバイスやリンクを手伝ってくれますか? 多分これを解決するいくつかの標準的な方法がありますか?ありがとうございました。

EDIT spring framework 3.1 を使用する私の spring-security.xml は次のとおりです。

<beans:beans xmlns="http://www.springframework.org/schema/security"
xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/security 
    http://www.springframework.org/schema/security/spring-security-3.1.xsd">

    <http pattern="/favicon.ico" security="none" />
    <http auto-config="true">
            <intercept-url pattern="/**" access="ROLE_ADMIN"/>
    </http>

<authentication-manager>
    <authentication-provider>
        <user-service>
            <user name="detect_me" password="1111" authorities="ROLE_ADMIN" />
        </user-service>
    </authentication-provider>
</authentication-manager>

そして log4j.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'>    
    <appender name="stdout" class="org.apache.log4j.ConsoleAppender">
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d %p [%c] - %m%n" />
        </layout>
    </appender>
    <appender name="R" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="File" value="/logs/urlbuilderweb.log"/>
        <param name="DatePattern" value="'.'yyyy-MM-dd'.log'" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d %p %t %c - %m%n" />            
        </layout>
    </appender>
    <appender name="ASYNC" class="org.apache.log4j.AsyncAppender">
        <param name="BufferSize" value="10000"/>
        <appender-ref ref="R"/>
    </appender>
    <logger name="org.springframework">
        <level value="WARN"/>
    </logger>
    <logger name="org.directwebremoting">
        <level value="WARN"/>
    </logger>
    <logger name="org.apache.http">
        <level value="WARN"/>
    </logger>
    <logger name="org.hibernate">
        <level value="WARN"/>
    </logger>
    <root>
        <level value="INFO" />
        <appender-ref ref="ASYNC"/>
    </root>
</log4j:configuration>
4

1 に答える 1

5

NDC 機能を使用できます。フィルター/インターセプターをセットアップします (使用するプレゼンテーション テクノロジーによって異なります)。ネストされた診断コンテキストを追加します (フィルターの例):

public class LogDiagnosticContextFilter implements javax.servlet.Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // do nothing
    }
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
        ServletException {
        SecurityContext context = SecurityContextHolder.getContext();
        if (context != null) {
            Authentication authentication = context.getAuthentication();
            if (authentication != null) {
                NDC.push("Username=" + authentication.getName());
            }
        }
        chain.doFilter(request, response);
        NDC.pop();
    }
    @Override
    public void destroy() {
        // do nothing
    }
}

Spring Security フィルター チェーン (web.xml) の後にフィルターが実行されていることを確認します。

<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
    <filter-name>logDiagnosticContextFilter</filter-name>
    <url-pattern>*</url-pattern>
</filter-mapping>   

関心のある各 log4j パターンにxを追加します。

%x %d %p %t %c - %m%n

あとで電話したら

LOGGER.info("some text");

コードのどこにでも表示されます

Username=corresponding_login some text

あなたのログに

于 2012-12-18T09:16:59.563 に答える