1、查看pringboot自带的日志框架
新建一个springboot 工程,查看依赖树
通过查看依赖树可以发现,springboot自带被loggong管理的log4j 、logback等日志相关的依赖。为了不影响测试结果,手动排除掉龙宫依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
2、spring集成log4j2
springboot集成log4j2 与spring集成的步骤一样,
先排除掉springboot自带的日志依赖,然后引入log42依赖
<!-- 添加log4j2依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
日志配置可以通过application.properties后者yaml文件进行配置
#日志级别
logging.level.com.li=info
#日志输出格式 打印到控制台
logging.pattern.console=%d{yyyy-MM-dd} [%level] -%m%n
#将日志输出到文件 springbootlog为生成的文件名
logging.file.path=D:/test/springbootlog
同时也可以在resource目录下新建 log4j2.xml配置文件进行配置。如果xml与properties同时存在,日志级别和格式以xml配置的为准。
如果对log的功能要求比较复杂,则使用xml方式进行配置。
xml配置与spring继承log4j2的写法一样,可以参考spring集成log4j2的xml示例
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Appenders>
<!-- 配置控制台输出 -->
<Console name="consoleAppender" >
</Console>
</Appenders>
<!-- 配置logger -->
<Loggers>
<Root level="info">
<AppenderRef ref="consoleAppender"/>
</Root>
</Loggers>
</Configuration>
案例
package com.bjpowernode.springbootlog;
import org.apache.logging.log4j.LogManager;
import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class SpringbootlogApplicationTests {
@Test
public void test01() {
/*
入门案例:
springboot日志具体实现
级别测试
默认是info级别
logback的风格输出(默认使用的是logback的日志实现)
*/
Logger logger = LoggerFactory.getLogger(SpringbootlogApplicationTests.class);
logger.error("error信息");
logger.warn("warn信息");
logger.info("info信息");
logger.debug("debug信息");
logger.trace("trace信息");
}
@Test
public void test02() {
/*
使用log4j2的日志实现
观察桥接器是否起作用
结果:仍然是slf4j+logback
证明桥接器是起作用的
*/
org.apache.logging.log4j.Logger logger = LogManager.getLogger(SpringbootlogApplicationTests.class);
logger.info("info信息");
}
@Test
public void test03() {
/*
application.properties(yml)是springboot的核心配置文件(用来简化开发使用)
我们也可以通过该配置文件,修改日志相关的配置
*/
Logger logger = LoggerFactory.getLogger(SpringbootlogApplicationTests.class);
logger.error("error信息");
logger.warn("warn信息");
logger.info("info信息");
logger.debug("debug信息");
logger.trace("trace信息");
}
@Test
public void test04() {
/*
将日志输出到文件中
使用logging.file.path来配置文件路径下的文件夹(logging.file直接配置文件的形式已经过时,不使用)
在配置的文件夹下,日志文件生成的名字为spring.log
*/
Logger logger = LoggerFactory.getLogger(SpringbootlogApplicationTests.class);
logger.error("error信息");
logger.warn("warn信息");
logger.info("info信息");
logger.debug("debug信息");
logger.trace("trace信息");
}
@Test
public void test05() {
/*
如果是需要配置日志拆分等相对高级的功能
那么application.properties就达不到需要了
需要使用日志实现相应的配置文件
例如我们现在使用的是logback日志实现
那么就需要在类路径resources下,配置logback.xml
由于log4j2性能的强大
当今市场上越来越多的项目选择使用slf4j+log4j2的组合
springboot默认使用的是slf4j+logback的组合
我们可以将默认的logback替换成为log4j2
1.启动器依赖,间接的依赖logback
所以需要将之前的环境中,logback的依赖去除掉
2.添加log4j2依赖
3.将log4j2的配置文件log4j2.xml导入到类路径resources下面
*/
/*Logger logger = LoggerFactory.getLogger(SpringbootlogApplicationTests.class);
for (int i = 0; i < 2000; i++) {
logger.error("error信息");
logger.warn("warn信息");
logger.info("info信息");
logger.debug("debug信息");
logger.trace("trace信息");
}*/
Logger logger = LoggerFactory.getLogger(SpringbootlogApplicationTests.class);
logger.error("error信息");
logger.warn("warn信息");
logger.info("info信息");
logger.debug("debug信息");
logger.trace("trace信息");
}
}
3、log4j介绍
3.1组件说明
log4j1的组件:Log4j主要由 Loggers (日志记录器)、Appenders(输出控制器)和 Layout(日志格式化器)组成。其中 Loggers 控制日志的输出以及输出级别(JUL做日志级别Level)
Appenders 指定日志的输出方式(输出到控制台、文件等);
Layout 控制日志信息的输出格式。
3.2 日志级别
log4j常用的日志级别有4种:DEBUG < INFO < WARN < ERROR,分别用来指定这条日志信息的重要程度,Log4j输出日志的规则是:只输出级别不低于设定级别的日志信息,假设Loggers级别设定为INFO,则INFO、WARN、ERROR级别的日志信息都会输出,而级别比INFO低的DEBUG则不会输出。
所有级别
日志级别说明:
Log4j提供了8个级别的日志输出,分别为
ALL 最低等级 用于打开所有级别的日志记录
TRACE 程序推进下的追踪信息,这个追踪信息的日志级别非常低,一般情况下是不会使用的
DEBUG 指出细粒度信息事件对调试应用程序是非常有帮助的,主要是配合开发,在开发过程中打印一些重要的运行信息
INFO 消息的粗粒度级别运行信息
WARN 表示警告,程序在运行过程中会出现的有可能会发生的隐形的错误
注意,有些信息不是错误,但是这个级别的输出目的就是为了给程序员以提示
ERROR 系统的错误信息,发生的错误不影响系统的运行
一般情况下,如果不想输出太多的日志,则使用该级别即可
FATAL 表示严重错误,它是那种一旦发生系统就不可能继续运行的严重错误
如果这种级别的错误出现了,表示程序可以停止运行了
OFF 最高等级的级别,用户关闭所有的日志记录
其中debug是我们在没有进行设置的情况下,默认的日志输出级别
3.3 、Loggers 日志记录器
Loggers:与log4j1时的定义一样。
日志记录器,负责收集处理日志记录,实例的命名就是类的全限定名,如com.bjpowernode.log4j.XX, Logger的名字大小写敏感,其命名有继承机制父类的logger会影响子类的logger的功能:
在这里插入代码片
Log4J中有一个特殊的logger叫做“root”,他是所有logger的根,也就意味着其他所有的logger都会直接 或者间接地继承自root。root logger可以用Logger.getRootLogger()方法获取。
com.xx…og4j.XX 儿子
com.xx.log4j 父亲
com.xx爷爷
…
…
Root logger
上辈所做的日志属性设置,会直接的影响到子辈
root logger的明明规则
log4j.rootLogger=日志级别,appender1,appender3,appender3
在写appender的名字的时候,不要加appender的前缀
log4j.rootLogger=trace,console ##console 即为appender的名字
#appender
log4j.appender.console=org.apache.log4j.ConsoleAppender
自定义logger的命名: 前缀(log4j.logger)+“点包名\全限定类名”
#log4j.logger为前缀 org.apache为包名:
#表示org.apache包下的日志按error级别输出
log4j.logger.org.apache=error
通过测试结果:
从输出位置来看,控制台输出了信息,日志文件也输出了信息
所以可以得出结论,如果根节点的logger和自定义父logger配置的输出位置是不同的
则取二者的并集,配置的位置都会进行输出操作
如果二者配置的日志级别不同,以按照我们自定的父logger的级别输出为主
即:appender取并集 ,级别以自定义logger的级别为准
log4j.rootLogger=error,console
log4j.logger.com.li=debug,console
3.4 appenders 输出控制器
定义日志输出到不同的地方, 常用Appenders:
ConsoleAppender
将日志输出到控制台
FileAppender
将日志输出到文件中
DailyRollingFileAppender
将日志输出到一个日志文件,并且每天输出到一个新的文件
RollingFileAppender
将日志信息输出到一个日志文件,并且指定文件的尺寸,当文件大小达到指定尺寸时,会自动把文件改名,同时产生一个新的文件
JDBCAppender
把日志信息保存到数据库中
appender的命名方式 : 前缀(log4j.appender)+名字 : log4j.appender.name1
#配置appender输出方式 输出到控制台 console是名字,等号右面是配置appender的类型
log4j.appender.console=org.apache.log4j.ConsoleAppender
3.5 layout格式控制器
v有时用户希望根据自己的喜好格式化自己的日志输出,Log4j可以在Appenders的后面附加Layouts来完成这个功能。Layouts提供四种日志输出样式,如根据HTML样式、自由指定样式、包含日志级别与信息的样式和包含日志时间、线程、类别等信息的样式。
常用Layouts:
HTMLLayout
格式化日志输出为HTML表格形式
SimpleLayout
简单的日志输出格式化,打印的日志格式如默认INFO级别的消息
``PatternLayout
最强大的格式化组件,可以根据自定义格式输出日志,如果没有指定转换格式,
就是用默认的转换格式`
layout命名规则:前缀+".layout",此处的前缀为appender名字
如 下面是一个appender 和一个 layout
#配置appender输出方式 输出到控制台
log4j.appender.console=org.apache.log4j.ConsoleAppender
#配置输出到控制台的格式log4j.appender.console为layout的前缀
log4j.appender.console.layout=org.apache.log4j.PatternLayout
自定义layout
log4j.rootLogger=error,console
log4j.logger.com.li=debug
log4j.appender.console=org.apache.log4j.ConsoleAppender
#自定义layout的 下面两行都要有
log4j.appender.console.layout=org.apache.log4j.PatternLayout
# 自定义layout的格式
log4j.appender.console.layout.conversionPattern=[%-10p]%r %c%t%d{yyyy-MM-dd HH:mm:ss:SSS} %m%n
日志输出格式说明
%m 输出代码中指定的日志信息
%p 输出优先级,及 DEBUG、INFO 等
%n 换行符(Windows平台的换行符为 "\n",Unix 平台为 "\n")
%r 输出自应用启动到输出该 log 信息耗费的毫秒数
%c 输出打印语句所属的类的全名
%t 输出产生该日志的线程全名
%d 输出服务器当前时间,默认为 ISO8601,也可以指定格式,如:%d{yyyy年MM月dd日 HH:mm:ss}
%l 输出日志时间发生的位置,包括类名、线程、及在代码中的行数。如:Test.main(Test.java:10)
%F 输出日志消息产生时所在的文件名称
%L 输出代码中的行号
%% 输出一个 "%" 字符
可以在 % 与字符之间加上修饰符来控制最小宽度、最大宽度和文本的对其方式。如:
%5c 输出category名称,最小宽度是5,category<5,默认的情况下右对齐
%-5c 输出category名称,最小宽度是5,category<5,"-"号指定左对齐,会有空格
%.5c 输出category名称,最大宽度是5,category>5,就会将左边多出的字符截掉,<5不
会有空格
%20.30c category名称<20补空格,并且右对齐,>30字符,就从左边交远销出的字符截掉
3.6 log4j依赖
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
3.7 使用log4j
配置文件放在resource目录下,并以 log4j2.properties名义,spring会自动识别该配置文件并装载。
在使用log4j时如果不配置配置文件 则会提示
log4j:WARN No appenders could be found for logger (com.li.Test).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
如果不想写properties配置,还可以使用log4j默认的配置文件,只需要在代码中加入一行
BasicConfigurator.configure() 用来初始化配置即可。
package com.li;
import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.Logger;
/**
* @author liql
* @date 2022/3/20
*/
public class Test {
@org.junit.Test
public void test(){
BasicConfigurator.configure();//初始化配置
Logger logger = Logger.getLogger(Test.class);
logger.info("haha");
}
}
BasicConfigurator.configure()初始化的原理是加载了一个默认的rootlogger和一个appender ,以及一个默认的PatternLayout
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
package org.apache.log4j;
public class BasicConfigurator {
protected BasicConfigurator() {
}
public static void configure() {
Logger root = Logger.getRootLogger();
root.addAppender(new ConsoleAppender(new PatternLayout("%r [%t] %p %c %x - %m%n")));
}
public static void configure(Appender appender) {
Logger root = Logger.getRootLogger();
root.addAppender(appender);
}
public static void resetConfiguration() {
LogManager.resetConfiguration();
}
}
3.7.2支持的配置文件的种类
3.8 通过配置文件properties的方式来使用log4j
在resource目录下 新加一个文件: log4j.properties
通过上面对组件的说明,各个组件的功能已经明确,下面给出一个properties配置的示例
#配置根节点logger
log4j.rootLogger=trace,console
#配置自定义logger
log4j.logger.com.bjpowernode.log4j.test=info,file
#配置apache的logger
log4j.logger.org.apache=error
#配置appender输出方式 输出到控制台
log4j.appender.console=org.apache.log4j.ConsoleAppender
#配置输出到控制台的格式
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.conversionPattern=[%-10p]%r %c%t%d{yyyy-MM-dd HH:mm:ss:SSS} %m%n
#配置appender输出方式 输出到文件
log4j.appender.file=org.apache.log4j.FileAppender
#配置输出到文件中的格式
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.conversionPattern=[%-10p]%r %c%t%d{yyyy-MM-dd HH:mm:ss:SSS} %m%n
#第一个file是我们自己命名的appenderName,第二个file是用来指定文件位置的属性
log4j.appender.file.file=D://test//log4j.log
#配置输出字符编码
log4j.appender.file.encoding=UTF-8
#RollingFileAppender的配置,我们可以针对于实际含义起名
log4j.appender.rollingFile=org.apache.log4j.RollingFileAppender
log4j.appender.rollingFile.layout=org.apache.log4j.PatternLayout
log4j.appender.rollingFile.layout.conversionPattern=[%-10p]%r %c%t%d{yyyy-MM-dd HH:mm:ss:SSS} %m%n
log4j.appender.rollingFile.file=D://test//log4j.log
log4j.appender.rollingFile.encoding=UTF-8
#指定日志文件内容大小
log4j.appender.rollingFile.maxFileSize=1MB
#指定日志文件的数量
log4j.appender.rollingFile.maxBackupIndex=5
#DailyRollingFileAppender的配置,我们可以针对于实际含义起名
log4j.appender.dailyRollingFile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.dailyRollingFile.layout=org.apache.log4j.PatternLayout
log4j.appender.dailyRollingFile.layout.conversionPattern=[%-10p]%r %c%t%d{yyyy-MM-dd HH:mm:ss:SSS} %m%n
log4j.appender.dailyRollingFile.file=D://test//log4j.log
log4j.appender.dailyRollingFile.encoding=UTF-8
log4j.appender.dailyRollingFile.datePattern='.'yyyy-MM-dd HH-mm-ss
#配置appender输出方式 输出到数据库表
log4j.appender.logDB=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.logDB.layout=org.apache.log4j.PatternLayout
log4j.appender.logDB.Driver=com.mysql.jdbc.Driver
log4j.appender.logDB.URL=jdbc:mysql://localhost:3306/test
log4j.appender.logDB.User=root
log4j.appender.logDB.Password=123456
log4j.appender.logDB.Sql=INSERT INTO tbl_log(name,createTime,level,category,fileName,message) values('project_log','%d{yyyy-MM-dd HH:mm:ss}','%p','%c','%F','%m')
4、 log4j2
4.1 log4j2 简介
Log4j2包含基于LMAX Disruptor库的下一代异步记录器。在多线程场景中,异步记录器的吞吐量比Log4j 1.x和Logback高18倍,延迟低。
在稳态日志记录期间,Log4j2 在独立应用程序中是无垃圾的,在Web应用程序中是低垃圾。这减少了垃圾收集器的压力,并且可以提供更好的响应性能。
log4j2里的组件与log4j1 的组件基保持一致。
4.2 log4j2依赖
<!--log4j2 的日志门面-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.12.1</version>
</dependency>
<!--log4j2 的日志实现-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.12.1</version>
</dependency>
4.3 log4j2 的使用
package com.li;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
/**
* @author liql
* @date 2022/3/20
*/
public class Test {
@org.junit.Test
public void test1(){
Logger logger = LogManager.getLogger(Test.class);
// logger.fatal("fatal信息");
logger.error("error信息");
logger.warn("warn信息");
logger.info("info信息");
logger.debug("debug信息");
logger.trace("trace信息");
}
}
在没有配置 配置文件的情况下,log4j2的默认打印级别为error,且回提示 No Log4j 2 configuration file found.Using default configuration
"C:\Program Files\Java\jdk1.8.0_45\bin\java.exe" -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2019.3.5\lib\idea_rt.jar=57169:C:\Program Files\JetBrains\IntelliJ IDEA 2019.3.5\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\JetBrains\IntelliJ IDEA 2019.3.5\lib\idea_rt.jar;C:\Program Files\JetBrains\IntelliJ IDEA 2019.3.5\plugins\junit\lib\junit5-rt.jar;C:\Program Files\JetBrains\IntelliJ IDEA 2019.3.5\plugins\junit\lib\junit-rt.jar;C:\Program Files\Java\jdk1.8.0_45\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_45\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_45\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_45\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_45\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_45\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_45\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_45\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_45\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_45\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_45\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_45\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_45\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_45\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_45\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_45\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_45\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_45\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_45\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_45\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_45\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_45\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_45\jre\lib\rt.jar;D:\idea2019work\ceshilog\target\classes;E:\MAVEN2\localRepo\junit\junit\4.12\junit-4.12.jar;E:\MAVEN2\localRepo\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar;E:\MAVEN2\localRepo\org\apache\logging\log4j\log4j-api\2.12.1\log4j-api-2.12.1.jar;E:\MAVEN2\localRepo\org\apache\logging\log4j\log4j-core\2.12.1\log4j-core-2.12.1.jar" com.intellij.rt.junit.JUnitStarter -ideVersion5 -junit4 com.li.Test,test2
ERROR StatusLogger No Log4j 2 configuration file found. Using default configuration (logging only errors to the console), or user programmatically provided configurations. Set system property 'log4j2.debug' to show Log4j 2 internal initialization logging. See https://logging.apache.org/log4j/2.x/manual/configuration.html for instructions on how to configure Log4j 2
12:30:28.316 [main] ERROR com.li.Test - error信息
Process finished with exit code 0
4.3 log4j2 配置文件
log4j2 也支持多种配置文件,但一般使用xml作为配置文件。
在 resource目录下创建 log4j2.xml 文件作为配置文件,spring项目会自动加载。
xml中有许多标签,
:写输出的方式
:日志记录器
标签的使用流程大致为 定义appender,在logger中引用appender
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="debug"> <!--status可有可无,表示是log4j2自身的日志打印级别-->
<!--定义appender target="SYSTEM_ERR" 表示打印的日志为红色字体-->
<appenders>
<Console name="consoleAppender" target="SYSTEM_ERR">
</Console>
</appenders>
<Loggers>
<root level="info">
<!--引用appender-->
<AppenderRef ref="consoleAppender"></AppenderRef>
</root>
</Loggers>
</Configuration>
4.4 log4j2集成日志门面slf4j
调用原理: slf4j门面会调用log4j2的门面,然后再有log4j2门面调用log4j2的日志实现
slf4j-api -> log4j-api ->log4j-core
导入步骤
1.导入slf4j的日志门
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>2.0.0-alpha1</version>
</dependency>
2.导入log4j2的适配器
适配器版本貌似要与log4j2版本保持一致,不然会报错(未严格测试)
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.12.1</version>
</dependency>
3.导入log4j2的日志门面
<!-- log4j2日志门面 -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.12.1</version>
</dependency>
4.导入log4j2的日志实现
<!-- log4j2日志实现 -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.12.1</version>
</dependency>
由于地层使用的log4j2的日志实现,所以依然需要提供log4j2.xml 配置文件
package com.li;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @author liql
* @date 2022/3/20
*/
public class Test {
@org.junit.Test
public void test1(){
Logger logger = LoggerFactory.getLogger(Test.class);
// logger.fatal("fatal信息");
logger.error("error信息");
logger.warn("warn信息");
logger.info("info信息");
logger.debug("debug信息");
logger.trace("trace信息");
}
}
log4j2的xml文件参考示例
如果想使用异步日志 需添加异步依赖和配置properties文件
<!-- 异步日志依赖 -->
<dependency>
<groupId>com.lmax</groupId>
<artifactId>disruptor</artifactId>
<version>3.3.7</version>
</dependency>
properties文件
在resource目录下新建一个
log4j2.component.properties 文件
Log4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="error"> <!--status 可有可无,表示是log4j2自身的日志打印级别-->
<!--
配置全局通用属性
-->
<properties>
<property name="logDir">D://test</property>
</properties>
<!-- 配置appender -->
<Appenders>
<!-- 配置控制台输出 -->
<Console name="consoleAppender" target="SYSTEM_OUT">
</Console>
<!-- 配置文件输出-->
<File name="fileAppender" fileName="${logDir}//log4j2.log">
<!-- 配置文件输出格式 -->
<PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %m%n"/>
</File>
<!--
按照指定规则来拆分日志文件
fileName:日志文件的名字
filePattern:日志文件拆分后文件的命名规则
$${date:yyyy-MM-dd}:根据日期当天,创建一个文件夹
例如:2021-01-01这个文件夹中,记录当天的所有日志信息(拆分出来的日志放在这个文件夹中)
2021-01-02这个文件夹中,记录当天的所有日志信息(拆分出来的日志放在这个文件夹中)
rollog-%d{yyyy-MM-dd-HH-mm}-%i.log
为文件命名的规则:%i表示序号,从0开始,目的是为了让每一份文件名字不会重复
-->
<RollingFile name="rollingFile" fileName="${logDir}/rollog.log"
filePattern="${logDir}/$${date:yyyy-MM-dd}/rollog-%d{yyyy-MM-dd-HH-mm}-%i.log">
<!-- 日志消息格式 -->
<PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %m%n"/>
<Policies>
<!-- 在系统启动时,触发拆分规则,产生一个日志文件 -->
<OnStartupTriggeringPolicy/>
<!-- 按照文件的大小进行拆分 -->
<SizeBasedTriggeringPolicy size="10KB"/>
<!-- 按照时间节点进行拆分 拆分规则就是filePattern-->
<TimeBasedTriggeringPolicy/>
</Policies>
<!-- 在同一目录下,文件的个数限制,如果超出了设置的数值,则根据时间进行覆盖,新的覆盖旧的规则-->
<DefaultRolloverStrategy max="30"/>
</RollingFile>
<!-- 配置异步日志 -->
<!--<Async name="myAsync">
<!– 将控制台输出做异步的操作 –>
<AppenderRef ref="consoleAppender"/>
</Async>-->
</Appenders>
<!-- 配置logger -->
<Loggers>
<!-- 自定义logger,让自定义的logger为异步logger -->
<!--
includeLocation="false"
表示去除日志记录中的行号信息,这个行号信息非常的影响日志记录的效率(生产中都不加这个行号)
严重的时候可能记录的比同步的日志效率还有低
additivity="false"
表示不继承rootlogger
-->
<AsyncLogger name="com.bjpowernode" level="trace"
includeLocation="false" additivity="false">
<!-- 将控制台输出consoleAppender,设置为异步打印 -->
<AppenderRef ref="consoleAppender"/>
</AsyncLogger>
<!-- 配置rootlogger -->
<Root level="trace">
<!-- 引用Appender -->
<!--<AppenderRef ref="consoleAppender"/>-->
<!--<AppenderRef ref="fileAppender"/>-->
<!--<AppenderRef ref="rollingFile"/>-->
<!--<AppenderRef ref="myAsync"/>-->
<AppenderRef ref="consoleAppender"/>
</Root>
</Loggers>
</Configuration>
5 、logback的xml配置示例
在resource目录下创建logback.xml 文件
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!--
配置文件通用属性
<property name="" value=""></property>
所谓配置文件中的通用属性是为了让接下来的配置更加方便引用
通过以${name}的形式,方便的取得value值
通过取得的value值可以做文件的其他配置而使用
-->
<!--
我们在此可以先做日志输出格式相关的配置
%-10level 级别 案例为设置10个字符,左对齐
%d{yyyy-MM-dd HH:mm:ss.SSS} 日期
%c 当前类全限定名
%M 当前执行日志的方法
%L 行号
%thread 线程名称
%m或者%msg 信息
%n 换行
以property的形式将日志输出格式配置成为文件的通用的属性
那么下面我们配置的输出方式中,就可以重复的引用该配置(以下的配置,对于输出格式就不用配置多次了)
-->
<property name="pattern" value="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L %thread %m%n"></property>
<property name="pattern1" value="[%-5level]%d{yyyy-MM-dd HH:mm:ss.SSS}%c%M%L%thread%m%n"></property>
<!-- 配置文件的输出路径 -->
<property name="logDir" value="D://test"></property>
<!-- 配置文件的appender 普通文件-->
<appender name="fileAppender" class="ch.qos.logback.core.FileAppender">
<!-- 引入文件位置 -->
<file>${logDir}/logback.log</file>
<!-- 设置输出格式 -->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
</appender>
<!-- 配置控制台appender -->
<appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
<!--
表示对于日志输出目标的配置
默认:System.out 表示以黑色字体输出日志
设置:System.err 表示以红色字体输出日志
-->
<target>
System.err
</target>
<!--
配置日志输出格式
手动配置格式的方式
直接引入上述的通用属性即可
-->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!-- 格式引用通用属性配置 -->
<pattern>${pattern}</pattern>
</encoder>
</appender>
<!-- 配置文件的appender html文件 -->
<appender name="htmlFileAppender" class="ch.qos.logback.core.FileAppender">
<file>${logDir}/logback.html</file>
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="ch.qos.logback.classic.html.HTMLLayout">
<pattern>${pattern1}</pattern>
</layout>
</encoder>
</appender>
<!-- 配置文件的appender 可拆分归档的文件 -->
<appender name="roll" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 输入格式 -->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
<!-- 引入文件位置 -->
<file>${logDir}/roll_logback.log</file>
<!-- 指定拆分规则 -->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 按照时间和压缩格式声明文件名 压缩格式gz -->
<fileNamePattern>${logDir}/roll.%d{yyyy-MM-dd}.log%i.gz</fileNamePattern>
<!-- 按照文件大小来进行拆分 -->
<maxFileSize>1KB</maxFileSize>
</rollingPolicy>
</appender>
<!-- 配置控制台的appender 使用过滤器 -->
<appender name="consoleFilterAppender" class="ch.qos.logback.core.ConsoleAppender">
<target>
System.err
</target>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
<!-- 配置过滤器 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 设置日志的输出级别 -->
<level>ERROR</level>
<!-- 高于level中设置的级别,则打印日志 -->
<onMatch>ACCEPT</onMatch>
<!-- 低于level中设置的级别,则屏蔽日志 -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 配置异步日志 -->
<appender name="asyncAppender" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="consoleAppender"/>
</appender>
<!--
日志记录器
配置root logger
level:配置日志级别
可以同时配置多个appender,做日志的多方向输出
-->
<root level="ALL">
<!-- 引入appender -->
<!--<appender-ref ref="roll"/>-->
<!--<appender-ref ref="consoleFilterAppender"/>-->
<!--<appender-ref ref="consoleAppender"/>-->
<appender-ref ref="asyncAppender"/>
</root>
<!--
additivity="false"
表示不继承rootlogger
-->
<logger name="com.bjpowernode" level="info" additivity="false">
<!-- 在自定义logger中配置appender -->
<appender-ref ref="consoleAppender"/>
</logger>
</configuration>
该文章参考动力节点在b站上的视频
传送门 https://www.bilibili.com/video/BV1Mb4y1Z74W?p=100&spm_id_from=pageDriver