2012-12-18 25 views
6

Używam log4j i spring-security w aplikacji, a program rejestrujący powinien zapisywać logi z nazwą użytkownika w każdej wiadomości. Jestem bardzo nowy w tym wszystkim, czy ktoś może pomóc z poradami lub linkami? Może istnieją pewne standardowe sposoby rozwiązania tego problemu? Dziękuję.Log4j wpisz: nazwa użytkownika ochrony przed sprężyną

EDIT Korzystanie Spring Framework 3.1 Moja wiosna-security.xml jest:

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

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

Odpowiedz

3

Można użyć NDC feature. Skonfiguruj filtr/przechwytywacz (w zależności od używanej technologii prezentacji). Dodaj zagnieżdżony kontekst diagnostyczny (przykładowy filtr):

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

Upewnić się, że filtr wykonany po łańcuchu filtrów Wiosna Bezpieczeństwa (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> 

dodać x do każdego zainteresowanego log4j wzoru:

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

Później kiedy zadzwonić

LOGGER.info("some text"); 

nigdzie w kodować widać

Username=corresponding_login some text 

w dzienniku

+2

Te dni zaleca się użyć 'MDC' zamiast', który (a) pozwala NDC' przechowywać więcej niż jedna wartość (jest to mapa par nazwa/wartość) i (b) jest dziedziczona przez wątki potomne. –

+0

To działa! Dziękuję bardzo. Naprawdę dzięki. – me1111

+0

2 lata później. 'NDC.pop();' jest wywoływane, nawet jeśli 'NDC.push();' nie jest wywoływane. –

Powiązane problemy