log4j日志级别分离配置

目的是加载所有jar下的log4j配置,然后以指定哪个jar为参照版本,引用项目内配置为最高优先级,

引用的项目只需简单配置,即可按照级别生成log文件

 

默认log4j配置:log4j-default.properties

log4j.rootCategory=INFO,stdout

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - <%m>%n

cqliving-log.jar下log4j详细配置:log4j.properties

# 指定日志所属项目名
log4j.project.name=cqliving-log

# 指定日志项
log4j.rootCategory=INFO,stdout,infofile,errorfile,warnfile,allfile

# 指定包日志等级
log4j.logger.org.springframework.aop.framework.Cglib2AopProxy=OFF
log4j.logger.org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping=OFF
log4j.logger.jdbc=OFF
log4j.logger.com.cqliving=DEBUG
log4j.logger.com.alibaba.druid=INFO
log4j.logger.com.cqliving.edu.log.aop.EduLogControllerAdvice=TRACE

### 配置控制台输出日志 = tomcat Catalina.out
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS}[ %t:%r ]-[%p] %l %m%n

### 输出到文件file info ###(每天产生一个日志文件:DailyRollingFileAppender)
log4j.appender.infofile = info
log4j.appender.infofile = org.apache.log4j.DailyRollingFileAppender
log4j.appender.infofile.append = true
log4j.appender.infofile.Threshold = INFO
log4j.appender.infofile.datePattern = '.'yyyy-MM-dd'.log'
log4j.appender.infofile.layout = org.apache.log4j.PatternLayout
log4j.appender.infofile.File = /var/www/logs/${log4j.project.name}/info.log
log4j.appender.infofile.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS}[ %t:%r ]-[%p] %l %m%n

### 输出到文件file warn ###(每天产生一个日志文件:DailyRollingFileAppender)
log4j.appender.warnfile = warn
log4j.appender.warnfile = org.apache.log4j.DailyRollingFileAppender 
log4j.appender.warnfile.append = true
log4j.appender.warnfile.Threshold = WARN
log4j.appender.warnfile.datePattern = '.'yyyy-MM-dd'.log'
log4j.appender.warnfile.layout = org.apache.log4j.PatternLayout
log4j.appender.warnfile.File = /var/www/logs/${log4j.project.name}/warn.log
log4j.appender.warnfile.layout.ConversionPattern =%-d{yyyy-MM-dd HH:mm:ss,SSS}[ %t:%r ]-[%p] %l %m%n

### 输出到文件file error ###(每天产生一个日志文件:DailyRollingFileAppender)
log4j.appender.errorfile = error
log4j.appender.errorfile = org.apache.log4j.DailyRollingFileAppender 
log4j.appender.errorfile.append = true
log4j.appender.errorfile.Threshold = ERROR
log4j.appender.errorfile.datePattern = '.'yyyy-MM-dd'.log'
log4j.appender.errorfile.layout = org.apache.log4j.PatternLayout
log4j.appender.errorfile.File = /var/www/logs/${log4j.project.name}/error.log
log4j.appender.errorfile.layout.ConversionPattern =%-d{yyyy-MM-dd HH:mm:ss,SSS}[ %t:%r ]-[%p] %l %m%n

### 输出到文件file all ###(每天产生一个日志文件:DailyRollingFileAppender)
log4j.appender.allfile = all
log4j.appender.allfile = org.apache.log4j.DailyRollingFileAppender
log4j.appender.allfile.append = true
log4j.appender.allfile.Threshold = ALL
log4j.appender.allfile.datePattern = '.'yyyy-MM-dd'.log'
log4j.appender.allfile.layout = org.apache.log4j.PatternLayout
log4j.appender.allfile.File = /var/www/logs/${log4j.project.name}/all.log
log4j.appender.allfile.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS}[ %t:%r ]-[%p] %l %m%n

 

java核心代码

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;
 
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
 
import org.apache.log4j.PropertyConfigurator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
 
/**
 * Title:注册监听器加载所有log4j配置
 * <p>Description:</p>
 * Copyright (c) CQLIVING 2019
 * @author liuzongyang on 2019年9月27日
 */
public class LogApplicationListener implements ServletContextListener {
         
    private static Logger logger = LoggerFactory.getLogger(LogApplicationListener.class);
     
    private static final String JAR_NAME = "cqliving-log";
     
    @Override
    public void contextInitialized(ServletContextEvent sce) {
 
        PathMatchingResourcePatternResolver patternResolver = new PathMatchingResourcePatternResolver();
        try {
            Resource[] resources = patternResolver.getResources("classpath*:log4j.properties");
            List<Resource> list = new ArrayList<>(Arrays.asList(resources));
            // 反转log4j加载顺序,最后加载当前项目下的log4j
            Collections.reverse(list);
             
            // 需要初始化一次配置
            Resource[] defaultR = patternResolver.getResources("classpath*:log4j-default.properties");
            Properties defaults = read(defaultR[0].getInputStream());
            PropertyConfigurator.configure(defaults);
             
            // 倒数第二个加载cqliving-log
            Iterator<Resource> it = list.iterator();
            Resource param = null;
            while (it.hasNext()) {
                Resource resource = it.next();
                String path = resource.getURL().toString();
                if(path.contains(JAR_NAME)) {
                    it.remove();
                    param = resource;
                    break;
                }
            }
            if(null != param) {
                list.add(list.size()-1, param);
            }
             
            // 读取所有项目下的配置,整合后重新配置log4j
            Properties properties = new Properties();
            logger.info("log4j配置文件以cqliving-log包下的log4j.properties为准,其余工程下的配置请参照自定义配置,将会覆盖cqliving-log配置");
            for (Resource resource : list) {
                String path = resource.getURL().toString();
                properties.putAll(read(resource.getInputStream()));
                logger.debug("加载Log4j配置文件{}.", path);
            }
             
            Object projectName = properties.get("log4j.project.name");
            if(JAR_NAME.equals(projectName)) {
                System.err.println("日志所属项目没配置或为默认配置,请在log4j.properties中配置所属项目的log4j.project.name属性");
            }
            PropertyConfigurator.configure(properties);
             
        } catch (IOException e) {
            logger.error("加载配置文件失败:{}", e);
        }
 
    }
     
    /**
     * 根据{@link InputStream}解析
     * @param is
     * @throws IOException
     */
    private Properties read(InputStream is) throws IOException {
        Properties properties = new Properties();
        properties.load(new InputStreamReader(is, StandardCharsets.UTF_8));
        return properties;
    }
     
     
     
    @Override
    public void contextDestroyed(ServletContextEvent sce) { }
 
}

 

引用项目配置:log4j.properties

# 指定日志所属项目名
log4j.project.name=cqliving-activity-cms
log4j.logger.com.cqliving=DEBUG

 

引用项目配置:web.xml,或者springboot设置@WebListener

<listener>
    <listener-class>com.cqliving.log.listener.LogApplicationListener</listener-class>
</listener>

效果:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章