log4j2 是log4j的升级版,在功能和性能上都有很大的提升。
1.常用组件
1.1 Appenders
Appender负责将LogEvents传递到目的地。 每个Appender都必须实现Appender接口。 大多数Appender继承自AbstractAppender,它增加了Lifecycle和Filterable支持。 生命周期允许组件在配置完成后完成初始化并在关闭期间执行清理。 Filterable接口允许组件附加过滤器,在事件处理期间对其进行筛选。Appender通常只负责将事件数据写入目标目标。 在大多数情况下,他们将格式化事件的责任委托给布局。 一些appender包装其他appender,以便他们可以修改LogEvent,处理Appender中的故障,根据高级Filter条件将事件路由到从属Appender
(1)AsyncAppender:引用其他Appender,被引用的Appender可以做到异步输出日志。
(2)CassandraAppender:可以将消息写入Cassandra数据库。
(3)ConsoleAppender:日志写入到标准输出,如System.out或System.error
(4)FailoverAppender:引用一组Appender,如果主的Appender失败则备用Appender开始起作用,直到主Appender恢复正常。
(5)FileAppender:将日志写入文件,比较常用。
(6)FlumeAppender:将日志以event的形式写入flume。
有三种模式:
a.远程客户端模式:模拟flume远程客户端,以avro_event的方式向agent发送消息。
b.内置flume agent模式:直接将event写入flume channel。
c.persist模式:将event写入本地BerkeleyDB,然后通过异步的方式将event发送到flume。
(7)JDBCAppender:使用JDBC连接将数据写入传统数据库。
(8)JMS Appender:将格式化后的日志写入JMS Destination。
(9)HttpAppender:发送日志到一个Http服务,必须使用Layout来格式化日志。
(10)KafkaAppender:将数据发送到kafka的topic,log4j的event对应kafka的record。
(11)MemoryMappedFileAppender:是一种特殊的日志写入方式,将日志写入内存以减少读写磁盘带来的IO开销,提升性能。
(12)NoSQLAppender:可以将数据写入nosql数据库,目前支持MongoDB和CouchDb。
(13)RandomAccessFileAppender:和FileAppender类似,但是使用了ByteBuffer+RandomAccessFile的方式来代替BufferedOutputStream
(14)RewriteAppender:允许LogEvent在其他appender处理之前先由RewriteAppender处理。
(15)RollingFileAppender:配置文件滚动生成策略,按照策略生成新的日志文件。
(16)RollingRandomAccessFileAppender:和RollingFileAppender类似,使用了ByteBuffer+RandomAccessFile的方式代替BufferedOutputStream。
(17)RoutingAppender:路由appender,可以分发Logevent到多个子Appender。
(18)SMTPAppender:将日志以邮件的形式发送,用在错误监控或者报警上。
(19)SocketAppender:将logevent发送到远程机器上,可以使用TCP或者UDP协议。
1.2 Layout
layout是指输出Logevent的布局,常见的比如输出日志的级别、时间、类名、线程等信息。Log4j2支持的Layout有如下几种:
(1)CSV Layouts。日志输出为csv文件,如log.info(a,b,c)会输出到csv文件对应的三列。
(2)HTML Layout。将日志输出为html页面,每个Logevent对应table里面的一行。
(3)JSON Layout。将日志输出为json格式。
(4)Pattern Layout。较为常用,通过使用一些匹配规则来确定日志输出格式。
(5)RFC5424 Layout。消息型的Appender经常用这种layout。
(6)Serialized Layout。使用java自身的序列化工具将Logevent序列化成byte array,但因为java固有的安全性问题,这种方式不再被推荐。
(7)Syslog Layout。将日志格式化为BSD syslog格式。
(8)XML Layout。格式化为xml。
2.配置文件
如果没有配置文件,log4j会使用自身的最小化配置,但是只能输出error级别的日志,并且在运行过程中会提示没有找到配置文件。log4j2支持xml,json,yaml,properties这几种格式的配置文件。配置文件应该放到项目的classpath下面,一般都放在resources目录下。读取配置文件的优先级由高到低依次为:log4j2.properties>log4j2.yaml>log4j2.json>log4j2.xml>defaultConfiguration。
3.demo
3.1 引入pom依赖
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.11.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.11.0</version>
</dependency>
3.2 配置log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
3.3 测试代码
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;
public class MyApp {
private static final Logger logger = LogManager.getLogger(MyApp.class);
public static void main(final String... args) {
logger.info("log4j test.");
logger.error("this is error message .");
}
}
结果如下图:
官方文档写的也很详细:https://logging.apache.org/log4j/2.x/manual/