参考博客:
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} --- [%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");
参考博客:https://www.cnblogs.com/xishuai/p/spring-boot-log4j2.htmlhttps://blog.csdn.net/shope9/article/details/87379255导入依赖 <dependency> <groupId>org.springframew...
当log4j
使用DailyRollingFileAppender进行
日志归档时,需要对
日志的个数进行控制。
此时需要对DailyRollingFileAppender进行重写。
package org.apache.log4j;
import org.
slf4j.Logger;
import org.
slf4j.LoggerFactory;
import
java.io.File;
import
java.io.FileFilter;
import
java.io.IOException;
今天来谈一谈日志,主要是说一说springboot的日志,因为最近在学习springboot。首先在写代码的时候,要养成记日志的习惯,这点真的很重要,因为之前吃了很多亏。过去我对日志很不在意,该有的日志没有,不该有的日志却随意输出。新换的工作,上司对日志有严格的要求,也就慢慢开始注意了。
一般而言,一个接口或者说一段程序,其入口要有日志,记录传入的数据是什么;部分重要的处理逻辑要有日...
slf4j,即(Simple Logging Facade for Java,简单门面日志)。它是对所有日志框架制定的一种`规范、标准、接口`,并不是一个框架的具体的实现,它只服务于各种各样的日志系统。
slf4j提供了统一的记录日志的接口,对不同日志系统的具体实现进行了抽象化,只要按照其提供的方法记录即可,最终日志的格式、记录级别、输出方式等通过绑定具体的日志系统来实现。
本文实现了常用的日志输出和日志压缩、清除策略,可以轻松了解logback的使用
最近做项目的时候,遇到了日志的输出问题。我们想按小时输出日志,同时最多保存7天的日志。log4j本身自带的appender如下:
org.apache.log4j.ConsoleAppender 输出到控制台
org.apache.log4j.FileAppender 输出到文件
org.apache.log4j.DailyRollingFileAppender
org.apache.l...
日志文件大小1MB,每天最多保留10个文件,只保留7天的日志
rollingRandomAccessFile: # 日志文件Appender,将日志信息输出到日志文件
- name: ROLLING_FILE
fileName: ${logPath}/${projectName}.log
filePattern: "${logPath}/historyLogs/$${date:yyyy-MM}/${projectName}-%d{yyyy-MM-dd}-%i.log.gz"
import java.io.IOException;
import java.io.InterruptedIOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Ma
每天生成一个log4j日志文件,如果只需要将最近一段时间内的日志文件保留,以前或更早的文件不用保留。例如只保留最近一周的日志,日志文件保留3天等等这些。。。通过这个jar包就可以实现。
log4j.properties文件在包中,拷贝出来用就可以了
log4j.appender.A2=org.apache.log4j.RollingFileAppender
#定义A2输出到哪个文件
log4j.appender.A2.File=./log/test.log
#保留最近15
天的
日志
log4j.appender.A2.MaxBackupIndex = 15
#最近15
天的
日志最大限制为3MB
log4j.ap
<?xml version="1.0" encoding="UTF-8"?>
1.把spring-boot-starter的spring-boot-starter-logging 排除掉,
2.引入spring-boot-starter-log4j2、 lombok(@Log4j2),
3.把默认日志文件log4j.properties改为 log4j.properties.back
4.在类上加注解@Log4j2
官网翻译:https://blog.csdn.net/
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
2. 在项目的 resources 目录下创建 log4j2.xml 文件,并配置 log4j2 的相关参数,如:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="error">
<AppenderRef ref="Console"/>
</Root>
<Logger name="org.springframework.boot" level="info"/>
</Loggers>
</Configuration>
3. 在代码中使用 log4j2 记录日志,例如:
private static final Logger logger = LogManager.getLogger(YourClassName.class);
logger.info("This is a log4j2 log message.");
在项目启动后,log4j2 就会根据配置文件中的参数,将日志信息记录到控制台或其他地方。
同步文章至微信公众号并推送到用户
星星龙:
同步文章至微信公众号并推送到用户
qq_34333537: