springboot2.0日志详解-logback,log4j2,log4j
优先级从高到低分别是 ERROR、WARN、INFO、DEBUG
在说springboot默认的日志框架之前,先说下目前市面上的一些日志框架
市面上的日志框架:JUL、JCL、Jboss-logging、logback、log4j、log4j2、slf4j…
JCL(Jakarta Commons Logging) :spring 底层所使用的日志框架
JUL(java.util.logging) :java提供的日志框架
Jboss-logging :就是jboss提供的日志框架(hibernate)
logback :springboot默认使用的框架
log4j :跟logback 同一个人写的日志框架
log4j2:是谷歌的一个日志框架
slf4j(Simple Logging Facade for Java ):简单的日志框架,也是logback ,log4j 的作者写的,主要是目前日志的抽象层
面对抽象层编程,我们主要使用的slf4j,对应的实现有logback,log4j,log4j2
在slf4j的官网中,有张图,告诉我们,如何引用日志框架
图上,可以看到,我们使用不同的日志框架,都可以使用slf4j作为日志的抽象层,来做日志的收集,而不需要具体关注日志的实现,slf4j也都做了很好的适配,其中标红的一部分,就是slf4j做的一些适配;
具体做日志适配的过程,官网上,也给了另外一个图
我们以标注的部分为例(JCL(Jakarta Commons Logging) :spring 底层所使用的日志框架)
spring的底层使用的JCL日志框架,springboot使用的logback,这两个日志框架,要做兼容
1:首先要排除掉JCL的日志框架,
<dependency>
<groupId>org.springframework.ws</groupId>
<artifactId>spring-ws-core</artifactId>
<version>3.0.6.RELEASE</version>
<scope>compile</scope>
<exclusions>
<exclusion>
<artifactId>commons-logging</artifactId>
<groupId>commons-logging</groupId>
</exclusion>
</exclusions>
<optional>true</optional>
</dependency>
2:然后引入logback的日志实现,也就是springboot日志中,引入的jar
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</dependency>
3:然后引入中间替换包,来替换掉spring的底层的日志框架,上图所示的jul-to-slf4j.jar
至此,日志就替换完成了,后面就是日志文件的一些具体配置了,详细参考springboot的官网26章
https://docs.spring.io/spring-boot/docs/2.1.5.RELEASE/reference/htmlsingle/#boot-features-logging
日志输出格式:
%d表示日期时间,
%thread表示线程名,
%-5level:级别从左显示5个字符宽度
%logger{50} 表示logger名字最长50个字符,否则按照句点分割。
%msg:日志消息,
%n是换行符
例如: %d{yyyy-MM-dd HHss.SSS} [%thread] %-5level %logger{50} - %msg%n
logging.level.com.badger=debug
#logging.path=
# 不指定路径在当前项目下生成springboot.log日志
# 可以指定完整的路径;
#logging.file=G:/springboot.log
# 在当前磁盘的根路径下创建spring文件夹和里面的log文件夹;使用 spring.log 作为默认文件
logging.path=/spring/log
# 在控制台输出的日志的格式
logging.pattern.console=%d{yyyy-MM-dd} [%thread] %-5level %logger{50} - %msg%n
# 指定文件中日志输出的格式
logging.pattern.file=%d{yyyy-MM-dd} === [%thread] === %-5level === %logger{50} ==== %msg%n
logging.file | logging.path | Example | Description |
---|---|---|---|
(none) | (none) | 只在控制台输出 | |
指定文件名 | (none) | my.log | 输出日志到my.log文件 |
(none) | 指定目录 | /var/log | 输出到指定目录的 spring.log 文件中 |
也可以在xml文件中,指定日志文件,不同的日志框架,有对应的不同的日志文件的名称
Logging System | Customization |
---|---|
Logback | logback-spring.xml , logback-spring.groovy , logback.xml or logback.groovy |
Log4j2 | log4j2-spring.xml or log4j2.xml |
JUL (Java Util Logging) | logging.properties |
我们使用springboot默认的Logback日志,我直接给一个我经常使用的,供大家参考
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="10 seconds">
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<Pattern>[%d %level]%logger{50}>>> %msg%n</Pattern>
</encoder>
</appender>
<appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>DEBUG</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<File>logs/debug.log</File>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logs/debug-%d{yyyyMMdd}.log.%i</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>50MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>10</maxHistory>
</rollingPolicy>
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>[%d %level]%logger{36}>>> %msg%n</Pattern>
</layout>
</appender>
<appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>logs/info.log</File>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logs/info-%d{yyyyMMdd}.log.%i</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>20MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>10</maxHistory>
</rollingPolicy>
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>[%d %level]%logger{50}>>> %msg%n</Pattern>
</layout>
</appender>
<appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>WARN</level>
</filter>
<File>logs/error.log</File>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logs/error-%d{yyyyMMdd}.log.%i</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>20MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>10</maxHistory>
</rollingPolicy>
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>[%d %level]%logger{50}>>> %msg%n</Pattern>
</layout>
</appender>
<logger name="com.badger" level="DEBUG" />
<logger name="com.alibaba.druid" level="INFO" />
<logger name="org.apache.ibatis" level="INFO" />
<logger name="org.mybatis.spring" level="INFO" />
<logger name="org.hibernate.validator" level="INFO" />
<logger name="org.springframework" level="INFO"></logger>
<root level="INFO">
<appender-ref ref="STDOUT" />
<appender-ref ref="DEBUG_FILE" />
<appender-ref ref="INFO_FILE" />
<appender-ref ref="ERROR_FILE" />
</root>
</configuration>
需要说明下:
1:如果日志文件的名字logback-spring.xml ,那么可以使用这个
<springProfile name="dev">
<!-- configuration to be enabled when the "staging" profile is active -->
可以指定某段配置只在某个环境下生效
</springProfile>
2:日志的过滤器
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>DEBUG</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
有两种:ch.qos.logback.classic.filter.LevelFilter和ch.qos.logback.classic.filter.ThresholdFilter
LevelFilter:是级别过滤器,表示只要当前的级别的
ThresholdFilter:是阈值过滤器,表示只要xxx级别一下的,例如配置了info级别,那么拦截的日志就会是
ERROR、WARN、INFO、DEBUG 中的 ERROR、WARN、INFO
onMatch:拿到对应级别的处理机制
onMismatch:不是这个级别的日志的处理机制
对应的就是这个枚举类ch.qos.logback.core.spi.FilterReply
public enum FilterReply {
DENY, NEUTRAL, ACCEPT;
}
log4j,log4j2的使用
通过上面的说明,大家也都该熟悉怎么使用了,步骤就简单很多了,直接排除springboot的日志,切换到对应的日志框架就可以了,如下:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<artifactId>spring-boot-starter-logging</artifactId>
<groupId>org.springframework.boot</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
,
还没有评论,来说两句吧...