Java日志体系(六)log4j2

1.1 简介

            

log4j2,一个日志的实现框架,是log4j的升级版本,于2014年7月正式亮相。与第一代log4j不同,log4j2完全重写了log4j的日志实现,并不是在原有基础上进行的升级,解决了log4j中的一些问题,例如:多线程下性能低下、api不支持占位符{}的使用、配置文件不能自动重新加载等。

为什么说log4j在多线程情况下性能低下呢?主要是synchronized锁在作怪,当我们的log4jzai 获取appender对象时,需要进行加锁处理;而接下来对appender操作(将要进行日志打印)时,也进行了加锁处理,这样一来性能自然得不到提升,从而导致整个应用的qps下降。

而在log4j2中,由于引入了异步logger,使得log4j2的性能得到了巨大的提升,相比于log4j,logback而言,提升了数10倍之多。关于异步logger的情况,我们后面进行讲解。

1.2 log4j2结构

                

LoggerContext:Logger上下文,主要负责读取log4j2的配置以及获取Logger对象的工作;

Logger:日志对象,负责日志信息的打印;跟之前的几个日志框架相同,log4j2也包含了5大日志级别,分别为TRACE,DEBUG,INFO,WARN,ERROR 以及FATAL;具体等级如下:TRACE < DEBUG < INFO < WARN < ERROR < FATAL;

LoggerConfig:Logger的配置对象,每一个Logger的配置信息就是一个LoggerConfig对象;

Configuration:log4j2配置文件的解析,当我们的配置文件是xml的格式时,具体的实现是XmlConfiguration;每一个LoggerContext都有一个Configuration对象,包含了所有的Appender、Filter、LoggerConfig

1.3 使用

首先,需要在应用的pom.xml中添加依赖:

1<dependency> 2 <groupId>org.apache.logging.log4j</groupId> 3 <artifactId>log4j-api</artifactId> 4 <version>2.8.2</version> 5 </dependency> 6 <dependency> 7 <groupId>org.apache.logging.log4j</groupId> 8 <artifactId>log4j-core</artifactId> 9 <version>2.8.2</version> 10 </dependency>

其次,声明测试代码:

1public class log4j2Demo { 2 3 private Logger logger = LogManager.getLogger(log4j2Demo.class); 4 5 @Test 6 public void test() throws InterruptedException { 7 logger.error("Error Message!"); 8 logger.warn("Warn Message!"); 9 logger.info("Info Message!"); 10 logger.debug("Debug Message!"); 11 logger.trace("Trace Message!"); 12 } 13}

最后,在classpath下声明配置文件:log4j2.xml:

1<?xml version="1.0" encoding="UTF-8"?> 2<Configuration status="info" monitorInterval="30"> 3 <Appenders> 4 <!--控制台--> 5 <Console name="Console" target="SYSTEM_OUT">--> 6 <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> 7 </Console> 8 9 <!--普通文件:--> 10 <File name="File" fileName="e:/log.out" append="true" immediateFlush="true" > 11 <PatternLayout> 12 <Pattern>%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %L- %msg%n</Pattern> 13 </PatternLayout> 14 </File> 15 </Appenders> 16 <Loggers> 17 <Root level="debug" > 18 <AppenderRef ref="File"/> 19 <AppenderRef ref="Console"/> 20 </Root> 21 </Loggers> 22</Configuration>

通过以上步骤,log4j2就可以正常的运行了。

1.4 log4j2配置文件详解

与log4j不同的是,log4j2只支持.xml或者.json格式的配置文件,不在支持.properties格式的配置文件。那么,下面我们就以.xml来进行讲解:

默认情况下,系统会在classpath下查找配置文件:(按照以下顺序)

11.classpath下名为 log4j-test.json 或者log4j-test.jsn文件 22.classpath下名为 log4j2-test.xml 33.classpath下名为 log4j.json 或者log4j.jsn文件 44.classpath下名为 log4j2.xml

请注意,此处我们常用的是log4j2.xml,这块与log4j不同;

以下是log4j2常用的配置信息:(逐一进行讲解)

