1.背景
在搭建新的系统时候必不可少的是需要日志的,日志的作用就不用多说了吧,可以用来调试程序,记录程序运行的状态,最重要的是可以用来排查线上的问题。
那我们该如何在项目中使用日志呢?
SpringBoot内部集成了LogBack日志依赖,SpringBoot默认使用LogBack记录日志信息,默认根据base.xml配置内容来输出到控制台和文件之中,这是默认的配置不能达到企业级项目的要求。
本文重点在于说明在springboot中使用logback记录日志到控制台或者文件中。
2.日志组件的分类
- Log4j Apache Log4j是一个基于Java的日志记录工具。它是由Ceki Gülcü首创的,现在则是Apache软件基金会的一个项目。 Log4j是几种Java日志框架之一。
- Log4j 2 Apache Log4j 2是apache开发的一款Log4j的升级产品。
- Commons Logging Apache基金会所属的项目,是一套Java日志接口,之前叫Jakarta Commons Logging,后更名为Commons Logging。
- Slf4j 类似于Commons Logging,是一套简易Java日志门面,本身并无日志的实现。(Simple Logging Facade for Java,缩写Slf4j)。
- Logback 一套日志组件的实现(slf4j阵营)。
3.配置流程
1.创建springboot的web工程,这里就不详细说明了
2.创建好的工程目录结构如下
这个时候我们使用默认的base.xml文件输出文件试一下,写如下测试代码并访问接口,结果如下:
默认输出了"----->test logback<-----",这是因为base.xml文件在起作用。
3.由于springboot默认继承了logback所以不需要添加任何依赖,需要说明一下的是本次使用的是lombok来简化使用logback进行测试的,通过注解@Slf4j可以很方便的打印日志
LogBack配置
LogBack读取配置文件的步骤
(1)尝试classpath下查找文件logback-test.xml
(2)如果文件不存在,尝试查找logback.xml
(3)如果两个文件都不存在,LogBack用BasicConfiguration自动对自己进行最小化配置,这样既实现了上面我们不需要添加任何配置就可以输出到控制台日志信息。如下图
4.在resources文件夹下创建logback.xml文件,并添加文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!--
debug="true" 启动时输出配置加载信息
scan="true" 默认每分钟自动扫描
scanPeriod="30 seconds" 设置每30秒自动扫描,若没有指定具体单位则以milliseconds为标准(单位:milliseconds, seconds, minutes or hours)
-->
<configuration scan="true" scanPeriod="2 seconds">
<contextName>Demo3Logging</contextName>
<property name="log.path" value="/opt"/>
<!--项目名(我是直接在ROOT)-->
<property name="logback.project.name" value="ROOT"/>
<!--日志模块名(如:默认(default),销售(sales),订单(orders)...)-->
<property name="logback.logs.module.name" value="default"/>
<timestamp key="byDay" datePattern="yyyyMMdd"/>
<!-- 控制台输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!-- 日志输出编码 -->
<layout class="ch.qos.logback.classic.PatternLayout">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
</pattern>
</layout>
</appender>
<!-- 按照每天生成日志文件 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 该文件记录当天的日志,第二天这个文件中的昨天的内容会被放在一个单独的文件中,按照fileNamePattern命名格式的文件,这个文件保存当天的日志 -->
<file>${log.path}/logs/all.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名,如果上面的file没有配置,那就一天一个文件-->
<!--
滚动时产生的文件的存放位置及文件名称 %d{yyyy-MM-dd}:按天进行日志滚动
%i:当文件大小超过maxFileSize时,按照i进行文件滚动
-->
<fileNamePattern>${log.path}/logs/all-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
<!-- 保存近10天的日志 -->
<maxHistory>10</maxHistory>
</rollingPolicy>
<!--
当日志文件超过maxFileSize指定的大小是,根据上面提到的%i进行日志文件滚动 注意此处配置SizeBasedTriggeringPolicy是无法实现按文件大小进行滚动的,
必须配置timeBasedFileNamingAndTriggeringPolicy
-->
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<layout class="ch.qos.logback.classic.PatternLayout">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
</layout>
</appender>
<!--
logger主要用于存放日志对象,也可以定义日志类型、级别
name:表示匹配的logger类型前缀,也就是包的前半部分
level:要记录的日志级别,包括 TRACE < DEBUG < INFO < WARN < ERROR
additivity:作用在于children-logger是否使用 rootLogger配置的appender进行输出,false:表示只用当前logger的appender-ref,true:表示当前logger的appender-ref和rootLogger的appender-ref都有效
-->
<logger name="org.springframework" level="INFO"/>
<!--<logger name="org.hibernate" level="ERROR" />-->
<!-- 日志输出级别 -->
<root level="INFO">
<!--<appender-ref ref="STDOUT"/>-->
<!-- 启用日志文件记录日志 -->
<appender-ref ref="FILE" />
</root>
</configuration>
对几个标签说明一下:
{log.path}/logs/all-%d{yyyy-MM-dd}-%i.log
100MB
上面fileNamePattern的%i表示,当日志文件的大小超过100M的时候,会按照%i进行日志滚动,比如今天的日志有158M,那么会生成两个文件一个是all-2018-09-26-1.log,另一个all-2018-09-26-2.log,这种格式的两个文件,就等于把文件按照100M切分。
到此,就可以在springboot中通过lombok的@Slf4j注解方便的的打印系统日志。