logback是什么?
- logback是由log4j创始人设计的又一个开源日志组件,是log4j的升级版本
- 优化了log4j存在的性能问题,SpringBoot默认是使用logback进行日志管理的
logback能做什么?
- 使用logback我们可以自定义控制台日志输出
- 可以实现对不同日志不同级别打印到不同的文件中
- 可以对日志进行归档保存,并定时删除
使用logback来管理日志
在application.properties文件中指定logback配置文件(如果配置文件名称也为logback-spring.xml
,可以不指定,SpringBoot有默认配置的)
logging.config=classpath:logback-spring.xml
在resources下添加logback-spring.xml
文件
<?xml version="1.0" encoding="UTF-8"?
<configuration scan="true" scanPeriod="10 seconds" debug="false">
<include resource="org/springframework/boot/logging/logback/base.xml"/>
<contextName>logback</contextName>
<property name="log_path" value="/log"/><!-- 如果在Windows环境下使用/开头的路径,将会被指定到项目所在的盘符 -->
<property name="log_pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level --- [%thread] %logger{50} - %msg%n"/>
<property name="log_fileNamePattern" value="-%d{yyyy-MM-dd}.%i.log"/>
<property name="log_maxFileSize" value="100MB"/>
<property name="log_maxHistory" value="15"/>
<!-- 输出到控制台 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<encoder charset="UTF-8">
<pattern>${log_pattern}</pattern>
</encoder>
</appender>
<!-- 输出到app.log文件 -->
<appender name="APP" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log_path}/app.log</file>
<encoder charset="UTF-8">
<pattern>${log_pattern}</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log_path}/app${log_fileNamePattern}</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${log_maxFileSize}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>${log_maxHistory}</maxHistory>
</rollingPolicy>
</appender>
<!-- 输出到sql.log文件 -->
<appender name="SQL" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log_path}/sql.log</file>
<encoder charset="UTF-8">
<pattern>${log_pattern}</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log_path}/sql-${log_fileNamePattern}</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${log_maxFileSize}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>${log_maxHistory}</maxHistory>
</rollingPolicy>
</appender>
<!-- 自定义包日志级别要加上additivity="false",表示不会向上传递 -->
<logger name="org.springframework">
<level value="WARN"/>
</logger>
<logger name="org.apache" additivity="false">
<level value="WARN"/>
</logger>
<logger name="org.mybatis" additivity="false">
<level value="WARN"/>
</logger>
<!-- mapper的sql配置 -->
<logger name="com.wyj.mapper" level="DEBUG" additivity="false">
<appender-ref ref="SQL" />
</logger>
<!-- 自定义包或者类输出的级别和策略 -->
<logger name="com.wyj.interceptor.SqlStatementInterceptor" level="INFO" additivity="false">
<appender-ref ref="SQL" />
<appender-ref ref="APP" />
<appender-ref ref="CONSOLE" />
</logger>
<!-- root用来指定最基础的日志输出级别 -->
<root level="INFO">
<appender-ref ref="APP"/>
</root>
</configuration>
logback配置文件中属性说明
- logback默认有五个日志级别,从低到高分别为(大小写无所谓):
trace
< debug
< info
< warn
< error
-
SpringBoot默认为我们输出的日志级别为
info
、warn
、error
,如果还使用其他级别的日志,可以在配置中进行配置- 对嵌入的框架,例如Spring、Mybatis需要在application.properties中配置debug=true即可
- 对自己的项目日志需要在
logback-spring.xml
文件中使用标签进行配置
-
对日志进行颜色渲染
如果编译工具支持ANSI的话,会给日志输出进行颜色渲染,提高日志的可读性,只需要在application.properties文件配置spring.output.ansi.enabled
,它可以设置为以下三种值:- ALWAYS:启动ANSI输出
- DETECT:尝试使用ANSI输出
- NEVER:禁用ANSI日志输出
- <configuration>:用来配置logback
- scan:表示配置文件如果发生改变,是否会被重新加载,默认为true
- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是秒;当scan为true时,此属性生效。默认的时间间隔为1分钟
- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false
- <include>:用来引入外部资源文件
- resource:表示资源路径
- <contextName>:每个logger都关联到logger上下文,默认上下文名称为default,但可以使用设置成其他名字,用于区分不同应用程序的记录,一旦设置,不能修改,可以通过%contextName来打印日志上下文名称
- <property>:自定义变量,使用${}来使用变量
- name:变量名
- value:变量值
- <appender>:日志输出策略
- name:策略名称
- class:何种策略。
ch.qos.logback.core.ConsoleAppender
是对应的控制台输出策略;ch.qos.logback.core.rolling.RollingFileAppender
是对应的文件输出策略 - <filter>:可以输出指定日志输出级别以上的日志输出,日志输出级别以下的将不输出
- class:何种过滤器,
ch.qos.logback.classic.filter.ThresholdFilter
为系统自带的过滤器 - <level>:日志输出级别
- class:何种过滤器,
- <encoder>:设置日志输出的格式
- charset:日志输出的编码
- <pattern>:日志输出的格式
- <file>:日志输出的路径及文件名
- <rollingPolicy>:设置日志切割策略
- class:日志切割策略
- <fileNamePattern>:定义了日志的切割方式,把每一天的日志归档到一个文件中
- <timeBasedFileNamingAndTriggeringPolicy>:定义日志切割文件
- <maxFileSize>:用于指定日志文件的上限大小,到了这个上限值,就会删除旧的日志
- <maxHistory>:表示只保存最近多少天的日志,以防止日志填满整个磁盘空间
- <logger>:用来指定某一个包或者具体的类的日志打印级别
- name:某一个包或者具体的类
- level:指定日志输出级别
- additivity:是否向上传递
- <level>:指定日志输出级别
- value:指定日志输出级别
- <appender-ref>:引用自定义的日志输出策略,就是
<appender>
- ref:引用日志输出策略
- <root>:用来指定最基础的日志输出级别
- level:指定日志输出级别
- <appender-ref>:引用自定义的日志输出策略,就是
<appender>
- ref:引用日志输出策略
- <springProfile>:用来指定不同环境来使不同的日志输出
- name:使用的环境名称,多个环境使用
,
分开,需在application.properties文件中通过spring.profiles.active
来指定当前使用的环境,!pro表示当为环境为pro时禁用以下配置 - <root>:和上面的root配置一致
- <logger>:和上面的root配置一致
- name:使用的环境名称,多个环境使用
测试
控制台打印:
app.log:
2019-07-31 21:54:43.346 INFO --- [main] com.wyj.LogbackApplication - Starting LogbackApplication on wyj-PersonComput with PID 12632 (E:\Java\IDEA_WorkSpace\springboot-learning\springboot-logback01\target\classes started by wyj in E:\Java\IDEA_WorkSpace\springboot-learning)
2019-07-31 21:54:43.346 INFO --- [main] com.wyj.LogbackApplication - No active profile set, falling back to default profiles: default
2019-07-31 21:54:48.415 INFO --- [main] com.wyj.LogbackApplication - Started LogbackApplication in 6.654 seconds (JVM running for 8.978)
2019-07-31 21:54:57.818 INFO --- [http-nio-8080-exec-1] com.wyj.controller.LoggerController - 这是一个info日志
2019-07-31 21:54:57.820 WARN --- [http-nio-8080-exec-1] com.wyj.controller.LoggerController - 这是一个warn日志
2019-07-31 21:54:57.821 ERROR --- [http-nio-8080-exec-1] com.wyj.controller.LoggerController - 这是一个error日志
2019-07-31 21:54:57.852 INFO --- [http-nio-8080-exec-1] com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting...
2019-07-31 21:54:58.138 INFO --- [http-nio-8080-exec-1] com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Start completed.
2019-07-31 21:54:58.203 INFO --- [http-nio-8080-exec-1] com.wyj.interceptor.SqlStatementInterceptor - ==> transmit Parameters is [ null ]
2019-07-31 21:54:58.203 INFO --- [http-nio-8080-exec-1] com.wyj.interceptor.SqlStatementInterceptor - ==> execute Mapper name is [ com.wyj.mapper.LoggerMapper ]
2019-07-31 21:54:58.203 INFO --- [http-nio-8080-exec-1] com.wyj.interceptor.SqlStatementInterceptor - ==> execute Mapper method is [ findAll ]
2019-07-31 21:54:58.204 INFO --- [http-nio-8080-exec-1] com.wyj.interceptor.SqlStatementInterceptor - ==> execute SQL with Parameters is [ select * from `user` ]
2019-07-31 21:54:58.204 INFO --- [http-nio-8080-exec-1] com.wyj.interceptor.SqlStatementInterceptor - ==> execute SQL cost [ 359 ] ms
sql.log:
2019-07-31 21:54:58.150 DEBUG --- [http-nio-8080-exec-1] com.wyj.mapper.LoggerMapper.findAll - ==> Preparing: select * from `user`
2019-07-31 21:54:58.174 DEBUG --- [http-nio-8080-exec-1] com.wyj.mapper.LoggerMapper.findAll - ==> Parameters:
2019-07-31 21:54:58.202 DEBUG --- [http-nio-8080-exec-1] com.wyj.mapper.LoggerMapper.findAll - <== Total: 1
2019-07-31 21:54:58.203 INFO --- [http-nio-8080-exec-1] com.wyj.interceptor.SqlStatementInterceptor - ==> transmit Parameters is [ null ]
2019-07-31 21:54:58.203 INFO --- [http-nio-8080-exec-1] com.wyj.interceptor.SqlStatementInterceptor - ==> execute Mapper name is [ com.wyj.mapper.LoggerMapper ]
2019-07-31 21:54:58.203 INFO --- [http-nio-8080-exec-1] com.wyj.interceptor.SqlStatementInterceptor - ==> execute Mapper method is [ findAll ]
2019-07-31 21:54:58.204 INFO --- [http-nio-8080-exec-1] com.wyj.interceptor.SqlStatementInterceptor - ==> execute SQL with Parameters is [ select * from `user` ]
2019-07-31 21:54:58.204 INFO --- [http-nio-8080-exec-1] com.wyj.interceptor.SqlStatementInterceptor - ==> execute SQL cost [ 359 ] ms
完整的源码获取
GitHub:https://github.com/291685399/springboot-learning/tree/master/springboot-logback01