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日志并进行多维度分析。
目录
相关文章
|
6天前
|
Java
使用Java代码打印log日志
使用Java代码打印log日志
257 1
|
5天前
|
Java
java使用AOP切面获取请求日志并记录
java使用AOP切面获取请求日志并记录
|
5天前
|
运维 监控 安全
Java一分钟之-Log4j与日志记录的重要性
【5月更文挑战第16天】Log4j是Java常用的日志框架,用于灵活地记录程序状态和调试问题。通过设置日志级别和过滤器,可避免日志输出混乱。为防止日志文件过大,可配置滚动策略。关注日志安全性,如Log4j 2.x的CVE-2021-44228漏洞,及时更新至安全版本。合理使用日志能提升故障排查和系统监控效率。
28 0
|
6天前
|
Java 数据库
log4j:WARN Please initialize the log4j system prop
log4j:WARN Please initialize the log4j system prop
11 1
|
6天前
|
XML Java Maven
Springboot整合与使用log4j2日志框架【详解版】
该文介绍了如何在Spring Boot中切换默认的LogBack日志系统至Log4j2。首先,需要在Maven依赖中排除`spring-boot-starter-logging`并引入`spring-boot-starter-log4j2`。其次,创建`log4j2-spring.xml`配置文件放在`src/main/resources`下,配置包括控制台和文件的日志输出、日志格式和文件切分策略。此外,可通过在不同环境的`application.yml`中指定不同的log4j2配置文件。最后,文章提到通过示例代码解释了日志格式中的各种占位符含义。
|
6天前
|
Java
Java Exception打印及输出到日志
有时候如果打印出异常的错误,并记录下来,这里记录一下
52 5
|
6天前
|
存储 消息中间件 Java
Java多线程实战-异步操作日志记录解决方案(AOP+注解+多线程)
Java多线程实战-异步操作日志记录解决方案(AOP+注解+多线程)
|
6天前
|
缓存 Java 测试技术
Java多线程实战-实现多线程文件下载,支持断点续传、日志记录等功能
Java多线程实战-实现多线程文件下载,支持断点续传、日志记录等功能
|
6天前
|
Java
log4j异常日志过滤规则配置
log4j异常日志过滤规则配置
101 0
|
6天前
|
JavaScript Java 测试技术
基于Java的公司员工工作日志办公系统的设计与实现(源码+lw+部署文档+讲解等)
基于Java的公司员工工作日志办公系统的设计与实现(源码+lw+部署文档+讲解等)
176 3