持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第4天,点击查看活动详情
五、日志文件输出
以上都是把日志输出到控制体,那在实际项目中这肯定是不行的,对于阅读分析会造成很多麻烦,因此我们需要将相关的日志都输出到日志文件中,便于我们后期阅读。
5-1、通过logging.file.name设置
- 可以设置文件的名称, 如果没有设置路径会默认在项目的相对路径下
- 还可以指定路径+文件名 D:/jony.log
5-2、通过logging.file.path设置
- 不可以指定文件名称, 必须要指定一个物理文件夹路径,会默认使用spring.log
我们再尝试给d盘下添加文件,可以看到实际上还是把文件名,当做了路径来输出,然后再路径下输出spring.log日志文件
5-2、logging.file.name和logging.file.path的区别
| logging.file.name | logging.file.path | 实例 | 描述 |
|---|---|---|---|
| (没有) | (没有) | 仅控制台记录。 | |
| 指定文件名 | (没有) | my.log | 写入指定的日志文件。 |
| (没有) | 具体目录 | /var/log | 写入spring.log指定的目录。 |
六、日志的存档
在项目访问量比较大的情况下,如果只输出一个文件,会导致这一个文件里面的内容会越来越大,在需要阅读日志文件的时候,打开文件就会变的相当麻烦,甚至无法打开的情况,而且也无法顺利准确定位到我们需要查看日期的日志。因此我们就需要对日志输出进行管理,可以设置10mb存储为一个日志文件,超过之后再在新的日志文件中存储。
在项目实际情况中,我们需要进行评估,如果一天内产生的日志量比较大,那我们就需要将一天内的日志进行多文件存储;如果一天内产生的日志量较小,则可以存储到一个文件中。因此日志的输出规格,需要我们根据实际情况进行评估。
如果使用的是Logback,则可以使用application.properties或application.yaml文件微调日志轮播设置。对于所有其他日志记录系统,您需要直接自己配置轮转设置(例如,如果使用Log4J2,则可以添加log4j.xml文件)。
6-1、logback的日志配置
| 名称 | 描述 | 说明 |
|---|---|---|
| logging.logback.rollingpolicy.file-name-pattern | 归档的文件名 | ${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz |
| logging.logback.rollingpolicy.clean-history-on-start | 如果应在应用程序启动时进行日志归档清理。 | false |
| logging.logback.rollingpolicy.max-file-size | 归档前日志文件的最大大小。 | 10MB |
| logging.logback.rollingpolicy.total-size-cap | 删除日志档案之前可以使用的最大大小。 | 0B |
| logging.logback.rollingpolicy.max-history | 保留日志存档的天数(默认为7) | 7 |
6-2、压缩日志名称命名
对于以上配置参数,比较难理解的就是:logging.logback.rollingpolicy.file-name-pattern解析如下:
- ${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz
- ${LOG_FILE} 对应 logging.file.name
- %d{yyyy-MM-dd} 日期 年-月-日
- %i 索引, 当文件超出指定大小后进行的文件索引递增
6-3、日志归档的删除
logging.logback.rollingpolicy.max-history:
日志最久保存天数,默认7天。
logging.logback.rollingpolicy.total-size-cap:
指当文件最大到多少时就进行删除,默认是0B,不删除
logging.logback.rollingpolicy.clean-history-on-start:
在应用程序启动时进行日志归档清理。
6-4、logbakc日志测试
首先将日志最大设置为5KB,然后就可以看到在日志目录中,就会将我们历史的文件进行压缩。根据上面我们说的日志名称进行处理,最终为.gz文件
七、logback配置文件
在application.properties中只能配置logback的简单信息,要使用logback的其他高级功能比如,将日志发送到邮箱,或者记录到数据库,就没办法使用了,只能单独配置logback的配置文件。
需要注意的是,如果配置了单独的日志文件,在application.properties中配置的日志信息就无效了
7-1、创建logback日志配置文件
可以从官网拷贝一个基本版的配置文件,如下操作步骤
1、ducumentation
2、The logback manual
3、appenders
4、基本版配置
5、在项目中新建logback.xml,并将上面信息拷贝到文件中。
<configuration>
<!--appender 追加器 日志以哪种方式进行输出
name 取个名字
class 不同实现类会输出到不同地方
ch.qos.logback.core.ConsoleAppender 输出到控制台
-->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!--格式-->
<encoder>
<pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern>
</encoder>
</appender>
<!--控制所有的日志级别-->
<root level="DEBUG">
<!-- 将当前日志级别输出到哪个追加器上面 -->
<appender-ref ref="STDOUT" />
</root>
</configuration>
7-2、设置跟细粒度的日志级别
在上面提到给我们自己写的代码设置单独的日志级别,在logback.xml中也可以进行设置,如下:
<logger name="com.jony" level="INFO"></logger>
这样在com.jony包下面的代码相关日志级别就设置为INFO了。
7-3、设置项目环境的日志输出信息
在之前的文章中提到,可以在配置文件中设置项目的当前环境,如设置开发环境:
spring.profiles.active=dev
在logback.xml中是没有设置环境变量的配置信息的,但是springboot中提供了相关配置信息如下:
根据以上的信息,我们配置项目环境的日志信息
设置dev输出日志信息为----;pro输入日志信息为+++++
运行测试一下
可以发现控制台信息报错了,提示没有这个标签,这是因为刚刚springProfile是springboot的,不是logback的标签,因此在logback.xml中是无法直接使用的。
可以看下spring官网的信息
logback自己有一套加载的机制,如果日志配置文件为logback.xml,则在springboot容器加载之前就加载了,需要将配置文件改为logback-spring.xml这样logback才加载不到。
如下图这样就可以加载成功,并且加载为dev的环境
把环境改为pro,再查看下日志的输出信息
7-4、在logback-spring配置文件中引用springboot全局配置文件中的配置项
在logback-spring.xml的配置文件中,我们可以使用application.properties中的配置项信息,如在application.properties中,我们之前配置了logging.pattern.dateformat=yyyy-MM-dd,这样在logback-spring.xml中就可以这样使用
<!--可以引用SpringBoot全局配置文件中的配置项-->
<springProperty scope="context" name="dateformat" source="logging.pattern.dateformat"
defaultValue="-yyyy-MM-dd HH:mm:ss.SSS"/>
其中source的值即为application.properties中的配置信息key;defaultValue如果配置信息中没有,则使用这个值;scope=context当前配置只在当前上线文中其作用;name则为起的名字
在日志显示格式中,就可以使用了,如下:
将application.properties中的logging.pattern.dateformat注释掉,再次启动如下:
八、日志框架的切换
上面提到我们使用slf4j就是为了可以方便切换日志框架,那我们现在充logback日志框架切换为log4j2该如何操作呢
8-1、首先引入slf4j-log4j2的启动器
<!--log4j2的启动器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
在上面我们并未添加logback的启动器,为什么可以使用了呢,因为springboot中spring-boot-starter-web启动器已经自动添加了logback的依赖。
8-2、logback切换为log4j2日志
在之前文章中有提到,项目中只能存在一个日志桥接器,现在同时存在logback和log4j2,运行则会报错,如下:
8-2-1、排除logback的依赖
<dependency>
<!--starter-web中自动添加了starter-logging 也就是logback的依赖-->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<!--排除starter-logging 也就是logback的依赖-->
<exclusion>
<artifactId>spring-boot-starter-logging</artifactId>
<groupId>org.springframework.boot</groupId>
</exclusion>
</exclusions>
</dependency>
在starter-web中添加exclusions,设置排除spring-boot-starter-logging。
8-2-2、添加log4j2的桥接器
<!--Log4j2的场景启动器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
8-2-3、添加log4j2的日志配置文件
log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration status="OFF">
<appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} ++++ %msg%n"/>
</Console>
</appenders>
<loggers name="com.jony" level="TRACE"></loggers>
<loggers>
<root level="info">
<appender-ref ref="Console"/>
</root>
</loggers>
</configuration>
8-2-4、测试
8-3、logback切换为log4j
8-3-1、 要将logback的桥接器排除
<dependency>
<!--starter-web中自动添加了starter-logging 也就是logback的依赖-->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<!--排除starter-logging 也就是logback的依赖-->
<!-- <exclusion>-->
<!-- <artifactId>spring-boot-starter-logging</artifactId>-->
<!-- <groupId>org.springframework.boot</groupId>-->
<!-- </exclusion>-->
<!--排除logback桥接器-->
<exclusion>
<artifactId>logback-classic</artifactId>
<groupId>ch.qos.logback</groupId>
</exclusion>
</exclusions>
</dependency>
8-3-2、添加log4j的桥接器
<!--添加log4j桥接器-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</dependency>
8-3-3、添加log4j配置文件
log4j.properties
#trace<debug<info<warn<error<fatal
log4j.rootLogger=trace, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n