认识下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_OUT或SYSTEM_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