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

编程入门 行业动态 更新时间:2024-10-26 09:34:37

SpringBoot下使用Log4J2,按日期保存7<a href=https://www.elefans.com/category/jswz/34/1212675.html style=天日志"/>

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

参考博客:

.html

2020/10/07更新

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

关于门面模式.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 {@Autowiredprivate 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 {@Testvoid contextLoads() {// 通常情况下打印日志的方式Logger logger = LoggerFactory.getLogger(ManagementApplicationTests.class);logger.info("hahahahahah");// 引入了lombok的情况下,搭配类名上的注解@Slf4j直接打印log.warn("heheheheheh");}}

 

更多推荐

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

本文发布于:2024-02-11 18:01:41,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1682451.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:天日   按日   SpringBoot

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!