Appenders是什么
官方文档说“Appenders are responsible for delivering LogEvents to their destination.”也就是说,Appenders负责将日志事件投递到它们的目的地。这个目的地可以是控制台,文件,数据库,甚至是邮件。Appender通常会将日志信息的排版委托给layout(layout将在下一篇博客详细讲解)。
Appender分类
名称 | 描述 |
---|---|
AsyncAppender | 使用一个单独线程记录日志,实现异步处理日志事件。 |
CassandraAppender | 将日志信息输出到一个Apache的Cassandra数据库 |
ConsoleAppender | 将日志信息输出到控制台 |
FailoverAppender | 包含其他appenders,按顺序尝试,直至成功或结尾 |
FileAppender | 一个OutputStreamAppender,将日志输出到文件 |
FlumeAppender | 将日志输出到Apache Flume系统 |
JDBCAppender | 将日志通过JDBC输出到关系型数据库 |
JMS Appender | 将日志输出到JMS(Java Message Service) |
JPAAppender | 将日志输出到JPA框架 |
HttpAppender | 通过HTTP输出日志 |
KafkaAppender | 将日志输出到Apache Kafka |
MemoryMappedFileAppender | 将日志输出到一块文件关联的内存 |
NoSQLAppender | 将日志输出到NoSQL数据库,如MongoDB |
OutputStreamAppender | 将日志输出到一个OutputStream |
RandomAccessFileAppender | 性能比FileAppender高20%~200%的文件输出Appender |
RewriteAppender | 允许对日志信息进行加工 |
RollingFileAppender | 按log文件最大长度限度生成新文件 |
RollingRandomAccessFA | 添加了缓存的RollingFileAppender |
RoutingAppender | 将日志事件分类,按条件分配给子appender |
SMTPAppender | 将日志输出到邮件 |
SocketAppender | 将日志输出到一个Socket |
SyslogAppender | 是一个SocketAppender,将日志输出到远程系统日志 |
ZeroMQ/JeroMQ Appender | 使用JeroMQ库将日志输出到ZeroMQ终端 |
常用Appender讲解
ConsoleAppender
ConsoleAppender将日志信息输出到System.out。它的所有属性如下:
- filter:设置过滤器
- layout:设置输出样式
- follow:Identifies whether the appender honors reassignments of System.out or System.err via System.setOut or System.setErr made after configuration.
- direct:是否绕过java.lang.System.out/.err,直接写入java.io.FileDescriptor。这会带来10倍的性能提升。
- name:Appender的名字
- ignoreException:默认true。
- target:输出方法,“SYSTEM_OUT”或者“SYSTEM_ERR”。默认“SYSTEM_OUT”
一个典型的控制台配置实例:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" name="MyApp" packages="">
<Appenders>
<Console name="STDOUT" target="SYSTEM_OUT">
<PatternLayout pattern="%m%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="error">
<AppenderRef ref="STDOUT"/>
</Root>
</Loggers>
</Configuration>
RandomAccessFileAppender
RandomAccessFIleAppender和标准的FileAppender很相似,除了将BufferdOutputStream替换为了ByteBuffer+RandomAccessFile。因为使用了缓存,它的性能比FileAppender高20%~200%.它的属性如下:
- append:boolean类型,默认为true。当为true时,它会将日志事件记录添加到文件末尾。若为false,则会清除之前的记录,然后写入。
- fileName:将要写入的文件名。如果这个文件或者其父目录不存在,那么他们将会被创建。
- filters:过滤器
- immediateFlush:boolean。当为true(默认值)时,每一次写入都会被刷新到文件。这能保证记录会被写入硬盘,但是会影响性能。 每次写入过后都立即刷新仅在日志记录需要同步的时候有用。异步的loggers和appenders会自动地在每个批处理后刷新,即使该属性被设置为false。这既保证了记录的写入,同时也保证了效率。
- bufferSize:缓存空间大小,默认为256M。
- layout:设置输出样式
- name:该Appender的名字
- ignoreExceptions:同上
使用示例:
<Configuration status="warn" name="MyApp">
<Appenders>
<RandomAccessFile name="RAF" fileName="logs/app.log">
<PatternLayout>
<Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
</PatternLayout>
</RandomAccessFile>
</Appenders>
<Loggers>
<Root level="error">
<AppenderRef ref="RAF"/>
</Root>
</Loggers>
</Configuration>
RollingFileAppender
RollingFileAppender是一种OutputStreamAppender。它除了将日志输出到文件外,还会根据TriggeringPolicy和RolloverPolicy生成新的日志文件。
一个RollingFileAppender需要两个策略的支持,分别是TriggeringPolicy和RolloverPolicy。TriggeringPolicy定义何时应该生成新的日志文件而RolloverPolicy则决定如何生成新的日志文件。RollingFileAppender不支持文件锁。
RollingFileAppender的详细信息可以参照博客http://blog.csdn.net/u013066244/article/details/72461105。这位博主翻译了官方文档的这一节,写得很好,我就不重复造*了。
贴一个使用示例:
<?xml version="1.0" encoding="UTF-8"?>
<configuration status="error">
<!--先定义所有的appender-->
<appenders>
<!--这个输出控制台的配置-->
<Console name="Console" target="SYSTEM_OUT">
<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
<ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>
<!--这个都知道是输出日志的格式-->
<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
</Console>
<!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,这个也挺有用的,适合临时测试用-->
<!-- <File name="log" fileName="log/test.log" append="false">
<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
</File>-->
<!--这个会打印出所有的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
<RollingFile name="RollingFile" fileName="logs/app.log"
filePattern="logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.zip">
<PatternLayout pattern="%d{yyyy-MM-dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/>
<!--为了方便测试,这里设置为尽可能小-->
<SizeBasedTriggeringPolicy size="1k"/>
</RollingFile>
</appenders>
<!--然后定义logger,只有定义了logger并引入的appender,appender才会生效-->
<loggers>
<!--建立一个默认的root的logger-->
<root level="trace">
<appender-ref ref="RollingFile"/>
<appender-ref ref="Console"/>
</root>
</loggers>
</configuration>
更加完整的测试示例基于SpringBoot和Maven构建,包含控制台和文件输出,采用了上面示例中的PatternLayout格式化输出,已经通过测试,并且上传至Github,欢迎克隆学习!Github开源地址:https://github.com/Dodozhou/log4j2Learning