所有的测试内容同步到:https://gitee.com/panlsp/logging_framework
常见的日志框架及日志门面常见的日志实现:JUL、log4j、logback、log4j2
常见的日志门面:JCL、slf4j
出现顺序:log4j -->JUL–>JCL–> slf4j --> logback --> log4j2e
1、log4j 日志框架 导入依赖log4j log4j 1.2.17 junit junit 4.13.2 test
注意加载初始化信息: Basicconfigurator.configure();
日志级别说明:
Log4j 提供了8个级别的日志输出,分别为:
ALL 最低等级用于打开所有级别的日志记录
TRACE 程序推进下的追踪信息,这个追踪信息的日志级别非常低,一般情况下是不会使用的
DEBUG 指出细粒度信息事件对调试应用程序是非常有帮助的,主要是配合开发,在开发过程中打印一些重要的运行信息
INFO 消息的粗粒度级别运行信息
WARN 表示警告,程序在运行过程中会出现的有可能会发生的隐形的错误注意,有些信息不是错误,但是这个级别的输出目的就是为了给程序员以提示
ERROR 系统的错误信息,发生的错误不影响系统的运行一般情况下,如果不想输出太多的日志,则使用该级别即可
FATAL 表示严重错误,它是那种一旦发生系统就不可能继续运行的严重错误如果这种级别的错误出现了,表示程序可以停止运行了
OFF 最高等级的级别,用户关闭所有的日志记录
1.1、入门案例public class MyTest {
static Logger logger = Logger.getLogger(MyTest.class);
// 使用默认的日志(控制台日志,无需配置文件)
@Test
public void test1() {
// 加载初始化信息
BasicConfigurator.configure();
logger.trace("trace 信息");
logger.debug("debug 信息");
logger.info("info 信息");
logger.warn("warn 信息");
logger.error("error 信息");
logger.fatal("fatal 信息");
}
}
日志默认级别:debug
1.2、快速上手配置文件配置:log4j.properties(需要放在resources文件夹下)
#配置根节点logger log4j.rootLogger=日志级别,{自定义名字1,自定义名字2}
log4j.rootLogger=trace,console,file
#配置.appender输出方式输出到控制台
log4j.appender.console=org.apache.log4j.ConsoleAppender
#配置输出到控制台的格式
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.conversionPattern=[%-6p]%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=[%-6p]%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
测试:
// 2、快速上手
@Test
public void test2() {
logger.trace("trace 信息");
logger.debug("debug 信息");
logger.info("info 信息");
logger.warn("warn 信息");
logger.error("error 信息");
logger.fatal("fatal 信息");
}
生成的日志文件:
1.3、按照文件大小拆分日志当日志过量时,新日志会覆盖旧日志
配置文件配置:
#配置根节点logger log4j.rootLogger=日志级别,{自定义名字1,自定义名字2}
log4j.rootLogger=trace,rollingFile
#配置appender输出方式输出到文件(文件大小进行拆分)
log4j.appender.rollingFile=org.apache.log4j.RollingFileAppender
#配置输出到文件中的格式
log4j.appender.rollingFile.layout=org.apache.log4j.PatternLayout
log4j.appender.rollingFile.layout.conversionPattern=[%-6p]%r %c%t%d{yyyy-MM-dd HH:mm:ss:SSS} %m%n
#第一个file是我们自己命名的appenderName,第二个file是用来指定文件位置的属性
log4j.appender.rollingFile.file=D://test//log4j.log
#配置输出字符编码
log4j.appender.rollingFile.encoding=UTF-8
#配置文件的最大尺寸(默认值:10485760L)10M
log4j.appender.rollingFile.MaxFileSize=10M
#配置最大记录文件数(默认值:1)
log4j.appender.rollingFile.MaxBackupIndex=5
测试:
// 3、按照文件大小拆分日志
@Test
public void test3() {
for (int i = 0; i < 100000; i++) {
logger.trace("trace 信息");
logger.debug("debug 信息");
logger.info("info 信息");
logger.warn("warn 信息");
logger.error("error 信息");
logger.fatal("fatal 信息");
}
}
生成的日志文件:
1.4、按照时间进行日志拆分日志冗余需要自己手动清理或者写shell脚本
配置文件配置:
#配置根节点logger log4j.rootLogger=日志级别,{自定义名字1,自定义名字2}
log4j.rootLogger=trace,console,dailyRollingFile
#配置.appender输出方式输出到控制台
log4j.appender.console=org.apache.log4j.ConsoleAppender
#配置输出到控制台的格式
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.conversionPattern=[%-6p]%r %c%t%d{yyyy-MM-dd HH:mm:ss:SSS} %m%n
#配置appender输出方式输出到文件(文件时间进行拆分)
log4j.appender.dailyRollingFile=org.apache.log4j.DailyRollingFileAppender
#配置输出到文件中的格式
log4j.appender.dailyRollingFile.layout=org.apache.log4j.PatternLayout
log4j.appender.dailyRollingFile.layout.conversionPattern=[%-6p]%r %c%t%d{yyyy-MM-dd HH:mm:ss:SSS} %m%n
#第一个file是我们自己命名的appenderName,第二个file是用来指定文件位置的属性
log4j.appender.dailyRollingFile.file=D://test//log4j.log
#配置输出字符编码
log4j.appender.dailyRollingFile.encoding=UTF-8
#配置文件的拆分时间(默认值:'.'yyyy-MM-dd)每天午夜滚动。 便于测试,如下使用的是一分钟
log4j.appender.dailyRollingFile.DatePattern='.'yyyy-MM-dd-HH-mm
测试:
// 3、按照时间拆分日志
@Test
public void test4() throws InterruptedException {
for (int i = 0; i < 3; i++) {
logger.trace("trace 信息");
logger.debug("debug 信息");
logger.info("info 信息");
logger.warn("warn 信息");
logger.error("error 信息");
logger.fatal("fatal 信息");
// 休眠一分钟
Thread.sleep(1000 * 60);
}
}
生成的日志文件:
1.5、日志持久化到数据库表中导入mysql的驱动:
mysql mysql-connector-java 5.1.49
数据表结构(tb_log4j):
CREATE TABLE `tb_log4j` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL COMMENT '项目名称', `createTime` varchar(255) DEFAULT NULL COMMENT '创建时间', `level` varchar(255) DEFAULT NULL COMMENT '日志级别', `category` varchar(255) DEFAULT NULL COMMENT '所在类的全路径', `fileName` varchar(255) DEFAULT NULL COMMENT '文件名称', `message` varchar(255) DEFAULT NULL COMMENT '日志消息', PRIMARY KEY (`id`) )
配置文件:
#配置根节点logger log4j.rootLogger=日志级别,{自定义名字1,自定义名字2}
log4j.rootLogger=trace,console,logDB
#配置appender输出方式输出到数据库表中
log4j.appender.logDB=org.apache.log4j.jdbc.JDBCAppender
#配置输出到文件中的格式
log4j.appender.logDB.layout=org.apache.log4j.PatternLayout
#配置数据库的连接
log4j.appender.logDB.URL=jdbc:mysql://localhost:3306/log4j?useSSL=false&useUnicode=true&characterEncoding=UTF-8
log4j.appender.logDB.User=root
log4j.appender.logDB.Password=root
log4j.appender.logDB.Sql=insert into tb_log4j(name,createTime,level,category,fileName,message) values ('log4j_project','%d{yyyy-MM-dd HH:mm:ss:SSS}','%p','%c','%F','%m')
测试:
// 3、日志持久化到数据库表中
@Test
public void test5() {
logger.trace("trace 信息");
logger.debug("debug 信息");
logger.info("info 信息");
logger.warn("warn 信息");
logger.error("error 信息");
logger.fatal("fatal 信息");
}
日志信息:
1.6、配置自定义logger配置文件:
#配置根节点logger log4j.rootLogger=日志级别,{自定义名字1,自定义名字2}
log4j.rootLogger=trace,file
#配置自定义logger(日志打印级别)
log4j.logger.com.yanchi=info,console
#配置.appender输出方式输出到控制台
log4j.appender.console=org.apache.log4j.ConsoleAppender
#配置输出到控制台的格式
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.conversionPattern=[%-6p]%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=[%-6p]%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
测试:
// 4、配置自定义logger
@Test
public void test6() {
logger.trace("trace 信息");
logger.debug("debug 信息");
logger.info("info 信息");
logger.warn("warn 信息");
logger.error("error 信息");
logger.fatal("fatal 信息");
}
日志信息:
1.7、完整版配置(按需修改)#配置根节点logger log4j.rootLogger=日志级别,{自定义名字1,自定义名字2}
log4j.rootLogger=trace,file
#配置自定义logger
log4j.logger.com.yanchi=info,console
#配置.appender输出方式输出到控制台
log4j.appender.console=org.apache.log4j.ConsoleAppender
#配置输出到控制台的格式
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.conversionPattern=[%-6p]%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=[%-6p]%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
#配置appender输出方式输出到文件(文件大小进行拆分)
log4j.appender.rollingFile=org.apache.log4j.RollingFileAppender
#配置输出到文件中的格式
log4j.appender.rollingFile.layout=org.apache.log4j.PatternLayout
log4j.appender.rollingFile.layout.conversionPattern=[%-6p]%r %c %t %d{yyyy-MM-dd HH:mm:ss:SSS} %m%n
#第一个file是我们自己命名的appenderName,第二个file是用来指定文件位置的属性
log4j.appender.rollingFile.file=D://test//log4j.log
#配置输出字符编码
log4j.appender.rollingFile.encoding=UTF-8
#配置文件的最大尺寸(默认值:10485760L)10M
log4j.appender.rollingFile.MaxFileSize=10M
#配置最大记录文件数(默认值:1)
log4j.appender.rollingFile.MaxBackupIndex=5
#配置appender输出方式输出到文件(文件时间进行拆分)
log4j.appender.dailyRollingFile=org.apache.log4j.DailyRollingFileAppender
#配置输出到文件中的格式
log4j.appender.dailyRollingFile.layout=org.apache.log4j.PatternLayout
log4j.appender.dailyRollingFile.layout.conversionPattern=[%-6p]%r %c %t %d{yyyy-MM-dd HH:mm:ss:SSS} %m%n
#第一个file是我们自己命名的appenderName,第二个file是用来指定文件位置的属性
log4j.appender.dailyRollingFile.file=D://test//log4j.log
#配置输出字符编码
log4j.appender.dailyRollingFile.encoding=UTF-8
#配置文件的拆分时间(默认值:'.'yyyy-MM-dd)每天午夜滚动。 便于测试,如下使用的是一分钟
log4j.appender.dailyRollingFile.DatePattern='.'yyyy-MM-dd-HH-mm
#配置appender输出方式输出到数据库表中
log4j.appender.logDB=org.apache.log4j.jdbc.JDBCAppender
#配置输出到文件中的格式
log4j.appender.logDB.layout=org.apache.log4j.PatternLayout
#配置数据库的连接
log4j.appender.logDB.URL=jdbc:mysql://localhost:3306/log4j?useSSL=false&useUnicode=true&characterEncoding=UTF-8
log4j.appender.logDB.User=root
log4j.appender.logDB.Password=root
log4j.appender.logDB.Sql=insert into tb_log4j(name,createTime,level,category,fileName,message) values ('log4j_project','%d{yyyy-MM-dd HH:mm:ss:SSS}','%p','%c','%F','%m')
2、JCL 日志门面
简介:
全称为Jakarta Commons Logging,是Apache提供的一个 通用日志API
用户可以自由选择第三方的日志组件作为具体实现,像 log4j,或者jdk自带的jul,common-logging 会通过动态查找的机制,在程序运行时自动找出真正使用的日志库。
当然,common-logging内部有一个Simple logger的简单实现,但是功能很弱。所以使用common-logging,通常都是配合着log4j以及其他日志框架来使用。
使用它的好处就是,代码依赖是common-logging 而非log4j的API,避免了和具体的日志API直接耦合,在有必要时,可以更改日志实现的第三方库。
JCL有两个基本的抽象类:
Log:日志记录器
LogFactory:日志工厂(负责创建Log实例)
导入依赖2.1、入门案例commons-logging commons-logging 1.2 junit junit 4.13.2 test
测试:
@Test
public void test1(){
Log log = LogFactory.getLog(JCLTest.class);
log.info("info 信息");
}
日志信息:
2.2、集成Log4j导入依赖:
log4j log4j 1.2.17
书写配置文件:
#配置根节点logger log4j.rootLogger=日志级别,{自定义名字1,自定义名字2}
log4j.rootLogger=trace,console
#配置.appender输出方式输出到控制台
log4j.appender.console=org.apache.log4j.ConsoleAppender
#配置输出到控制台的格式
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.conversionPattern=[%-6p]%r %c %t %d{yyyy-MM-dd HH:mm:ss:SSS} %m%n
测试:
@Test
public void test2(){
Log log = LogFactory.getLog(JCLTest.class);
log.info("info 信息");
}
日志信息:
3、SLF4J 日志门面 简单日志门面,对应的英文为Simple Logging Facade,是存取日志的标准接口,包括slf4j、log4j、jdk logging api和apache common-log等具体实现。
主要两个功能:日志框架的绑定以及日志框架的桥接
导入依赖:3.1、入门案例junit junit 4.13.2 test org.slf4j slf4j-api 1.7.32 org.slf4j slf4j-simple 1.7.32
测试:
@Test
public void test1(){
Logger logger = LoggerFactory.getLogger(SLF4JTest.class);
logger.trace("trace信息");
logger.debug("debug信息");
logger.info("info信息");
logger.warn("warn信息");
logger.error("error信息");
}
日志信息:
3.2、动态打印日志测试:
// 动态打印日志的实现
@Test
public void test2(){
Logger logger = LoggerFactory.getLogger(SLF4JTest.class);
String name = "yanchi";
int age = 18;
logger.info("姓名:{},年龄:{}",name,age);
}
日志信息:
3.3、打印异常信息测试:
// 打印异常信息
@Test
public void test3(){
Logger logger = LoggerFactory.getLogger(SLF4JTest.class);
try {
Class.forName("aaa");
} catch (Exception e) {
logger.error("异常信息:",e);
}
}
日志信息:
3.4、集成logback依赖:
ch.qos.logback
logback-classic
1.2.6
测试:
@Test
public void test4(){
Logger logger = LoggerFactory.getLogger(SLF4JTest.class);
try {
Class.forName("bbb");
} catch (Exception e) {
logger.error("异常信息(logback版本):",e);
}
}
日志信息:
3.5、集成log4j依赖:
org.slf4j slf4j-log4j12 1.7.32 log4j log4j 1.2.17
书写配置文件:
#配置根节点logger log4j.rootLogger=日志级别,{自定义名字1,自定义名字2}
log4j.rootLogger=trace,console
#配置.appender输出方式输出到控制台
log4j.appender.console=org.apache.log4j.ConsoleAppender
#配置输出到控制台的格式
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.conversionPattern=[%-6p]%r %c %t %d{yyyy-MM-dd HH:mm:ss:SSS} %m%n
测试:
@Test
public void test5(){
Logger logger = LoggerFactory.getLogger(SLF4JTest.class);
try {
Class.forName("ccc");
} catch (Exception e) {
logger.error("异常信息(log4j版本):",e);
}
}
日志信息:
3.6、集成JUL依赖:
org.slf4j slf4j-jdk14 1.7.32
测试:
@Test
public void test6() {
Logger logger = LoggerFactory.getLogger(SLF4JTest.class);
logger.trace("trace 信息");
logger.debug("debug 信息");
logger.info("info 信息");
logger.warn("warn 信息");
logger.error("error 信息");
}
日志信息:
3.7、桥接器的使用注意:桥接器和适配器不能同时导入
本次测试:默认log4j日志切换为logback日志(其余桥接问题大同小异)
依赖:
注释掉默认的log4j,导入log4j桥接依赖
org.slf4j slf4j-api 1.7.32 org.slf4j log4j-over-slf4j 1.7.32 ch.qos.logback logback-classic 1.2.6
测试:
package com.yanchi;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.junit.Test;
public class SLF4JBridge {
@Test
public void test(){
Logger logger = LogManager.getLogger(SLF4JBridge.class);
logger.trace("trace 信息");
logger.debug("debug 信息");
logger.info("info 信息");
logger.warn("warn 信息");
logger.error("error 信息");
}
}
日志信息:
4、logback 日志 4.1、入门案例依赖:
junit junit 4.13.2 test ch.qos.logback logback-classic 1.2.6 org.slf4j slf4j-api 1.7.32
测试:
// 1、入门案例
@Test
public void test1() {
Logger logger = LoggerFactory.getLogger(MyTest.class);
logger.trace("trace 信息");
logger.debug("debug 信息");
logger.info("info 信息");
logger.warn("warn 信息");
logger.error("error 信息");
}
日志信息:
4.2、配置入门配置文件配置:logback.xml(需要放在resources文件夹下)
System.err ${pattern}
测试:
// 2、配置案例
@Test
public void test2() {
Logger logger = LoggerFactory.getLogger(LogbackTest.class);
logger.trace("trace 信息");
logger.debug("debug 信息");
logger.info("info 信息");
logger.warn("warn 信息");
logger.error("error 信息");
}
日志信息:
4.3、日志文件输出配置文件:
${logDir}/logback.log ${pattern} System.err ${pattern}
测试:
// 3、日志文件输出
@Test
public void test3() {
Logger logger = LoggerFactory.getLogger(LogbackTest.class);
logger.trace("trace 信息");
logger.debug("debug 信息");
logger.info("info 信息");
logger.warn("warn 信息");
logger.error("error 信息");
}
日志信息:
4.4、日志拆分配置可拆分归档的文件
配置文件:
${logDir}/logback.log ${pattern} ${logDir}/roll_logback.log ${pattern} ${logDir}/roll.%d{yyyy-MM-dd}.log%i.gz 1kb System.err ${pattern}
测试:
// 4、配置可拆分归档的文件
@Test
public void test4() {
Logger logger = LoggerFactory.getLogger(LogbackTest.class);
for (int i = 0; i < 10; i++) {
logger.trace("trace 信息");
logger.debug("debug 信息");
logger.info("info 信息");
logger.warn("warn 信息");
logger.error("error 信息");
}
}
日志信息:
4.4、异步日志配置信息:
System.err
${pattern}
测试:
// 5、异步日志
@Test
public void test5() {
Logger logger = LoggerFactory.getLogger(LogbackTest.class);
for (int i = 0; i < 50; i++) {
logger.trace("trace 信息");
logger.debug("debug 信息");
logger.info("info 信息");
logger.warn("warn 信息");
logger.error("error 信息");
}
System.out.println("1--------------------");
System.out.println("2--------------------");
System.out.println("3--------------------");
System.out.println("4--------------------");
System.out.println("5--------------------");
}
日志信息:
5、log4j2日志默认:error级别打印日志
5.1、入门案例依赖:
org.apache.logging.log4j log4j-api 2.14.1 org.apache.logging.log4j log4j-core 2.14.1 junit junit 4.13.2 test
测试:
// 1、使用默认的日志(控制台日志,无需配置文件)
@Test
public void test1() {
Logger logger = LogManager.getLogger(Log4j2Test.class);
logger.trace("trace 信息");
logger.debug("debug 信息");
logger.info("info 信息");
logger.warn("warn 信息");
logger.error("error 信息");
logger.fatal("fatal 信息");
}
日志信息:
5.2、配置入门配置文件配置:log4j2.xml(需要放在resources文件夹下)
测试:
// 2、使用配置文件的日志
@Test
public void test2() {
Logger logger = LogManager.getLogger(Log4j2Test.class);
logger.trace("trace 信息");
logger.debug("debug 信息");
logger.info("info 信息");
logger.warn("warn 信息");
logger.error("error 信息");
logger.fatal("fatal 信息");
}
日志信息:
5.3、集成 slf4j 日志门面依赖:
org.slf4j slf4j-api 1.7.32 org.apache.logging.log4j log4j-slf4j-impl 2.14.1 org.apache.logging.log4j log4j-api 2.14.1 org.apache.logging.log4j log4j-core 2.14.1 junit junit 4.13.2 test
测试:
package com.yanchi;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Slf4jToLog4j2 {
// 集成 slf4j 日志门面
@Test
public void test3(){
Logger logger = LoggerFactory.getLogger(Slf4jToLog4j2.class);
logger.trace("trace 信息");
logger.debug("debug 信息");
logger.info("info 信息");
logger.warn("warn 信息");
logger.error("error 信息");
}
}
日志信息:
配置文件:
D://test
测试:
// 4、日志文件输出
@Test
public void test4(){
Logger logger = LoggerFactory.getLogger(Slf4jToLog4j2.class);
logger.trace("trace 信息");
logger.debug("debug 信息");
logger.info("info 信息");
logger.warn("warn 信息");
logger.error("error 信息");
}
日志信息:
5.5、日志拆分配置文件:
D://test
测试:
// 5、日志拆分
@Test
public void test5(){
Logger logger = LoggerFactory.getLogger(Slf4jToLog4j2.class);
for (int i = 0; i < 2000; i++) {
logger.trace("trace 信息");
logger.debug("debug 信息");
logger.info("info 信息");
logger.warn("warn 信息");
logger.error("error 信息");
}
}
日志信息:
5.6、*异步日志 5.6.1、使用AsyncAppender方式(不是很推荐)添加依赖:
com.lmax disruptor 3.4.4
配置文件:
D://test
测试:
// 6.1、异步日志
@Test
public void test6_1(){
Logger logger = LoggerFactory.getLogger(Slf4jToLog4j2.class);
// 日志部分
for (int i = 0; i < 50; i++) {
logger.trace("trace 信息");
logger.debug("debug 信息");
logger.info("info 信息");
logger.warn("warn 信息");
logger.error("error 信息");
}
// 业务逻辑部分
for (int i = 0; i < 10; i++) {
System.out.println("----------------------------------------");
}
}
日志信息:
5.6.2、使用AsyncLogger的方式(推荐) 5.6.2.1、全局异步所有的日志都是异步的日志记录
需要在类路径resources下添加一个properties属性配置文件
文件名要求是:log4j2.component.properties
Log4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
配置文件:
D://test
测试:
// 6.2.1、全局异步
@Test
public void test6_2_1(){
Logger logger = LoggerFactory.getLogger(Slf4jToLog4j2.class);
// 日志部分
for (int i = 0; i < 50; i++) {
logger.trace("trace 信息");
logger.debug("debug 信息");
logger.info("info 信息");
logger.warn("warn 信息");
logger.error("error 信息");
}
// 业务逻辑部分
for (int i = 0; i < 10; i++) {
System.out.println("----------------------------------------");
}
}
日志信息:
5.6.2.2、混合异步可以在应用中同时使用同步日志和异步日志,更加灵活
注意:需要把全局异步注释掉
配置文件:
D://test
测试1:
// 6.2.2、混合异步(com.yanchi)
@Test
public void test6_2_2(){
Logger logger = LoggerFactory.getLogger(Slf4jToLog4j2.class);
// 日志部分
for (int i = 0; i < 50; i++) {
logger.trace("trace 信息");
logger.debug("debug 信息");
logger.info("info 信息");
logger.warn("warn 信息");
logger.error("error 信息");
}
// 业务逻辑部分
for (int i = 0; i < 10; i++) {
System.out.println("----------------------------------------");
}
}
日志信息1:(异步)
测试2:
// 6.2.3、混合异步(org.slf4j)
@Test
public void test6_2_3(){
Logger logger = LoggerFactory.getLogger(Logger.class);
// 日志部分
for (int i = 0; i < 50; i++) {
logger.trace("trace 信息");
logger.debug("debug 信息");
logger.info("info 信息");
logger.warn("warn 信息");
logger.error("error 信息");
}
// 业务逻辑部分
for (int i = 0; i < 10; i++) {
System.out.println("----------------------------------------");
}
}
日志信息:(同步)
6、SpringBoot日志实现默认集成:slf4j+logback
6.1、入门案例测试:
package com.yanchi;
import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class SpringbootLogStudyApplicationTests {
// 1、使用默认的日志(控制台日志,无需配置文件)
@Test
public void test1() {
Logger logger = LoggerFactory.getLogger(SpringbootLogStudyApplicationTests.class);
logger.trace("trace 信息");
logger.debug("debug 信息");
logger.info("info 信息");
logger.warn("warn 信息");
logger.error("error 信息");
}
}
日志信息:
6.2、使用log4j日志实现测试:
package com.yanchi;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class SpringbootLogStudyApplicationTest2 {
// 2、使用log4j2日志实现(观察桥接器是否可用)
@Test
public void test2() {
Logger logger = LogManager.getLogger(SpringbootLogStudyApplicationTest2.class);
logger.trace("trace 信息");
logger.debug("debug 信息");
logger.info("info 信息");
logger.warn("warn 信息");
logger.error("error 信息");
logger.fatal("fatal 信息");
}
}
日志信息:
6.3、配置文件输出控制台配置文件:(application.properties)
logging.level.com.yanchi=trace
logging.pattern.console=%d{yyyy-MM-dd} [%level] -%m%n
测试:
package com.yanchi;
import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class SpringbootLogStudyApplicationTest3 {
// 3、使用配置文件实现
@Test
public void test3() {
Logger logger = LoggerFactory.getLogger(SpringbootLogStudyApplicationTests.class);
logger.trace("trace 信息");
logger.debug("debug 信息");
logger.info("info 信息");
logger.warn("warn 信息");
logger.error("error 信息");
}
}
日志信息:
6.4、配置文件输出文件配置文件:
logging.level.com.yanchi=trace
logging.pattern.console=%d{yyyy-MM-dd} [%level] -%m%n
# 6.4、配置文件输出文件(路径)
logging.file.path=D:/test
测试:
package com.yanchi;
import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class SpringbootLogStudyApplicationTest4 {
// 4、使用配置输出到文件
@Test
public void test4() {
Logger logger = LoggerFactory.getLogger(SpringbootLogStudyApplicationTests.class);
logger.trace("trace 信息");
logger.debug("debug 信息");
logger.info("info 信息");
logger.warn("warn 信息");
logger.error("error 信息");
}
}
日志信息:
6.5、日志拆分高级功能需要使用日志相应的配置文件
把之前配置的logback.xml引入进行配置使用
logback.xml:
${logDir}/logback.log ${pattern} ${logDir}/roll_logback.log ${pattern} ${logDir}/roll.%d{yyyy-MM-dd}.log%i.gz 1kb System.out ${pattern}
测试:
package com.yanchi;
import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class SpringbootLogStudyApplicationTest5 {
// 5、使用logback.xml配置日志拆分
@Test
public void test5() {
Logger logger = LoggerFactory.getLogger(SpringbootLogStudyApplicationTests.class);
for (int i = 0; i < 1000; i++) {
logger.trace("trace 信息");
logger.debug("debug 信息");
logger.info("info 信息");
logger.warn("warn 信息");
logger.error("error 信息");
}
}
}
日志信息:
6.6、集成log4j2排出logback日志依赖:
org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-logging org.springframework.boot spring-boot-starter-log4j2
导入log4j2配置文件:
D://test
测试:
package com.yanchi;
import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class SpringbootLogStudyApplicationTest6 {
// 6、使用log4j2.xml配置进行日志打印
@Test
public void test6() {
Logger logger = LoggerFactory.getLogger(SpringbootLogStudyApplicationTests.class);
logger.trace("trace 信息");
logger.debug("debug 信息");
logger.info("info 信息");
logger.warn("warn 信息");
logger.error("error 信息");
}
}
日志信息:
package com.yanchi;
import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class SpringbootLogStudyApplicationTest6 {
// 5、使用log4j2.xml配置进行日志打印
@Test
public void test5() {
Logger logger = LoggerFactory.getLogger(SpringbootLogStudyApplicationTests.class);
logger.trace("trace 信息");
logger.debug("debug 信息");
logger.info("info 信息");
logger.warn("warn 信息");
logger.error("error 信息");
}
}
日志信息:
6.7、使用注解简化操作导入依赖:
org.projectlombok lombok true
测试:
package com.yanchi;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
@Slf4j
class SpringbootLogStudyApplicationTest7 {
// 7、使用注解简化操作
@Test
public void test7() {
log.trace("trace 信息");
log.debug("debug 信息");
log.info("info 信息");
log.warn("warn 信息");
log.error("error 信息");
}
}
日志信息:



