低调人
2018-05-25 17:15:51
Spring Boot之对log4j进行多环境不同日志级别的控制
之前介绍了在《Spring boot中使用log4j记录日志》,仅通过log4j.properties对日志级别进行控制,对于需要多环境部署的环境不是很方便,可能我们在开发环境大部分模块需要采用DEBUG级别,在测试环境可能需要小部分采用DEBUG级别,而在生产环境时我们又希望采用INFO级别。这个时候,我们要自己手工编辑log4j.properties文件来调整日志级别,不论在版本库中默认保存哪个环境的级别设定,都会增加其他环境使用人员的工作量,虽然很细微,但是手工修改总不是一件很好的选择,难免会发现修改后误提交等问题。
那么,有没有办法对于开发人员、运维人员都不需要改变源代码实现不同环境的不同日志级别呢?
是否还记得之前在《Spring Boot属性配置文件详解》一文中,提到的关于Spring Boot多环境的配置以及属性文件中的参数引用?若没有了解过相关内容,建议先阅读该文后继续此篇内容。
我们开始尝试配置一下:
引用的pom文件信息
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.cicoding</groupId> <artifactId>springboot-log</artifactId> <version>1.0.0</version> <packaging>jar</packaging> <name>springboot-log</name> <description>Spring Boot project</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.3.2.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <java.version>1.8</java.version> </properties> <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> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
配置不同级别的配置文件
application-dev.properties logging.level.com.cicoding=INFO application-prod.properties logging.level.com.cicoding=INFO application-test.properties logging.level.com.cicoding=DEBUG application.properties spring.profiles.active=dev log4j.properties # LOG4J配置 log4j.rootCategory=INFO, stdout, file, errorfile log4j.category.com.cicoding=${logging.level.com.cicoding}, cifile 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.cicoding下的日志输出 log4j.appender.cifile=org.apache.log4j.DailyRollingFileAppender log4j.appender.cifile.file=logs/my.log log4j.appender.cifile.DatePattern='.'yyyy-MM-dd log4j.appender.cifile.layout=org.apache.log4j.PatternLayout log4j.appender.cifile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L ---- %m%n
测试类编写:
package com.cicoding; 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"); } }
对于不同环境的使用人员也不需要改变代码或打包文件,只需要通过执行命令中参加参数即可,比如我想采用生产环境的级别,那么我可以这样运行应用:
使用prod的就需要:
java -jar xxx.jar --spring.profiles.active=prod
使用dev的就需要:
java -jar xxx.jar --spring.profiles.active=dev
这样就完成了;
评论

zzhua195 LV6
2020年4月22日
人间蒸发 LV23
2020年4月1日
已注销用户 LV34
2020年4月1日
kinggode LV14
2019年12月9日
安安an LV17
2019年7月23日
wl2301821 LV7
2019年1月18日
莫灬嚣张 LV6
2018年12月20日
rainscloud LV2
2018年11月22日
MartinKing
2018年11月21日
暂无贡献等级
chenglei1314 LV6
2018年11月14日