log4j
Table of Contents

Log4j

Commons Logging,可以作为“日志接口”来使用。而真正的“日志实现”可以使用Log4j

架构

Log4j是一个组件化设计的日志系统,它的架构大致如下:

log.info("User signed in.");
 
    ┌──────────┐    ┌──────────┐    ┌──────────┐    ┌──────────┐
 ├──> Appender │───>  Filter  │───>  Layout  │───> Console  
    └──────────┘    └──────────┘    └──────────┘    └──────────┘
 
    ┌──────────┐    ┌──────────┐    ┌──────────┐    ┌──────────┐
 ├──> Appender │───>  Filter  │───>  Layout  │───>   File   
    └──────────┘    └──────────┘    └──────────┘    └──────────┘
 
    ┌──────────┐    ┌──────────┐    ┌──────────┐    ┌──────────┐
 └──> Appender │───>  Filter  │───>  Layout  │───>  Socket  
     └──────────┘    └──────────┘    └──────────┘    └──────────┘

使用Log4j输出一条日志时,Log4j自动通过不同的Appender把同一条日志输出到不同的目的地。例如:

在输出日志的过程中,通过Filter来过滤哪些log需要被输出,哪些log不需要被输出。例如,仅输出ERROR级别的日志。

最后,通过Layout来格式化日志信息,例如,自动添加日期、时间、方法名称等信息。

安装

把一个log4j2.xml的文件放到classpath下就可以让Log4j读取配置文件并按照我们的配置来输出日志

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
    <Properties>
        <!-- 定义日志格式 -->
        <Property name="log.pattern">%d{MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36}%n%msg%n%n</Property>
        <!-- 定义文件名变量 -->
        <Property name="file.err.filename">log/err.log</Property>
        <Property name="file.err.pattern">log/err.%i.log.gz</Property>
    </Properties>
    <!-- 定义Appender,即目的地 -->
    <Appenders>
        <!-- 定义输出到屏幕 -->
        <Console name="console" target="SYSTEM_OUT">
            <!-- 日志格式引用上面定义的log.pattern -->
            <PatternLayout pattern="${log.pattern}" />
        </Console>
        <!-- 定义输出到文件,文件名引用上面定义的file.err.filename -->
        <RollingFile name="err" bufferedIO="true" fileName="${file.err.filename}" filePattern="${file.err.pattern}">
            <PatternLayout pattern="${log.pattern}" />
            <Policies>
                <!-- 根据文件大小自动切割日志 -->
                <SizeBasedTriggeringPolicy size="1 MB" />
            </Policies>
            <!-- 保留最近10份 -->
            <DefaultRolloverStrategy max="10" />
        </RollingFile>
    </Appenders>
    <Loggers>
        <Root level="info">
            <!-- 对info级别的日志,输出到console -->
            <AppenderRef ref="console" level="info" />
            <!-- 对error级别的日志,输出到err,即上面定义的RollingFile -->
            <AppenderRef ref="err" level="error" />
        </Root>
    </Loggers>
</Configuration>

因为Log4j也是一个第三方库, 下载

https://logging.apache.org/log4j/2.x/download.html

解压后,把以下3个jar包放到classpath中: