2012-12-18 11 views
6

Ich verwende Log4j und Spring-Sicherheit in der Anwendung, und der Logger sollte Protokolle mit Benutzernamen in jeder Nachricht schreiben. Ich bin sehr neu in all dem, kann jemand mit Ratschlägen oder Links helfen? Vielleicht gibt es einige Standardmethoden, um das zu lösen? Danke.Log4j write spring-security Benutzername

EDIT Mit Feder Rahmen 3.1 Meine feder security.xml ist:

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

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

Antwort

3

Sie können NDC feature verwenden. Richten Sie einen Filter/Interceptor ein (hängt davon ab, welche Präsentationstechnologie Sie verwenden). In verschachtelten diagnostischen Kontext (Filter Beispiel):

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

Stellen Sie sicher, dass die Filter ausgeführt nachdem Spring Security Filterkette (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> 

hinzufügen x zu jedem interessierten log4j Muster:

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

Später, wenn Sie

nennen
LOGGER.info("some text"); 

überall in Sie Code, den Sie

Username=corresponding_login some text 

in Ihrem Log

+2

diesen Tagen ist es empfohlen wird die 'MDC' sehen eher zu verwenden als' NDC', die (a) ermöglicht das Speichern von mehr als ein Wert (es ist eine Zuordnung von Name/Wert-Paaren) und (b) wird von untergeordneten Threads geerbt. –

+0

Das funktioniert! Vielen Dank. Wirklich danke. – me1111

+0

2 Jahre später. 'NDC.pop();' wird auch dann aufgerufen, wenn 'NDC.push();' nicht aufgerufen wird. –