使用slf4j + Log4j2构建日志

一、背景

Log4j 1.x 在高并发情况下出现死锁导致cpu使用率异常飙升,而Log4j2.0基于LMAX Disruptor的异步日志在多线程环境下性能会远远优于Log4j 1.x和logback(官方数据是10倍以上),这里分享slf4j + Log4j2的使用方法。

二、步骤

1、pom.xml

删除以往依赖Log4j1.x的依赖项,比如slf4j-log4j12、log4j等包。
可以到项目的根目录,执行:mvn dependency:tree > tree.log  ,查看之后 cat tree.log | grep log4j查找。


        
            org.slf4j
            slf4j-log4j12
        
        
            log4j
            log4j
        
    

然后在工程的pom.xml新增以下log4j2的依赖关系:
 

        
            org.slf4j
            slf4j-api
            1.7.13
        
        
            org.slf4j
            jcl-over-slf4j
            1.7.13
            runtime
        

        
        
            org.apache.logging.log4j
            log4j-api
            2.4.1
        
        
            org.apache.logging.log4j
            log4j-core
            2.4.1
        
        
        
            org.apache.logging.log4j
            log4j-slf4j-impl
            2.4.1
        
        
        
            org.apache.logging.log4j
            log4j-web
            2.4.1
            runtime
        

        
        
            com.lmax
            disruptor
            3.2.0
        

2、web.xml

web工程的web.xml文件中添加(Servlet3.0不需要):


    
    
        org.apache.logging.log4j.web.Log4jServletContextListener
    
    
        log4jServletFilter
        org.apache.logging.log4j.web.Log4jServletFilter
    
    
        log4jServletFilter
        /*
        REQUEST
        FORWARD
        INCLUDE
        ERROR
    

3、log4j2.xml

log4j2不再支持properties文件了,只支持xml,json或是yaml。
默认不指定位置,可以放在src/main/resources下。如果需要自定义位置,需要在上面的web.xml中添加


        log4jConfiguration
        /WEB-INF/classes/log4j2.xml
    

下面是一个log4j2.xml的demo





    
        /opt/logs/gct/shoppromo/logs
        error
    


    
        
            
        

        
            
            
                
                
            
            
        

    

    
        
        
        
        
        
        
        
        
        

        
            
            
        

        
            
        
    

4、代码示例

import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

@Controller
@RequestMapping("/api/")
public class TestController {
    private static Logger log = LogManager.getLogger(TestController.class.getName());


    @RequestMapping(value = "/test")
    public String test(
            HttpServletRequest request, HttpServletResponse response, ModelMap modelMap) {

        log.info("你好啊");
        log.debug("我是debug");
        log.error("错了");
        log.trace("这是什么");

        modelMap.put("s", "ok");
        return "string";
    }


}

注意:在JVM启动参数中增加 -DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector 开启异步日志


你可能感兴趣的:(日志)