1<?xml version="1.0" encoding="UTF-8"?> 2<Configuration status="info" monitorInterval="30"> 3 <Appenders> 4 5 <!--控制台--> 6 <Console name="Console" target="SYSTEM_OUT"> 7 <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> 8 </Console> 9 10 <!--普通文件:--> 11 <File name="File" fileName="e:/log.out" append="true" immediateFlush="false" bufferedIO="true" bufferSize="1024"> 12 <PatternLayout> 13 <Pattern>%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %L- %msg%n</Pattern> 14 </PatternLayout> 15 </File> 16 17 <!--异步appender:--> 18 <Async name="Async"> 19 <AppenderRef ref="File"/> 20 </Async> 21 22 <!--循环写入文件:--> 23 <RollingFile name="RollingFile" fileName="e:/log.out" filePattern="e:/app-%d{yyyy-MM-dd_HH-mm}-%i.out"> 24 <PatternLayout> 25 <Pattern>%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n</Pattern> 26 </PatternLayout> 27 <!--滚动策略:--> 28 <Policies> 29 <TimeBasedTriggeringPolicy interval="1" modulate="true"/> 30 <SizeBasedTriggeringPolicy size="100 kb"/> 31 </Policies> 32 <DefaultRolloverStrategy max="5"/> 33 </RollingFile> 34 35 </Appenders> 36 37 <Loggers> 38 39 <!--单独指定logger--> 40 <Logger name="com.jiaboyan.logDemo.log4j2Demo" level="info" additivity="false" includeLocation="true"> 41 <AppenderRef ref="File"/> 42 </Logger> 43 44 <!--根logger--> 45 <Root level="info" > 46 <AppenderRef ref="Async"/> 47 <AppenderRef ref="File"/> 48 <AppenderRef ref="Console"/> 49 </Root> 50 51 <!--异步logger--> 52 <AsyncRoot level="info"> 53 <AppenderRef ref="File"/> 54 </AsyncRoot> 55 </Loggers> 56 57</Configuration>

1.Configuration -- 根节点

1<Configuration status="debug" monitorInterval="30"></Configuration> 2 Configuration:表示log4j2中的Configuration对象,实际为XmlConfiguration; 3 4 status:表示log4j2本身的日志信息打印级别,当设置为TRACE 或者 DEBUG 级别时,便会打印出log4j2内部初始化的一些日志信息; 5 6 monitorInterval:表示每隔一定时间重新加载log4j2配置文件,单位秒;

2.Appenders -- Console

1<Console name="Console" target="SYSTEM_OUT"> 2 <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> 3</Console> 4 5name:表示控制台Appender的名称,<logger>中会依赖此名称,起名没有具体要求,但最好简明直译; 6 7target:表示ConsoleAppender使用哪种方式将日志输出到控制台,一般调用System.out.println()方法; 8 9PatternLayout--pattern:表示日志信息输出的格式;

3.Appenders -- File

1<File name="File" fileName="e:/log.out" append="true" immediateFlush="false" bufferedIO="true" bufferSize="8096"> 2 <PatternLayout> 3 <Pattern>%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %L- %msg%n</Pattern> 4 </PatternLayout> 5</File> 6 7name:表示文件Appender的名称,<logger>中会依赖此名称,起名没有具体要求,但最好简明直译; 8 9fileName:表示生成的日志文件名称; 10 11append:表示新生成的日志是否追加到日志文件中,如果为true则表示追加,false表示覆盖原有日志信息; 12 13immediateFlush:表示日志打印请求是否立即输出,true为立即,false表示使用缓存; 14 15bufferedIO:表示日志打印请求是否使用缓存,true为使用,false为不使用; 16 17bufferSize:表示日志打印请求的使用缓存的大小,默认为8096字节; 18 19PatternLayout--pattern:同上;

4.Appenders -- RollingFile

1<RollingFile name="RollingFile" fileName="e:/log.out" filePattern="e:/app-%d{yyyy-MM-dd_HH-mm}-%i.out"> 2 <PatternLayout> 3 <Pattern>%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n</Pattern> 4 </PatternLayout> 5 <Policies> 6 <TimeBasedTriggeringPolicy interval="1" modulate="true"/> 7 <CronTriggeringPolicy schedule="0 0 * * * ?"/> 8 <SizeBasedTriggeringPolicy size="100 kb"/> 9 </Policies> 10 <DefaultRolloverStrategy max="5"/> 11</RollingFile> 12 13name:表示滚动文件Appender的名称,<logger>中会依赖此名称,起名没有具体要求,但最好简明直译; 14 15fileName:表示当前日志所在的日志文件名称; 16 17filePattern:表示滚动日志的文件名称模板,当日志文件进行滚动后,滚动后的文件按照此模板进行命名; 18 19PatternLayout--pattern:同上; 20 21Policies:表示日志文件滚动策略; 22 23Policies -- TimeBasedTriggeringPolicy:表示日志文件按照时间间隔来进行滚动; 24 25Policies -- CronTriggeringPolicy:表示日志文件按照设置的时间点来进行滚动; 26 27Policies -- SizeBasedTriggeringPolicy:表示日志文件按照文件大小来进行滚动; 28 29DefaultRolloverStrategy:表示log4j2进行滚动后保存的日志文件数量,默认为7个;

