2012-12-18 2 views
6

log4j와 spring-security를 ​​응용 프로그램에서 사용하고 있으며 logger는 모든 메시지의 username과 함께 로그를 작성해야합니다. 나는 이것 모두에 아주 새롭다, 누군가는 통보 또는 연결로 도울 수 있는가? 어쩌면 이것을 해결할 수있는 몇 가지 방법이 있을까요? 감사합니다.Log4j spring-security 사용자 이름

편집 스프링 프레임 워크 3.1 내 스프링 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> 

답변

3

당신은 NDC feature를 사용할 수 있습니다. 일부 필터/인터셉터를 설정합니다 (사용하는 프리젠 테이션 기술에 따라 다름).

<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 추가 :

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 
    } 
} 

봄 보안 필터 체인 (web.xml에) 후에 실행하는 필터를 확인합니다 중첩 된 진단 컨텍스트 (필터 예)를 추가

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

나중에는

를 호출 할 때
LOGGER.info("some text"); 

당신은 당신보다 더 많은 저장 오히려 (가) 있습니다 NDC`, '보다`MDC`를 사용하는 것이 좋습니다 요즘 로그

+2

Username=corresponding_login some text 

을 볼 수 코드를 어디에서 하나의 값 (이름/값 쌍의 맵)이고 (b)는 하위 스레드에 상속됩니다. –

+0

이것은 작동합니다! 정말 고마워. 정말 고마워. – me1111

+0

2 시간 후. 'NDC.pop();'가 호출되지 않아도 NDC.pop();가 호출됩니다. –

관련 문제