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

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的分类及常用类型示例


版权声明:本文为zhoucheng05_13原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。