一、简介
为了方便查询问题,将日志按info、error级别等输出到日志文件。
若是用一个文件来存储所有的日志,那么这个文件会越来越大,不利于我们查询日志。
所以这里我们将日志按日期存储,每天都会创建一个对应日期的文件夹来存放当天的日志文件。
并且为了不让日志文件太大,影响我们查询,因此在日期文件夹中还需要按大小来切割成多个日志文件存放。
使用的是SpringBoot+log4j2。
将springboot项目打包成jar包运行,日志的配置依然有效。使用java -jar demo.jar运行jar包,日志会输出到设置的目录中。
二、实践
1.创建springboot项目,pom文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.1</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- 去除日志默认配置 -->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- log4j2 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
<version>1.5.6.RELEASE</version>
</dependency>
<!-- 支持识别yml配置 -->
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-yaml</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2.在resources文件夹下创建log4j2.yml文件,内容如下:
Appenders:
Console: #输出到控制台
name: CONSOLE #Appender命名
target: SYSTEM_OUT
PatternLayout:
pattern: "%d{yyyy-MM-dd HH:mm:ss,SSS}:%4p %t (%F:%L) - %m%n" #输出日志的格式
RollingFile: # 输出到文件
- name: RollingFileInfo #复数加上- info级别的日志设置
ignoreExceptions: false #是否忽略异常
fileName: D://logs/info.log #日志地址
filePattern: "D://logs/info/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log" #日志超过设置的限制大小则另外新建文件
PatternLayout:
pattern: "%d{yyyy-MM-dd HH:mm:ss,SSS}:%4p %t (%F:%L) - %m%n" #输出日志格式
Policies:
SizeBasedTriggeringPolicy:
size: "3 KB" #限制日志文件大小为3kb,超出3kb则另外创建日志文件,可以根据实际修改这个大小
DefaultRolloverStrategy:
max: 1000 #同一文件夹1000个文件开始覆盖,不设置的话默认7个文件开始覆盖
ThresholdFilter:
level: "info" #日志级别
onMatch: "ACCEPT" #info及以上级别则打印
onMismatch: "DENY" #info以下级别不打印
- name: RollingFileError #复数加上- error级别的日志设置,同info类似
ignoreExceptions: false
fileName: D://logs/error.log
filePattern: "D://logs/error/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log"
PatternLayout:
pattern: "%d{yyyy-MM-dd HH:mm:ss,SSS}:%4p %t (%F:%L) - %m%n"
Policies:
SizeBasedTriggeringPolicy:
size: "3 KB"
DefaultRolloverStrategy:
max: 1000
ThresholdFilter:
level: "error"
onMatch: "ACCEPT"
onMismatch: "DENY"
Loggers:
Root:
level: info #日志级别
AppenderRef:
- ref: CONSOLE #复数加上-
- ref: RollingFileInfo
- ref: RollingFileError
Logger: #单独设置某些包的输出级别
- name: com.example.demo #复数加上-(这里我设置的是包的根路径的包名)
additivity: false #去除重复的log
level: info
AppenderRef:
- ref: CONSOLE #复数加上-
- ref: RollingFileInfo #复数加上-
- ref: RollingFileError #复数加上-
这里我是在window系统运行的,所以日志文件目录是window格式的,若是在linux系统的话,改成对应的路径格式就行了。
这里我输出了info及以上级别的日志文件和单独error级别的日志文件。
3.创建controller文件,方便调用来输出日志
package com.example.demo.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TestController {
Logger logger = LoggerFactory.getLogger(TestController.class);
@RequestMapping("/test")
public String test(){
logger.info("test success");
logger.error("test error");
return "success";
}
}
这样就可以开始测试了。
三、测试
1.启动项目,查看日志目录
可以看到自动生成了日志目录和文件
2.调用接口打印日志
之后查看日志文件,可以看到输出了对应的日志。
3.多次调用接口打印日志
多次打印日志后,当日志文件超过3kb时,将开始创建文件夹来存放对应的日志,并且按大小分割成多个日志文件存储。