Java-121-log4j2-1-认识log4j2之Appender

简介: 认识下log4j2!

认识下log4j2!

log4j2中有哪些东西呢?

基本的xml结构如下:

<?xmlversion="1.0"encoding="UTF-8"?>;
<Configuration><!--自定义属性--><Properties><Propertyname="自定义属性键">自定义属性值</property>    ...
</Properties><!--定义日志输出到哪和怎么输出--><Appenders><Appendertype="type"name="name"><Filtertype="type" ... /></Appender>    ...
</Appenders><!--日志处理器用这个的实例去关联业务日志--><Loggers><Rootlevel="level"><AppenderRefref="name"/></Root><Loggername="name1"><Filtertype="type" ... /></Logger>    ...
</Loggers></Configuration>

第一行首先是标识这是一个xml文件

<?xmlversion="1.0"encoding="UTF-8"?>

接下来是一个<Configuration>标签,有两个属性:

status是指定log4j本身的打印日志的级别。

设置为debug可以在控制台中看到Log4j2启动和加载配置文件时的打印信息。

monitorInterval是用来设置配置文件的动态加载时间的,单位是秒。

monitorInterval="30"表示每30秒配置文件会动态加载一次。在程序运行过程中,如果修改配置文件,程序会随之改变。

<configurationstatus="debug"monitorInterval="30">  ...
</Configuration>

所有的配置都在<Configuration>标签里:

Appender:日志输出目的

负责日志的输出配置,比如可以配置输出到控制台、文件等等。也可以在这里面使用Layout去对对输出的日志进行格式化。还可以配置过滤掉一些日志等等,详见后面的配置。

Logger:日志记录器

负责收集处理日志记录,处理日志开关。


注意:

   一个Logger可以对应多个appender,一个appender里只能对应一个layout来配置输出的格式。

   Logger+Appender+Layout三个组件就定义出了我们的日志输出规则,通俗点就是Logger实例将Layout格式的日志输出到Appender规定的地方!

下面来详细看下这三大组件!

一、Appender(输出源)

   Appenders是输出源,用于定义日志输出的地方。

常见的有:

Console:将日志打印到控制台上。

File:将日志打印到文件。

RollingFile:同样是打印到文件,不过会根据策略覆盖旧文件。

JDBC:日志打到数据库

JMS

Async:异步输出

RandomAccessFile:类似File,只不过是字节,不是流。

RollingRandomAccessFile:滚动生成文件。

下面详细看看这些输出源:


Console:将日志打印到控制台上,开发必备

属性:

name:指定Appender的名字。target:SYSTEM_OUTSYSTEM_ERR,一般只设置默认:SYSTEM_OUT。PatternLayout:输出格式,不设置默认为:%m%n。

2.File:文件输出源。用于将日志写入到指定的文件,比如D:/logs/my.log。底层是一个OutputStreamAppender。

   属性:

name:File的属性,指定Appender的名字.
fileName:File的属性,指定输出日志的目的文件带全路径的文件名.
PatternLayout:File的子节点,输出格式,不设置默认为:%m%n.

3.RollingFile:同样是打印到文件,超过指定大小自动删除旧的创建新的的

   属性:

name:RollingFilede的属性,指定Appender的名字.
fileName:RollingFilede的属性,指定输出日志的目的文件带全路径的文件名.
filePattern:RollingFilede的属性,指定新建日志文件的名称格式.
<!--info级别日志文件输出--><RollingFilename="info_appender"fileName="${log_root}/info.log"filePattern="${log_root}/info_%i.log.%d{yyyy-MM-dd}"><!--DefaultRolloverStrategy:RollingFilede的子节点,用来指定同一个文件夹下最多有几个日志文件时开始删除最旧的,创建新的(通过max属性)--><!--过滤器Filters:RollingFilede的子节点,决定日志事件能否被输出。过滤条件有三个值:ACCEPT(接受), DENY(拒绝) orNEUTRAL(中立)
ACCEP和DENY比较好理解就是接受和拒绝的意思,在使用单个过滤器的时候,一般就是使用这两个值。但是在组合过滤器中,如果用接受ACCEPT的话,日志信息就会直接写入日志文件,后续的过滤器不再进行过滤。所以,在组合过滤器中,接受使用NEUTRAL(中立),被第一个过滤器接受的日志信息,会继续用后面的过滤器进行过滤,只有符合所有过滤器条件的日志信息,才会被最终写入日志文件。--><Filters><!--限制日志级别在info及以上在error以下ThresholdFilter:Filters的子节点level:ThresholdFilterde的属性,将被过滤的级别。onMatch:ThresholdFilterde的属性,默认值是NEUTRALonMismatch:ThresholdFilterde的属性,默认是DENY--><ThresholdFilterlevel="info"/><ThresholdFilterlevel="error"onMatch="DENY"onMismatch="NEUTRAL"/></Filters><!--日志格式输出格式,不设置默认为:%m%n.--><PatternLayoutpattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/><!--策略Policies:RollingFilede的子节点,指定滚动日志的策略,就是什么时候进行新建日志文件输出日志.--><Policies><!--每隔一天转存TimeBasedTriggeringPolicy:Policies子节点,基于时间的滚动策略,interval属性用来指定多久滚动一次,默认是1hour。modulate=true用来调整时间:比如现在是早上3am,interval是4,那么第一次滚动是在4am,接着是8am,12am...而不是7am.--><TimeBasedTriggeringPolicyinterval="1"modulate="true"/><!--文件大小SizeBasedTriggeringPolicy:Policies子节点,基于指定文件大小的滚动策略,size属性用来定义每个日志文件的大小.--><SizeBasedTriggeringPolicysize="100 MB"/></Policies></RollingFile>


