SpringBoot下使用Log4J2,按日期保存7天日志

本文介绍了如何在SpringBoot项目中使用Log4J2按日期保存日志,并通过SLF4J进行日志解耦。详细步骤包括导入依赖、配置log4j2.xml、安装Lombok插件以及使用@Log4j2注解进行日志打印。同时,文章提到了在配置过程中遇到的问题,如日志文件生成失败及日志清理时间设置不准确等,提供了解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考博客:

https://www.cnblogs.com/xishuai/p/spring-boot-log4j2.html

https://blog.csdn.net/shope9/article/details/87379255

2020/10/07更新

使用门面模式(slf4j)搭配log4j2进行日志解耦

关于门面模式https://www.cnblogs.com/xrq730/p/8619156.html

目录

 

导入依赖

 log4j2.xml配置文件

安装lombok插件

使用注解@Log4j2和log的方式打印日志 

总结

2020/10/07更新  使用SLF4J整合LOG4J2


导入依赖

        <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>
        
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.0.0</version>
        </dependency>
        <!-- Add Log4j2 Dependency -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j2</artifactId>
        </dependency>
        <!-- 注意日志移除依赖,上面两个依赖谁在前面就放在谁里面 -->

        <!-- Needed for Async Logging with Log4j 2 -->
        <dependency>
            <groupId>com.lmax</groupId>
            <artifactId>disruptor</artifactId>
            <version>3.3.6</version>
        </dependency>
        <!--更方便的使用log4j2,如果注解报错安装Lombok插件-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <!-- 使用jsonLayout必须依赖jackson -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.7.4</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.7.4</version>
        </dependency>

 log4j2.xml配置文件

 在resources文件夹下新建log4j2.xml文件(解释见注释)

<?xml version="1.0" encoding="UTF-8"?>
<!-- status表示log4j2本身的日志信息打印级别,和下面的level,不是一个概念。指的是如果 Log4j2 本身出错,打印出的日志级别配置 -->
<!--TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF-->
<Configuration status="OFF" monitorInterval="30">
    <Properties>
        <Property name="LOG_PATTERN">
            %d{yyyy-MM-dd HH:mm:ss.SSS} %5p ${hostName} -&#45;&#45; [%15.15t] %-40.40c{1.} : %m%n%ex
        </Property>
        <Property name="LOG_FILE_PATH">D:/var/log/threesilly</Property>
    </Properties>
    <Appenders>
        <!--输出到控制台-->
        <Console name="ConsoleAppender" target="SYSTEM_OUT" follow="true">
            <!--输出格式-->
            <PatternLayout pattern="${LOG_PATTERN}"/>
        </Console>
        <!-- Rolling File Appender -->
        <!--fileName为生成的文件名,x为路径,也可以采用相对路径模式,filePattern为时间到达后产生新日志,旧日志的文件名-->
        <RollingFile name="FileAppender" fileName="${LOG_FILE_PATH}/threesilly.log"
                     filePattern="${LOG_FILE_PATH}/threesilly-%d{yyyy-MM-dd}-%i.log">
            <!--输出格式-->
            <PatternLayout>
                <Pattern>${LOG_PATTERN}</Pattern>
            </PatternLayout>
            <!--<JsonLayout complete="false" compact="true">
                <KeyValuePair key="timestamp" value="$${date:yyyy-MM-dd'T'HH:mm:ss.SSSZ}" />
            </JsonLayout>-->
            <Filters>
                <!-- 只记录ERROR级别日志信息,程序打印的其他信息不会被记录 -->
                <!-- 此level设置的日志级别,是过滤日志文件中打印出的日志信息,和Root的level有所区别 -->
                <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY" />
            </Filters>
            <Policies>
                <!-- 此处为每个文件大小策略限制,使用它一般会在文件中filePattern采用%i模式 -->
                <SizeBasedTriggeringPolicy size="10MB" />
                <!-- 每天创建一个日志文件 -->
                <TimeBasedTriggeringPolicy interval="1" />
            </Policies>
            <DefaultRolloverStrategy max="30">
                <Delete basePath="${LOG_FILE_PATH}" maxDepth="2">
                    <IfFileName glob="*.log" />
                    <!--!Note: 这里的age必须和filePattern协调, 后者是精确到dd, 这里就要写成xd, xD就不起作用
                    另外, 数字最好>2, 否则可能造成删除的时候, 最近的文件还处于被占用状态,导致删除不成功!-->
                    <!--7天-->
                    <IfLastModified age="7d" />
                </Delete>
            </DefaultRolloverStrategy>
        </RollingFile>
    </Appenders>
    <Loggers>
        <!-- 用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等。 -->
        <!--<Logger name="com.easyjijin.demo.springbootlog4j2" level="debug" additivity="false">
            <AppenderRef ref="ConsoleAppender" />
            <AppenderRef ref="FileAppender"/>
        </Logger>-->

        <!-- AsyncRoot - 异步记录日志 - 需要LMAXDisruptor的支持 -->
        <!-- <AsyncRootlevel="info" additivity="false">
          <AppenderRef ref="Console"/>
          <AppenderRef ref="FileAppender"/>
        </AsyncRoot> -->

        <!-- All < Trace < Debug < Info < Warn < Error < Fatal < OFF. -->
             <!-- 程序会打印高于或等于所设置级别的日志,设置的日志等级越高,打印出来的日志就越少。-->
        <!-- 此level设置的日志级别,是过滤项目中输出的日志信息,和ThresholdFilter的level有所区别 -->
        <Root level="INFO">
            <AppenderRef ref="ConsoleAppender" />
            <AppenderRef ref="FileAppender"/>
        </Root>
    </Loggers>
