新建一个springboot 工程,查看依赖树
通过查看依赖树可以发现,springboot自带被loggong管理的log4j 、logback等日志相关的依赖。为了不影响测试结果,手动排除掉龙宫依赖
2、spring集成log4j2org.springframework.boot spring-boot-starter org.springframework.boot spring-boot-starter-logging
springboot集成log4j2 与spring集成的步骤一样,
先排除掉springboot自带的日志依赖,然后引入log42依赖
org.springframework.boot
spring-boot-starter-log4j2
日志配置可以通过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示例
案例
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() {
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() {
org.apache.logging.log4j.Logger logger = LogManager.getLogger(SpringbootlogApplicationTests.class);
logger.info("info信息");
}
@Test
public void test03() {
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() {
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() {
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,console3.4 appenders 输出控制器
定义日志输出到不同的地方, 常用Appenders:
ConsoleAppender 将日志输出到控制台 FileAppender 将日志输出到文件中 DailyRollingFileAppender 将日志输出到一个日志文件,并且每天输出到一个新的文件 RollingFileAppender 将日志信息输出到一个日志文件,并且指定文件的尺寸,当文件大小达到指定尺寸时,会自动把文件改名,同时产生一个新的文件 JDBCAppender 把日志信息保存到数据库中
appender的命名方式 : 前缀(log4j.appender)+名字 : log4j.appender.name1
#配置appender输出方式 输出到控制台 console是名字,等号右面是配置appender的类型 log4j.appender.console=org.apache.log4j.ConsoleAppender3.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依赖
3.7 使用log4jlog4j log4j 1.2.17
配置文件放在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;
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 的组件基保持一致。
org.apache.logging.log4j
log4j-api
2.12.1
org.apache.logging.log4j
log4j-core
2.12.1
4.3 log4j2 的使用
package com.li;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
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 FilesJavajdk1.8.0_45binjava.exe" -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:C:Program FilesJetBrainsIntelliJ IDEA 2019.3.5libidea_rt.jar=57169:C:Program FilesJetBrainsIntelliJ IDEA 2019.3.5bin" -Dfile.encoding=UTF-8 -classpath "C:Program FilesJetBrainsIntelliJ IDEA 2019.3.5libidea_rt.jar;C:Program FilesJetBrainsIntelliJ IDEA 2019.3.5pluginsjunitlibjunit5-rt.jar;C:Program FilesJetBrainsIntelliJ IDEA 2019.3.5pluginsjunitlibjunit-rt.jar;C:Program FilesJavajdk1.8.0_45jrelibcharsets.jar;C:Program FilesJavajdk1.8.0_45jrelibdeploy.jar;C:Program FilesJavajdk1.8.0_45jrelibextaccess-bridge-64.jar;C:Program FilesJavajdk1.8.0_45jrelibextcldrdata.jar;C:Program FilesJavajdk1.8.0_45jrelibextdnsns.jar;C:Program FilesJavajdk1.8.0_45jrelibextjaccess.jar;C:Program FilesJavajdk1.8.0_45jrelibextjfxrt.jar;C:Program FilesJavajdk1.8.0_45jrelibextlocaledata.jar;C:Program FilesJavajdk1.8.0_45jrelibextnashorn.jar;C:Program FilesJavajdk1.8.0_45jrelibextsunec.jar;C:Program FilesJavajdk1.8.0_45jrelibextsunjce_provider.jar;C:Program FilesJavajdk1.8.0_45jrelibextsunmscapi.jar;C:Program FilesJavajdk1.8.0_45jrelibextsunpkcs11.jar;C:Program FilesJavajdk1.8.0_45jrelibextzipfs.jar;C:Program FilesJavajdk1.8.0_45jrelibjavaws.jar;C:Program FilesJavajdk1.8.0_45jrelibjce.jar;C:Program FilesJavajdk1.8.0_45jrelibjfr.jar;C:Program FilesJavajdk1.8.0_45jrelibjfxswt.jar;C:Program FilesJavajdk1.8.0_45jrelibjsse.jar;C:Program FilesJavajdk1.8.0_45jrelibmanagement-agent.jar;C:Program FilesJavajdk1.8.0_45jrelibplugin.jar;C:Program FilesJavajdk1.8.0_45jrelibresources.jar;C:Program FilesJavajdk1.8.0_45jrelibrt.jar;D:idea2019workceshilogtargetclasses;E:MAVEN2localRepojunitjunit4.12junit-4.12.jar;E:MAVEN2localRepoorghamcresthamcrest-core1.3hamcrest-core-1.3.jar;E:MAVEN2localRepoorgapachelogginglog4jlog4j-api2.12.1log4j-api-2.12.1.jar;E:MAVEN2localRepoorgapachelogginglog4jlog4j-core2.12.1log4j-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 04.3 log4j2 配置文件
log4j2 也支持多种配置文件,但一般使用xml作为配置文件。
在 resource目录下创建 log4j2.xml 文件作为配置文件,spring项目会自动加载。
xml中有许多标签,
:写输出的方式
:日志记录器
标签的使用流程大致为 定义appender,在logger中引用appender
4.4 log4j2集成日志门面slf4j
调用原理: slf4j门面会调用log4j2的门面,然后再有log4j2门面调用log4j2的日志实现
slf4j-api -> log4j-api ->log4j-core
导入步骤
1.导入slf4j的日志门
org.slf4j
slf4j-api
2.0.0-alpha1
2.导入log4j2的适配器
适配器版本貌似要与log4j2版本保持一致,不然会报错(未严格测试)
org.apache.logging.log4j
log4j-slf4j-impl
2.12.1
3.导入log4j2的日志门面
org.apache.logging.log4j
log4j-api
2.12.1
4.导入log4j2的日志实现
org.apache.logging.log4j
log4j-core
2.12.1
由于地层使用的log4j2的日志实现,所以依然需要提供log4j2.xml 配置文件
package com.li;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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文件
com.lmax
disruptor
3.3.7
properties文件
在resource目录下新建一个
log4j2.component.properties 文件
Log4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
5 、logback的xml配置示例D://test
在resource目录下创建logback.xml 文件
该文章参考动力节点在b站上的视频${logDir}/logback.log ${pattern} System.err ${pattern} ${logDir}/logback.html ${pattern1} ${pattern} ${logDir}/roll_logback.log ${logDir}/roll.%d{yyyy-MM-dd}.log%i.gz 1KB System.err ${pattern} ERROR ACCEPT DENY
传送门 https://www.bilibili.com/video/BV1Mb4y1Z74W?p=100&spm_id_from=pageDriver



