Log4j2官方文档翻译、学习笔记之二——Appender的分类及常用类型示例

时间:2021-12-25 19:55:57

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

下一篇:Log4j2官方文档翻译、学习笔记之三——Layouts的分类及常用类型示例