Java_日志_log4j2
Java_日志_log4j2
- 简介
- 配置加载
- 配置文档
- Appender实现类
- Filter实现类
- Pattern 输出格式
- SpringBoot
- 示例
简介
(1)日志接口(slf4j)
slf4j是对所有日志框架制定的一种规范、标准、接口,并不是一个框架的具体的实现,因为接口并不能独立使用,需要和具体的日志框架实现配合使用(如log4j、logback)
(2)日志实现(log4j、logback、log4j2)
log4j是apache实现的一个开源日志组件
logback同样是由log4j的作者设计完成的,拥有更好的特性,用来取代log4j的一个日志框架,是slf4j的原生实现
log4j2是log4j 1.x和logback的改进版,据说采用了一些新技术(无锁异步、等等),使得日志的吞吐量、性能比log4j 1.x提高10倍,并解决了一些死锁的bug,而且配置更加简单灵活。
log4j2日志级别:
从大到小依次是: error, warn, info, debug, trace
log4j2支持的输出源有很多,有控制台Console、文件File、RollingRandomAccessFile、MongoDB、Flume 等
性能比较:Log4J2 和 Logback 都优于 log4j(不推荐使用)
配置方式:Logback最简洁,spring boot默认,推荐使用
配置加载
配置文档
Appenders
Appender 一个通道,定义日志文件的内容格式和保存的位置
Filter 过滤
Layout 输出格式
Policies 何时进行输出
Strategy 如何进行输出
Loggers
Logger 一个路由器,指定类、包中的日志信息流向哪个管道,以及控制他们的流量(日志级别)
Root 必须配置
Appender实现类
ConsoleAppender(Console) 控制台输出
FileAppender(File) 日志输出到文件
RandomAccessFileAppender(RandomAccessFile) 日志输出到文件,性能比上一个高
RollingFileAppender(RollingFile) 日志按规则分类输出到文件
RollingRandomAccessFileAppender(RollingRandomAccessFile) 日志按规则分类输出到文件
(1)Console 控制台输出
<?xml version="1.0" encoding="UTF-8"?>
<Configuration name="testConf" status="warn" monitorInterval="30">
<Appenders>
<!-- target: SYSTEM_OUT/SYSTEM_ERR -->
<Console name="Console" target="SYSTEM_OUT">
<!-- 格式化日志 -->
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" charset="UTF-8"/>
</Console>
</Appenders>
<Loggers>
<!-- level默认为error -->
<Root level="info">
<!-- 这里引用了Appenders标签中的name值 -->
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
(2)RandomAccessFile 日志输出到文件
<?xml version="1.0" encoding="UTF-8"?>
<Configuration name="testConf" status="warn" monitorInterval="30">
<Appenders>
<!-- fileName:文件输出位置 immediateFlush: 默认true 是否每次写入刷新硬盘-->
<RandomAccessFile name="File" fileName="logs/app.log" immediateFlush="false">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" charset="UTF-8"/>
</RandomAccessFile>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="File"/>
</Root>
</Loggers>
</Configuration>
(3)RollingRandomAccessFile 日志按规则分类输出到文件
<?xml version="1.0" encoding="UTF-8"?>
<Configuration name="testConf" status="warn" monitorInterval="30">
<Appenders>
<!-- filePattern:%i 滚动参数值,从1递增 -->
<RollingRandomAccessFile name="File" fileName="logs/app.log"
filePattern="logs/$${date:hh-mm}/%d{hh-mm-ss}.app.%i.log" >
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" charset="UTF-8"/>
<Policies>
<!-- 每 5s 翻滚一次 -->
<CronTriggeringPolicy schedule="0/5 * * * * ?" />
<!-- 一般使用上面表达式形式,比较灵活 modulate属性为true(默认) 可通过interval指定秒数5,从启动时间开始算5秒 -->
<TimeBasedTriggeringPolicy interval="5" modulate="true"/>
<!-- 单文件大小超过10兆 翻滚一次,单位:KB,MB,GB -->
<SizeBasedTriggeringPolicy size="10 MB"/>
</Policies>
<!-- %i超过10,删除旧日志 -->
<DefaultRolloverStrategy max="10" />
</RollingRandomAccessFile>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="File"/>
</Root>
</Loggers>
</Configuration>
Filter实现类
LevelRangeFilter 指定日志级别过滤
TimeFilter 指定时间进行过滤
ThresholdFilter
<?xml version="1.0" encoding="UTF-8"?>
<Configuration name="testConf" status="warn" monitorInterval="30">
<Appenders>
<Console name="Console">
<!--
设置 onMismatch="NEUTRAL" 可以让日志经过后续的过滤器
最后一个过滤器建议设置 onMismatch="DENY", 不然日志就输出了。
-->
<Filters>
<!-- 从大到小:error, warn, info, debug, trace 该配置会输出代码中设置error,warn,info 级别的日志内容-->
<LevelRangeFilter minLevel="error" maxLevel="info" onMatch="ACCEPT" onMismatch="NEUTRAL" />
<!-- 只允许在每天的 8点半~11点半 之间输出日志 -->
<TimeFilter start="08:30:00" end="11:30:00" onMatch="ACCEPT" onMismatch="DENY" />
</Filters>
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" charset="UTF-8"/>
</Console>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
Pattern 输出格式
%c{x} %class{x} 打印传递给logger的类的名称及路径。在{}中可以填入数字,比如:类的路径为”org.apache.commons.Foo”,则%c{1}输出”Foo”,%c{2}输出”commons.Foo”。可以不要{},则默认打印全路径。官方文档指出,打印类路径是一项昂贵的操作,可能影响性能,谨慎使用。
%d{x} %date{x} 打印时间。{}可以填写某种格式形式的字符串以表示不用格式的日期,官方提供的有:DEFAULT, ABSOLUTE, COMPACT, DATE, ISO8601, ISO8601_BASIC。通常使用DEFAULT,输出形式为:2012-11-02 14:34:02,781。也可以自己指定格式,比如:yyyy-MM-dd HHss,则输出:2017-12-31 15:43:41。
%n 换行。如果不指定,则日志输出默认是不换行的。通常放在输出格式的最后。
%highlight 高亮。用于指定不同级别的日志打印出不用的颜色。详细信息可参考官方文档。想要在eclipse的控制中做到这种效果,需要ANSI Escape in console插件的支持,参考log4j日志在eclipse控制台显示颜色的配置
%M 打印调用的方法名。官方文档指出,此项操作相当昂贵,可能影响性能,谨慎使用。
%l 打印类的全路径和调用处的行号,同时附加一个链接,指向该日志的调用位置,在eclipse控制台中,点击链接,可以跳转到此日志的调用位置。官方文档指出,此项操作相当昂贵,可能影响性能,谨慎使用。经过本人测试,想要打印出类的全路径以及调用的方法名,%l与%c.%M性能相差无几,但是%l多一个链接的功能,可以优先选择%l输出。
%m 打印传递给logger方法的用户日志信息。
%N 打印当前时间的毫微秒。如同调用:System.nanotime()
%pid 打印应用的进程ID。
%r 打印自虚拟机启动以来到此日志打印经过的毫秒数。
%sn 打印日志调用的次数。内部为一个自增长的序列,值从0开始,为整个应用的静态全局变量,
%T 打印调用此日志的线程ID。
SpringBoot
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 使用log4j2 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
spring boot 默认加载classpath添加log4j2.xml或者log4j2-spring.xml。
示例
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<properties>
<property name="LOG_HOME">D:/logs</property>
<property name="FILE_NAME">mylog</property>
<property name="log.sql.level">info</property>
</properties>
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %l - %msg%n" />
</Console>
<RollingRandomAccessFile name="RollingRandomAccessFile" fileName="${LOG_HOME}/${FILE_NAME}.log" filePattern="${LOG_HOME}/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd HH-mm}-%i.log">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %l - %msg%n"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1"/>
<SizeBasedTriggeringPolicy size="10 MB"/>
</Policies>
<DefaultRolloverStrategy max="20"/>
</RollingRandomAccessFile>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="Console" />
<AppenderRef ref="RollingRandomAccessFile" />
</Root>
<Logger name="com.mengdee.dao" level="${log.sql.level}" additivity="false">
<AppenderRef ref="Console" />
</Logger>
</Loggers>
</Configuration>
还没有评论,来说两句吧...