</Configuration>

安装lombok插件

在idea的设置中按如下图安装lombok插件(为了更方便的使用)

使用注解@Log4j2和log的方式打印日志 

 

@RestController
@CrossOrigin(origins = "*", maxAge = 3600)
@RequestMapping("/liveTv")
@Log4j2
public class LiveTvController {

    @Autowired
    private LiveTvServiceImpl liveTvService;

    /**
     * 获取电视列表
     *
     * @param liveTv
     *
     * @return
     */
    @RequestMapping("/queryAll")
    public String queryAll(@RequestBody LiveTv liveTv) {
        JSONObject result = new JSONObject();
        log.debug("this is debug");
        log.info("this is info");
        log.warn("this is warn");
        log.error("this is error");
        try {
            List<LiveTv> liveTvList = liveTvService.queryAll(liveTv);
            result.put("status", "success");
            result.put("msg", "操作成功");
            result.put("data", liveTvList);
            return result.toString();
        } catch (Exception e) {
            e.printStackTrace();
            result.put("status", "fail");
            result.put("msg", "操作异常");
            return result.toString();
        }
    }

控制台效果(配置文件设置了只打印info级别以上的日志):

 日志文件:

 

配置文件中设置了日志保留7天,测试后没有问题。 

总结

 笔者在总结时,主要碰到问题是:1、可以控制台打印日志却无法生成日志文件,排查测试后发现是移除springboot的logging依赖时的顺序不对(文中第一步已指出)。2、无法删除过期的日志文件。主要问题是日志标注的时间精确度和保留时间不一致,如日志时间到天,保留时间是小时(详情见配置文件注释)。

综上记录,避免蜜汁失忆。共勉!

2020/10/07更新  使用SLF4J整合LOG4J2

导入依赖

重新放上pom,上面的有点乱了

<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>

<!--slf4j + log4j2-->
        <!--slf4j核心包-->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
        </dependency>
        <!--用于slf4j与log4j2保持桥接-->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
        </dependency>
        <!--log4j2核心包-->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
        </dependency>
        <!--用于解决web环境下关闭服务器时可能出现的log4j线程无法及时关闭的warn,web工程需要包含log4j-web,非web工程不需要-->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-web</artifactId>
        </dependency>
        <!--使用log4j2的AsyncLogger时需要包含disruptor-->
        <dependency>
            <groupId>com.lmax</groupId>
            <artifactId>disruptor</artifactId>
            <version>3.4.1</version>
        </dependency>

配置文件接着使用上面的即可

测试

import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.test.context.SpringBootTest;

@Slf4j
@SpringBootTest
class ManagementApplicationTests {

    @Test
    void contextLoads() {

        // 通常情况下打印日志的方式
        Logger logger = LoggerFactory.getLogger(ManagementApplicationTests.class);
        logger.info("hahahahahah");

        // 引入了lombok的情况下,搭配类名上的注解@Slf4j直接打印
        log.warn("heheheheheh");
    }

}

 

好的,对于你的问题,我可以给出以下的回答: 在使用logback.xml定义日志文件名字时,可以使用`%d`占位符来表示日期。例如,如果你想要日志文件名字为"mylog-2021-07-26.log",可以这样定义: ```xml <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>mylog-%d{yyyy-MM-dd}.log</file> ... </appender> ``` 这样,每生成的日志文件都会带上日期,例如"mylog-2021-07-26.log"。 对于设置大小达到一定值后,重新打印日志文件到新的文件,可以使用logback的rolling策略。例如,如果你想要每个日志文件最大为10MB,同时保留最近的7日志文件,可以这样定义: ```xml <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>mylog-%d{yyyy-MM-dd}.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>mylog-%d{yyyy-MM-dd}-%i.log</fileNamePattern> <maxHistory>7</maxHistory> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>10MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> </rollingPolicy> ... </appender> ``` 这样就可以实现每个日志文件最大为10MB,同时保留最近的7日志文件。当一个日志文件达到10MB时,logback会自动将其重命名为"mylog-2021-07-26-0.log",并开始写入新的日志文件"mylog-2021-07-26-1.log"。当保留日志文件超过7个时,最老的日志文件会被删除。 希望这些信息能够对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值