5.TimeBasedTriggeringPolicy

1<TimeBasedTriggeringPolicy interval="1" modulate="true"/> 2 3TimeBasedTriggeringPolicy表示按照时间间隔来进行日志文件的滚动,间隔单位可以是分钟、小时,具体需要根据filePattern的格式来进行判别; 4例如filePattern="e:/app-%d{yyyy-MM-dd_HH-mm}-%i.out",则表示mm(分钟)为单位; 5 6interval:表示分隔日志的时间间隔大小,如果时间间隔单位是分钟,则表示相隔1分钟、10分钟等进行一次日志分隔; 7 8modulate:表示是否对分隔时间进行调制;如果设置为true则表示分隔的时间从每天的0点、每小时的0分钟开始进行计算,每间隔多久进行一次切割;比如,modulate=true,interval=4hours,那么假设上次封存日志的时间为03:00,则下次封存日志的时间为04:00,之后的封存时间依次为08:0012:0016:00。。。

6.CronTriggeringPolicy

1<CronTriggeringPolicy schedule="0 0 * * * ?"/> 2 3CronTriggeringPolicy表示按照Cron表达式设置的时间点进行切割日志; 4 5schedule:表示设置的cron表达式;

7.SizeBasedTriggeringPolicy

1<SizeBasedTriggeringPolicy size="100 kb"/> 2 3SizeBasedTriggeringPolicy表示按照规定的日志文件大小进行切割日志; 4 5size:表示进行切割日志文件大小的极值,当日志文件大小满足size的值时,就会进行日志的切割;

    DefaultRolloverStrategy

1<DefaultRolloverStrategy max="5"/> 2 3DefaultRolloverStrategy表示log4j2每单位时间内最多能保存多少个日志切割文件,一般与SizeBasedTriggeringPolicy结合使用; 4 5max:表示保存的最大值,默认为76 7例如:你的log4j2.xml设置如下:fileName="e:/log.out" filePattern="e:/app-%d{yyyy-MM-dd_HH-mm}-%i.out" 8那么在每分钟内,你可以保留2个日志切割文件,多余的日志进行覆盖;

8.Appenders -- Async

1<Async name="Async"> 2 <AppenderRef ref="File"/> 3</Async> 4 5name:表示异步Appender的名称,<logger>中会依赖此名称,起名没有具体要求,但最好简明直译; 6异步Appender使用消费者生产者模式进行日志信息的打印,适用于并发量较大的情况;

9.PatternLayout

1<PatternLayout> 2 <Pattern>%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n</Pattern> 3</PatternLayout> 4 5Pattern:设置输出的日志信息格式;具体格式如下: 6 7%d{yyyy-MM-dd HH:mm:ss, SSS} : 日志生产时间 8%t : 线程名称 9%p : 日志级别 10%level : 日志级别 11%c : logger的名称 12%logger : logger的名称 13%C : Java类名 14%m : 日志内容 15%n : 换行符 16%L : 日志输出所在行数 17%M : 日志输出所在方法名

10.Loggers -- Logger

1<Logger name="com.jiaboyan.logDemo.log4j2Demo" level="info" additivity="false"> 2 <AppenderRef ref="File"/> 3</Logger> 4 5<Loggers>节点下,对某个类单独进行日志配置,便可使用<logger>节点; 6上例中,我们对名称为com.jiaboyan.logDemo.log4j2Demo的类进行日志配置。 7level指定级别,additivity表示是否向上传递打印日志信息(若为true则向上传递,那么root根对象也会进行日志打印);

11.Loggers -- Root

1<Root level="info" > 2 <AppenderRef ref="Async"/> 3 <AppenderRef ref="File"/> 4 <AppenderRef ref="Console"/> 5</Root> 6 7Root根日志节点,指定具体的日志级别,以及使用何种Appender进行日志输出;

12.Loggers -- AsyncRoot

1<AsyncRoot level="info" includeLocation="false"> 2 <AppenderRef ref="File"/> 3</AsyncRoot> 4 5如果想使用异步logger,还需要在pom.xml中添加disruptor的依赖。 6includeLocation结合异步logger使用,当其设置为true时,才会显示具体的行号,以及日志所在的类名; 7如果设置为false,哪怕<Pattern>设置了输出行号也不会显示出来;

参考:https://www.jianshu.com/p/474eaecac699

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )