1.丢数据这种情况少,可以用来做审计功能。而且自身内部报的exception会被发现,但是logback和log4j不会。
2.log4j2使用了disruptor技术,在多线程环境下,性能高于logback等10倍以上。
3.(garbage free)之前的版本会产生非常多的临时对象,会造成GC频繁,log4j2则在这方面上做了优化,减少产生临时对象。尽可能少的GC
4.利用插件系统,使得扩展新的appender,filter,layout等变得容易,log4j不可以扩展 插件????
5.因为插件系统的简单性,所以在配置的时候,可以不用具体指定所要处理的类型。class
6.可以自定义level
7.Java 8 lambda support for lazy logging
8.Support for Message objects
9.对filter的功能支持的更强大
10.系统日志(Syslog)协议supports both TCP and UDP
11.利用jdk1.5并发的特性,减少了死锁的发生。
Socket LogEvent SerializedLayout
kafka queue
一个基本的Log4j2.xml配置:
<?xml version="1.0" encoding="UTF-8"?> <!-- 在运行时,可以动态修改配置文件,不用重启服务,在固定时长更新一次配置文件。monitorInterval设置更新配置文件时长, 单位为seconds , min senconds >= 5secondes --> <Configuration monitorInterval="30" > <Properties> <Property name="log.path">E:\log4j2_log\</Property> </Properties> <Appenders> <!-- 控制台appdener--> <Console name="STDOUT" target="SYSTEM_OUT"> <PatternLayout charset="UTF-8" pattern="%m%n"/> </Console> <!-- File appdener--> <File name="MyFile" fileName="logs/app.log" bufferedIO="true" > <PatternLayout> <Charset>UTF-8</Charset> <Pattern>%d %p %c{1.} [%t] %m%n</Pattern> </PatternLayout> </File> <!-- RandomAccessFile 性能高于 File--> <RandomAccessFile name="MyFile" fileName="logs/RandomAccessFile.log" > <PatternLayout> <Charset>UTF-8</Charset> <Pattern>%d %p %c{1.} [%t] %m%n</Pattern> </PatternLayout> </RandomAccessFile> <!--<RollingFile></RollingFile>--> <!-- 注意:一般情况下都使用RollingRandomAccessFile 。 RollingRandomAccessFile可以按照日志名称的格式进行定期备份,拥有一定的备份策略。 1.是否压缩备份日志:直接在filePattern属性的文件名称最后加对应的压缩后缀,如gzip压缩用 .gz --> <RollingRandomAccessFile name="RollingRandomAccessFile" fileName="logs/RollingRandomAccessFile.log" filePattern="logs/RollingRandomAccessFile-%d{yyyy-MM-dd}-%i.log.gz"> <PatternLayout> <Pattern>%d %p %c{1.} [%t] %m%n</Pattern> </PatternLayout> <!-- 备份策略:满足其中一个就可以启动备份--> <Policies> <!-- interval 多久执行一次备份,单位为 RollingRandomAccessFile的属性filePattern中%d{yyyy-MM-dd}的最小时间单位,此处是天--> <TimeBasedTriggeringPolicy interval="1" modulate="true"/> <SizeBasedTriggeringPolicy size="250 MB"/> </Policies> <!-- 默认的备份策略:max="7"表示最多只保留7份日志,fileIndex属性是在拥有多个备份日志的时候,命令是以递增的数为文件名,max值时值大的文件是最新的内容,min值时值大的是最久的内容--> <DefaultRolloverStrategy fileIndex="max" max="7"> <!-- 删除指定目录下60天之前的日志--> <Delete basePath="${log.path}" maxDepth="2"> <IfFileName glob="*/app-*.log.gz" /> <IfLastModified age="60d" /> </Delete> </DefaultRolloverStrategy> </RollingRandomAccessFile> <!-- 异步 appder ,使用的是ArrayBlocingQueue --> <Async name="Async"> <AppenderRef ref="MyFile"/> </Async> </Appenders> <Loggers> <Root level="error"> <AppenderRef ref="MyFile"/> </Root> <!-- logger additivity属性:如果设置为true(默认值)则log会被打印两次,这里的logger和root--> <Logger name="com.foo.bar.MyApp" level="info" additivity="true"> <appender-ref ref="RandomAccessFile"/> </Logger> <!-- 异步 logger:使用了disruptor类库,代替Jdk中的queue,性能提高很多 includeLocation属性是指layout中的 %C or $class, %F or %file, %l or %location, %L or %line, %M or %method,异步logger默认为false,如果设置为true,会影响logger的性能 --> <AsyncLogger name="com.foo.test" level="info" additivity="false" includeLocation="false"> <appender-ref ref="log4j2test"/> <appender-ref ref="STDOUT"/> </AsyncLogger> </Loggers> </Configuration>
使用文档: 文档下载
用户手册:下载
官网 http://logging.apache.org/log4j/2.x/