Spring Boot中对log4j进行多环境不同日志级别的控制
一 问题提出
仅通过log4j.properties对日志级别进行控制,对于需要多环境部署的环境不是很方便,可能我们在开发环境大部分模块需要采用DEBUG级别,在测试环境可能需要小部分采用DEBUG级别,而在生产环境时我们又希望采用INFO级别。这个时候,我们要自己手工编辑log4j.properties文件来调整日志级别,不论在版本库中默认保存哪个环境的级别设定,都会增加其他环境使用人员的工作量,虽然很细微,但是手工修改总不是一件很好的选择,难免会发现修改后误提交等问题。
所以就提出了多环境不同日志级别的控制的需求。
二 实战
1 新建依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
2 新建启动类
package com.didispace;
import org.apache.log4j.Logger;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
3 application.properties配置
spring.profiles.active=dev
4 application-dev.properties配置
logging.level.com.didispace=INFO
5 application-prod.properties配置
logging.level.com.didispace=INFO
6 application-test.properties配置
logging.level.com.didispace=DEBUG
7 log4j.properties配置
spring.profiles.active=dev
4 application-dev.properties配置
logging.level.com.didispace=INFO
5 application-prod.properties配置
logging.level.com.didispace=INFO
6 application-test.properties配置
logging.level.com.didispace=DEBUG
7 log4j.properties配置
# LOG4J配置
log4j.rootCategory=INFO, stdout, file, errorfile
log4j.category.com.didispace=${logging.level.com.didispace}, didifile
log4j.logger.error=errorfile
# 控制台输出
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} %5p %c{1}:%L - %m%n
# root日志输出
log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
log4j.appender.file.file=logs/all.log
log4j.appender.file.DatePattern='.'yyyy-MM-dd
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L - %m%n
# error日志输出
log4j.appender.errorfile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.errorfile.file=logs/error.log
log4j.appender.errorfile.DatePattern='.'yyyy-MM-dd
log4j.appender.errorfile.Threshold = ERROR
log4j.appender.errorfile.layout=org.apache.log4j.PatternLayout
log4j.appender.errorfile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L - %m%n
# com.didispace下的日志输出
log4j.appender.didifile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.didifile.file=logs/my.log
log4j.appender.didifile.DatePattern='.'yyyy-MM-dd
log4j.appender.didifile.layout=org.apache.log4j.PatternLayout
log4j.appender.didifile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L ---- %m%n
8 测试类
package com.didispace;
import org.apache.log4j.Logger;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.SpringApplicationConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
public class ApplicationTests {
private Logger logger = Logger.getLogger(getClass());
@Test
public void test() throws Exception {
logger.info("输出info");
logger.debug("输出debug");
logger.error("输出error");
}
}
三 测试结果
1 控制台输出
2018-11-03 13:42:59,272 INFO ApplicationTests:18 - 输出info
2018-11-03 13:42:59,272 ERROR ApplicationTests:20 - 输出error
2 文件输出
四 参考