2017-08-01 86 views
2

从Spring 4.2.1开始,Log4jNestedDiagnosticContextFilter在Apache的针对log4j 1.x的EOL声明被弃用,如下所示。Log4j的Log4jNestedDiagnosticContextFilter 2

enter image description here

我已经找到了相应的JIRA票(SPR-13400),但我怎么可以把Log4j的2到Spring环境做一样的Log4jNestedDiagnosticContextFilter

回答

0

我自己通过复制Log4jNestedDiagnosticContextFilter来实现它,并使记录器适应Log4j 2并将NDC更改为ThreadContext

import org.apache.logging.log4j.LogManager; 
import org.apache.logging.log4j.Logger; 
import org.apache.logging.log4j.ThreadContext; 
import org.springframework.web.filter.AbstractRequestLoggingFilter; 

import javax.servlet.http.HttpServletRequest; 

public class CustomRequestLoggingFilter extends AbstractRequestLoggingFilter { 

    protected final Logger log4jLogger = LogManager.getLogger(getClass()); 

    @Override 
    protected void beforeRequest(HttpServletRequest request, String message) { 
    if (log4jLogger.isDebugEnabled()) { 
     log4jLogger.debug(message); 
    } 
    ThreadContext.push(getNestedDiagnosticContextMessage(request)); 
    } 

    @Override 
    protected void afterRequest(HttpServletRequest request, String message) { 
    ThreadContext.pop(); 
    if (ThreadContext.getDepth() == 0) { 
     ThreadContext.removeStack(); 
    } 
    if (log4jLogger.isDebugEnabled()) { 
     log4jLogger.debug(message); 
    } 
    } 

    protected String getNestedDiagnosticContextMessage(HttpServletRequest request) { 
    return createMessage(request, "", ""); 
    } 
}