「Java例子」slf4j+logback实现不同环境日志配置和日志级别开关
介绍语
本号主要是Java常用关键技术点,通用工具类的分享;以及springboot+springcloud+Mybatisplus+druid+mysql+redis+swagger+maven+docker等集成框架的技术分享;datax、kafka、flink等大数据处理框架的技术分享。文章会不断更新,欢迎码友关注点赞收藏转发!
望各位码友点击关注,冲1000粉。后面会录制一些视频教程,图文和视频结合,比如:图书介绍网站系统、抢购系统、大数据中台系统等。技术才是程序猿的最爱,码友们冲啊
如果码友觉得代码太长,可以从头到尾快速扫射一遍,了解大概即可。觉得有用后再转发收藏,以备不时之需。
正文:
不管大公司还是小公司都会有日志混乱的问题,当生产报错时开发人员排查问题,打开日志文件实时查看日志输出,但是由于不规范日志打印的很快,很难发现错误的日志。所以本次分享日志配置知识,由于代码过多所以文末给出代码库地址,欢迎下载学习。
日志打印类
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@Slf4j
public class DemoLogbackApplication {
public static void main(String[] args) {
SpringApplication.run(DemoLogbackApplication.class, args);
log.debug("debug...");
log.info("info...");
log.warn("warn...");
log.error("error...");
}
}
打印效果
不同环境日志
只要配置下面属性即可对应使用相应的日志配置
开发环境: spring.profiles.active=dev
测试环境: spring.profiles.active=test
生产环境: spring.profiles.active=prod
日志级别设置例子
关闭根日志
logging.level.root = off
打印某个包的日志,日志级别为debug
logging.level.javalaoniu.gitee.io.demo.logback = debug
关闭org.apache包的日志
logging.level.org.apache = off
动态设置日志环境
在项目启动时,传递环境参数,让日志自动使用相应的日志配置去打印日志(或记录到文件中) ,启动命令如下:
java -jar javalaoniu.gitee.io.demo.logback.DemoLogbackApplication --spring.profiles.active=dev
日志文件配置
logback-spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<contextName>dadi</contextName>
<springProperty scope="context" name="springAppName" source="spring.application.name"/>
<property name="log.path" value="logs/app-log"/>
<property name="log.maxHistory" value="15"/>
<property name="log.maxSize" value="10MB"/>
<!--配置输出,以不同颜色区分-->
<property name="log.colorPattern"
value="%magenta(%d{yyyy-MM-dd HH:mm:ss}) %highlight(%-5level) %boldCyan([${springAppName:-},%X{X-B3-TraceId:-},%X{X-B3-SpanId:-},%X{X-Span-Export:-}]) %yellow(%thread) %green(%logger) %L %msg%n"/>
<property name="log.pattern"
value="%d{yyyy-MM-dd HH:mm:ss} %-5level [${springAppName:-},%X{X-B3-TraceId:-},%X{X-B3-SpanId:-},%X{X-Span-Export:-}] %thread %logger %L %msg%n"/>
<!--输出到控制台-->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${log.colorPattern}</pattern>
</encoder>
</appender>
<!--输出到文件-->
<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/info.%d{yyyy-MM-dd}.log</fileNamePattern>
<MaxHistory>${log.maxHistory}</MaxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<!--日志文件最大的大小-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>${log.maxSize}</MaxFileSize>
</triggeringPolicy>
</appender>
<appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/error.%d{yyyy-MM-dd}.log</fileNamePattern>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<!--日志文件最大的大小-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>${log.maxSize}</MaxFileSize>
</triggeringPolicy>
</appender>
<springProfile name="dev">
<!-- 开发环境时激活 -->
<!-- 指定输出日志的类,该包下的打印级别是info,在控制台会打印这个包中的info级别以上的信息 -->
<logger name="javalaoniu.gitee.io.demo.logback" level="debug" additivity="false">
<appender-ref ref="console"/>
</logger>
</springProfile>
<springProfile name="test | default">
<!-- 测试环境时激活 -->
<!-- 当spring.profiles.active无设置时也用这个打印日志-->
<!-- 指定输出日志的类,该包下的打印级别是info,在控制台会打印这个包中的info级别以上的信息 -->
<logger name="javalaoniu.gitee.io.demo.logback" level="info" additivity="false">
<appender-ref ref="console"/>
</logger>
</springProfile>
<springProfile name="prod">
<!-- 生产环境时激活 -->
<!-- 指定输出日志的类,该包下的打印级别是info,在控制台会打印这个包中的info级别以上的信息 -->
<logger name="javalaoniu.gitee.io.demo.logback" level="error" additivity="false">
<appender-ref ref="console"/>
<appender-ref ref="file_error"/>
</logger>
</springProfile>
<!-- 跟打印配置,整个项目输出级别为error-->
<root level="error">
<appender-ref ref="console"/>
</root>
</configuration>
application.properties
logging.level.root = off
logging.level.javalaoniu.gitee.io.demo.logback = debug
日志规则
- 日志文件命名为logback-spring.xml,这样可以读取application.properties中的配置;
- logback-spring.xml文件和application.properties中同时设置,则application.properties中的配置覆盖logback-spring.xml中的配置;
- application.properties中logging.level.root的级别设置不影响其他包的设置,如logging.level.root=info,包设置logging.level.demo.log=warn,则demo.log包的日志级别为warn
- 日志级别由低到高,ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF
gitee地址:https://gitee.com/javalaoniu/java-example/tree/master/demo-logback
鄙人编码十年多,在项目中也积累了一些工具类,很多工具类在每个项目都有在用,很实用。大部分是鄙人封装的,有些工具类是同事封装的,有些工具类已经不记得是ctrl+c的还是自己封装的了,现在有空就会总结项目中大部分的工具类,分享给各位码友。如果文章中涉及的代码有侵权行为请通知鄙人处理。
计划是先把工具类整理出来,正所谓工欲善其事,必先利其器。项目中不管是普通单体项目还是多模块maven项目或是分布式微服务,一部分功能模块都是可以重用的,工具类模块就是其中之一。