4.Async:异步输出。接受对其他Appender的引用,并使LogEvents在单独的Thread上写入它们。

默认情况下,Async使用 java.util.concurrent.ArrayBlockingQueue ,它不需要任何外部库。

请注意,多线程应用程序在使用此appender时应小心:阻塞队列容易受到锁争用的影响,当更多线程同时记录时性能可能会变差。考虑使用无锁异步记录器以获得最佳性能。

5.RandomAccessFile类似于标准的 File。内部它使用 ByteBuffer + RandomAccessFile 而不是 BufferedOutputStream。与File相比,性能提升了20-200% 。


6.RollingRandomAccessFile同RollingFile。

写入fileName参数中指定的文件,并根据TriggeringPolicy和RolloverPolicy滚动文件。

不同的是比File更加强大,可以指定当文件达到一定大小(如20MB)时,另起一个文件继续写入日志,另起一个文件就涉及到新文件的名字命名规则,因此需要配置文件命名规则。避免一直往一个文件中写。

name:指定Appender的名字。fileName指定当前日志文件的位置和文件名称filePattern指定当发生Rolling时,文件的转移和重命名规则immediateFlush设置为true时-默认值,每次写入后都会进行刷新。这将保证数据写入磁盘,但可能会影响性能。bufferSize缓冲区大小,默认为262,144字节(256*1024)。Policies:指定滚动日志的策略,就是什么时候进行新建日志文件输出日志。SizeBasedTriggeringPolicy指定当文件大小大于size指定的值时,触发RollingTimeBasedTriggeringPolicy这个配置需要和filePattern结合使用,日期格式精确到哪一位,interval也精确到哪一个单位。注意filePattern中配置的文件重命名规则是${FILE_NAME}-%d{yyyy-MM-ddHH-mm-ss}-%i,最小的时间粒度是ss,即秒钟。TimeBasedTriggeringPolicy默认的size是1,结合起来就是每1秒钟生成一个新文件。如果改成%d{yyyy-MM-ddHH},最小粒度为小时,则每一个小时生成一个文件DefaultRolloverStrategy指定最多保存的文件个数


总结:

   做日志分割的话,肯定是RollingRandomAccessFile最合适。实战就用它!后面的文章中会贴出来。


END

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
28天前
|
Java
使用Java代码打印log日志
使用Java代码打印log日志
89 1
|
5月前
|
Java Spring
spring boot 配置log4j 日志
spring boot 配置log4j 日志
71 0
|
4月前
|
Java Spring
【Spring Boot】logback和log4j日志异常处理
【1月更文挑战第25天】【Spring Boot】logback和log4j日志异常处理
|
4月前
|
SQL Java 数据库连接
Mybatis之Mybatis简介、搭建Mybatis相关步骤(开发环境、maven、核心配置文件、mapper接口、映射文件、junit测试、log4j日志)
【1月更文挑战第2天】 MyBatis最初是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation迁移到了Google Code。随着开发团队转投Google Code旗下,iBatis3.x正式更名为MyBatis。代码于2013年11月迁移到Github iBatis一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBatis提供的持久层框架包括SQL Maps和Data Access Objects(DAO)
204 3
Mybatis之Mybatis简介、搭建Mybatis相关步骤(开发环境、maven、核心配置文件、mapper接口、映射文件、junit测试、log4j日志)
|
8天前
|
Java
log4j异常日志过滤规则配置
log4j异常日志过滤规则配置
16 0
|
12天前
|
JavaScript Java 测试技术
基于Java的公司员工工作日志办公系统的设计与实现(源码+lw+部署文档+讲解等)
基于Java的公司员工工作日志办公系统的设计与实现(源码+lw+部署文档+讲解等)
32 3
|
18天前
|
Java Spring
日志精准记录:Spring与Log4j完美整合的实战指南
日志精准记录:Spring与Log4j完美整合的实战指南
18 0
日志精准记录:Spring与Log4j完美整合的实战指南
|
2月前
|
监控 Java 测试技术
日志框架到底是Logback 还是 Log4j2
日志框架到底是Logback 还是 Log4j2
20 0
|
3月前
|
供应链 Java 测试技术
开发Java应用时如何用好Log
开发Java应用时如何用好Log
77 3
|
3月前
|
JSON 监控 Java
Java Web开发中的异常处理与日志记录最佳实践
Java Web开发中的异常处理与日志记录最佳实践