2012-12-18 53 views
6

Tôi đang sử dụng log4j và bảo mật mùa xuân trong ứng dụng và trình ghi nhật ký sẽ ghi nhật ký với tên người dùng trong mọi thư. Tôi rất mới mẻ đối với tất cả điều này, ai đó có thể giúp đỡ với lời khuyên hay liên kết? Có thể có một số cách giải quyết vấn đề này? Cảm ơn bạn.Log4j ghi tên người dùng bảo mật mùa xuân

EDIT Sử dụng khuôn khổ mùa xuân 3,1 My mùa xuân-security.xml là:

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

Và 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> 

Trả lời

3

Bạn có thể sử dụng NDC feature. Thiết lập một số bộ lọc/bộ chặn (phụ thuộc vào công nghệ trình bày bạn sử dụng). Thêm bối cảnh chẩn đoán lồng nhau (ví dụ lọc):

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

Đảm bảo rằng bộ lọc thực hiện sau chuỗi lọc Xuân An (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> 

Thêm x cho mỗi mô hình log4j quan tâm:

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

Sau đó, khi bạn gọi

LOGGER.info("some text"); 

bất cứ nơi nào trong bạn mã hóa bạn sẽ thấy

Username=corresponding_login some text 

trong nhật ký

+2

của bạn Những ngày này thì bạn nên gõ 'MDC' khá hơn' NDC', mà (a) cho phép bạn lưu trữ nhiều hơn một giá trị (đó là bản đồ các cặp tên/giá trị) và (b) được thừa hưởng bởi các chuỗi con. –

+0

Công trình này hoạt động! Cảm ơn bạn rất nhiều. Rất cảm ơn. – me1111

+0

2y sau. 'NDC.pop();' được gọi ngay cả khi 'NDC.push();' không được gọi. –

Các vấn đề liên quan