[J2EE:中间件]Slf4J+Logback快速入门

1 简述

Logback
The generic,reliable,fast & flexible Logging Framwork.

一款通用的、可靠的、快速的和灵活的日志框架。

Logback是由log4j创始人设计的一个开源日志组件。LogBack被分为3个组件:

  • logback-core:提供了LogBack的核心功能,是另外两个组件的基础。
  • logback-classic:实现了Slf4j的API,所以当想配合Slf4j使用时,需要引入logback-classic。
  • logback-access:为了集成Servlet环境而准备的,可提供HTTP-access的日志接口。

2 快速入门

step1 配置文件: logback.xml

<?xml version="1.0" encoding="utf-8" ?>
<!-- 从高到地低 OFF 、 FATAL 、 ERROR 、 WARN 、 INFO 、 DEBUG 、 TRACE 、 ALL -->
<!-- 日志输出规则  根据当前ROOT 级别,日志输出时,级别高于root默认的级别时  会输出 -->
<!-- 以下  每个配置的 filter 是过滤掉输出文件里面,会出现高级别文件,依然出现低级别的日志信息,通过filter 过滤只记录本级别的日志-->

<!-- 属性描述 scan:性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,
默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
<configuration scan="true" scanPeriod="60 seconds" debug="false">
    <!-- 定义日志文件 输入位置 -->
    <!-- <property name="logPath" value="d:/test_log" /> -->
    <property name="logBasePath" value="${catalina.base}/logs/wydataeye"/>

    <!-- 日志最大的历史 30天 -->
    <property name="maxHistory" value="30"/>

    <!-- 配置项, 通过此节点配置日志输出位置(控制台、文件、数据库)、输出格式等-->
    <!-- ConsoleAppender代表输出到控制台 -->
    <appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
        <!-- layout代表输出格式 -->
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger -%msg%n</pattern>
        </layout>
    </appender>
    <!-- 日志输出文件 -->
    <appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger -%msg%n</pattern>
        </encoder>
        <!-- 滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件 RollingFileAppender-->
        <!-- 滚动策略,它根据时间来制定滚动策略.既负责滚动也负责触发滚动 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 输出路径 -->
            <fileNamePattern>${logBasePath}/info/%d.log</fileNamePattern>
            <!-- 可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件假设设置每个月滚动,且<maxHistory>是6,
            则只保存最近6个月的文件,删除之前的旧文件。注意,删除旧文件是,那些为了归档而创建的目录也会被删除-->
            <maxHistory>${maxHistory}</maxHistory>
        </rollingPolicy>
        <!-- 按照固定窗口模式生成日志文件,当文件大于20MB时,生成新的日志文件。窗口大小是1到3,当保存了3个归档文件后,将覆盖最早的日志。
        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
          <fileNamePattern>${logBasePath}/%d{yyyy-MM-dd}/.log.zip</fileNamePattern>
          <minIndex>1</minIndex>
          <maxIndex>3</maxIndex>
        </rollingPolicy>   -->
        <!-- 查看当前活动文件的大小,如果超过指定大小会告知RollingFileAppender 触发当前活动文件滚动
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <maxFileSize>5MB</maxFileSize>
        </triggeringPolicy>   -->
    </appender>
    <!-- 特殊记录Error日志 -->
    <appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 只记录ERROR级别日志,添加范围过滤,可以将该类型的日志特殊记录到某个位置 -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger -%msg%n</pattern>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${logBasePath}/error/%d.log</fileNamePattern>
            <!-- 日志最大的历史 60天 -->
            <maxHistory>60</maxHistory>
        </rollingPolicy>
    </appender>

    <!-- 根节点,表名基本的日志级别,里面可以由多个appender规则 -->
    <!-- level="info"代表基础日志级别为info -->
    <root level="info">
        <!-- 引入控制台输出规则 -->
        <appender-ref ref="consoleLog" />
        <appender-ref ref="fileInfoLog" />
        <appender-ref ref="fileErrorLog" />
    </root>
</configuration>

step2 Maven依赖: pom.xml

<!-- 日志 -->
<!-- Slf<Simple Logging Facade For Java> + Log4J -->
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.25</version>
</dependency>
<!-- 实现方案1:Log4J -->
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-log4j12 -->
<!-- slf4j与log4j的整合jar包 : 其将自动引入其log4j-1.2.17.jar -->
<!--        <dependency>-->
<!--            <groupId>org.slf4j</groupId>-->
<!--            <artifactId>slf4j-log4j12</artifactId>-->
<!--            <version>1.7.25</version>-->
<!--        </dependency>-->
<!-- 实现方案2: Logback -->
<!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-core -->
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-core</artifactId>
    <version>1.2.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-classic -->
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.3</version>
</dependency>

step3 测试验证

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class TestLog {
    static Logger logger = LoggerFactory.getLogger(TestLog.class);
    public static void main(String[] arge){
        logger.debug("johnnyzen debug");
        logger.info("johnnyzen info");
        logger.error("johnnyzen error");
        logger.warn("johnnyzen warn");
    }
}

测试结果:

备注:因为root节点中我们记录的日志级别是info,其就只会记录等于或高于info级别的日志,其他的都忽略避免生产环境产生过多日志。

3 实际工程示例 & 最佳实践

step1 使用示例

LoggerUtil.info(LoggerUtil.DATASERVICE_MNG_CORE_LOGGER, GlobalMessageUtil.getString("metadat.MetadataController.advancedSearch.in"));

LoggerUtil.debug(LoggerUtil.CORE_MNG_LOGGER, e, GlobalMessageUtil.getString("metadat.MetadataController.advancedSearch.error"));

step2 LoggerUtil.java

package com.orgName.productName.common;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 日志工具类
 * <p>Title: LoggerUtil.java</p>
 * <p>Description: </p>
 * <p>Copyright:Copyright(c)2016</p>
 * <p>Company: XXXX </p>
 * <p>CreateTime: 1999年10月10日 下午10:10:10</p>
 *
 * @author xxxx
 * @version V2.0
 */
public class LoggerUtil2 {

    //1日志定义-------------start-------------------
    /**
     * 公共模块1 连接池
     */
    private static final String DB_POOL_MNG_LOGGER = "DB_POOL_MNG";

    /**
     * 公共模块2 restful日志定义
     */
    private static final String API_MNG_LOGGER = "API_MNG";

    /**
     * 公共模块3 service日志定义
     */
    private static final String CORE_MNG_LOGGER = "CORE_MNG";

    /**
     * 业务模块1 数据服务日志定义
     */
    private static final String DATASERVICE_MNG_CORE_LOGGER = "DATASERVICE_MNG_CORE";

    /**
     * 业务模块2 元数据采集任务日志定义
     */
    private static final String METADATACOLL_MNG_FACADE_LOGGER = "METADATACOLL_MNG_FACADE";

    /**
     * 业务模块3 执行器日志定义
     */
    private static final String EXECUTOR_MNG_CORE_LOGGER = "EXECUTOR_MNG_CORE_LOGGER";
    //1日志定义 -------------end-------------------


    //2日志实例-------------start-------------------
    /**
     * 日志实例 连接池
     */
    public static Logger DB_POOL_MNG_LOGGER_INSTANCE = LoggerFactory.getLogger(DB_POOL_MNG_LOGGER);

    /**
     * 日志实例 restful-api
     */
    public static Logger API_MNG_LOGGER_INSTANCE = LoggerFactory.getLogger(API_MNG_LOGGER);

    /**
     * 日志实例 service
     */
    public static Logger CORE_MNG_LOGGER_INSTANCE = LoggerFactory.getLogger(CORE_MNG_LOGGER);

    /**
     * 数据服务日志实例
     */
    public static Logger DATASERVICE_MNG_CORE_LOGGER_INSTANCE = LoggerFactory
            .getLogger(DATASERVICE_MNG_CORE_LOGGER);
    /**
     * 元数据采集任务日志实例
     */
    public static Logger METADATACOLL_MNG_FACADE_LOGGER_INSTANCE = LoggerFactory
            .getLogger(METADATACOLL_MNG_FACADE_LOGGER);

    /**
     * 执行器务日志实例
     */
    public static Logger EXECUTOR_MNG_CORE_LOGGER_INSTANCE = LoggerFactory
            .getLogger(EXECUTOR_MNG_CORE_LOGGER);

    //2日志实例-------------end-------------------

    //3日志格式字符定义-------------start-------------------
    private static final char THREAD_RIGHT_TAG = ']';
    private static final char THREAD_LEFT_TAG = '[';
    public static final char ENTERSTR = '\n';
    public static final char COMMA = ',';
    public static final char LINE = '|';
    //3日志格式字符定义-------------end-------------------

    //4日志方法区-------------start-------------------
    /**
     * create LoggerUtil instance
     */
    private LoggerUtil() {
    }

    /**
     * @param logger
     * @param obj
     * @author xxx
     * @createtime 1999年10月10日 下午10:10:10
     */
    public static void debug(Logger logger, Object... obj) {
        if (logger.isDebugEnabled()) {
            logger.debug(getLogString(obj));
        }
    }

    /**
     * @param logger
     * @param obj
     * @author xxx
     * @createtime 1999年10月10日 下午10:10:10
     */
    public static void info(Logger logger, Object... obj) {
        if (logger.isInfoEnabled()) {
            logger.info(getLogString(obj));
        }
    }

    /**
     * @param logger
     * @param obj
     * @author xxx
     * @createtime 1999年10月10日 下午10:10:10
     */
    public static void warn(Logger logger, Object... obj) {
        if (logger.isWarnEnabled()) {
            logger.warn(getLogString(obj));
        }
    }

    /**
     * @param logger
     * @param obj
     * @author xxx
     * @createtime 1999年10月10日 下午10:10:10
     */
    public static void error(Logger logger, Object... obj) {
        logger.error(getLogString(obj));
    }

    /**
     * @param logger
     * @param e
     * @param obj
     * @author xxx
     * @createtime 1999年10月10日 下午10:10:10
     */
    public static void error(Logger logger, Throwable e, Object... obj) {
        logger.error(getLogString(obj), e);
    }

    /**
     * 组装日志信息
     * @param obj
     * @return
     * @author xxx
     * @createtime 1999年10月10日 下午10:10:10
     */
    private static String getLogString(Object... obj) {
        StringBuilder log = new StringBuilder();
        log.append(THREAD_LEFT_TAG).append(Thread.currentThread().getId()).append(THREAD_RIGHT_TAG);

        for (Object o : obj) {
            log.append(o);

        }
        return log.toString();
    }
    //4日志方法区-------------end-------------------
}

step3 配置 logback.xml

亦可参见本文: step1 配置文件: logback.xml - 博客园/千千寰宇

<?xml version="1.0" encoding="UTF-8"?>
<configuration scanPeriod="60 seconds" scan="true">
    <property name="logBase" value="${catalina.base}/logs/wydataeye"/>

    <!-- appender 定义区 -start- -->

    <!-- 公共 appender - FILE_ERROR:  任何模块一旦报错,除了在各业务模块的日志下输出外,也必将统一汇总输出到 wydataeye_error.log -->
    <appender name="FILE_ERROR"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${logBase}/wydataeye_error.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>${logBase}/%d{yyyy-MM-dd}/wydataeye_error.log
            </FileNamePattern>
        </rollingPolicy>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>
        <encoder>
            <pattern>%date [%thread] %logger{10} [%file:%line] %msg%n
            </pattern>
            <charset class="java.nio.charset.Charset">UTF-8</charset>
        </encoder>

        <!-- 设置滚动策略 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 设置日志命名模式 -->
            <FileNamePattern>${logBase}/wydataeye_error.log.%d{yyyy-MM-dd}.%i
            </FileNamePattern>
            <!-- 最多保留X天log -->
            <maxHistory>3</maxHistory>
            <timeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>50MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
    </appender>

    <!-- 公共 appender - STDOUT -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>[%d{yyyy-MM-dd HH:mm:ss}][%thread][%logger] [%file:%line] -
                %msg%n
            </pattern>
            <charset class="java.nio.charset.Charset">UTF-8</charset>
        </encoder>
    </appender>

    <!-- 公共 appender - SSM_WEB_LOG -->
    <appender name="SSM_WEB_LOG"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <append>true</append>
        <!-- 日志路径 -->
        <file>${logBase}/ssm_web.log</file>
        <encoder>
            <pattern>%date [%thread] %-5level %caller{2} %logger %msg%n</pattern>
            <charset class="java.nio.charset.Charset">UTF-8</charset>
        </encoder>
        <!-- 设置滚动策略 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 设置日志命名模式 -->
            <FileNamePattern>${logBase}/ssm_web.log.%d{yyyy-MM-dd}.%i
            </FileNamePattern>
            <!-- 最多保留X天log -->
            <maxHistory>3</maxHistory>
            <timeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>50MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
    </appender>

    <!-- 公共 appender - API_LOG -->
    <!-- restful接口日志 -->
    <appender name="API_LOG"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <append>true</append>
        <!-- 日志路径 -->
        <file>${logBase}/api.log</file>

        <encoder>
            <pattern>%date [%thread] %-5level %caller{2} %logger %msg%n</pattern>
            <charset class="java.nio.charset.Charset">UTF-8</charset>
        </encoder>

        <!-- 设置滚动策略 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 设置日志命名模式 -->
            <FileNamePattern>${logBase}/api.log.%d{yyyy-MM-dd}.%i
            </FileNamePattern>
            <!-- 最多保留X天log -->
            <maxHistory>3</maxHistory>

            <timeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>50MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
    </appender>

    <!-- 公共 appender - CODE_LOG -->
    <appender name="CODE_LOG"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <append>true</append>
        <!-- 日志路径 -->
        <file>${logBase}/core.log</file>

        <encoder>
            <pattern>%date [%thread] %-5level %caller{2} %logger %msg%n</pattern>
            <charset class="java.nio.charset.Charset">UTF-8</charset>
        </encoder>

        <!-- 设置滚动策略 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 设置日志命名模式 -->
            <FileNamePattern>${logBase}/core.log.%d{yyyy-MM-dd}.%i
            </FileNamePattern>
            <!-- 最多保留X天log -->
            <maxHistory>3</maxHistory>

            <timeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>50MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
    </appender>

    <!-- 公共 appender - DB_POOL_LOG -->
    <appender name="DB_POOL_LOG"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <append>true</append>
        <!-- 日志路径 -->
        <file>${logBase}/db_pool.log</file>

        <encoder>
            <pattern>%date [%thread] %-5level %caller{2} %logger %msg%n</pattern>
            <charset class="java.nio.charset.Charset">UTF-8</charset>
        </encoder>

        <!-- 设置滚动策略 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 设置日志命名模式 -->
            <FileNamePattern>${logBase}/db_pool.log.%d{yyyy-MM-dd}.%i
            </FileNamePattern>
            <!-- 最多保留X天log -->
            <maxHistory>1</maxHistory>

            <timeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>50MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
    </appender>

    <!-- 业务 appender - EXECUTOR_MNG_CORE_LOGGER 执行器日志 -->
    <appender name="EXECUTOR_MNG_CORE_LOGGER"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <append>true</append>
        <!-- 日志路径 -->
        <file>${logBase}/metadataColl.log</file>

        <encoder>
            <pattern>%date [%thread] %-5level %caller{2} %logger %msg%n</pattern>
            <charset class="java.nio.charset.Charset">UTF-8</charset>
        </encoder>

        <!-- 设置滚动策略 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 设置日志命名模式 -->
            <FileNamePattern>${logBase}/api.log.%d{yyyy-MM-dd}.%i
            </FileNamePattern>
            <!-- 最多保留X天log -->
            <maxHistory>3</maxHistory>

            <timeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>50MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
    </appender>

    <!-- 业务 appender -  METADATACOLL_LOG 元数据采集接口日志 -->
    <appender name="METADATACOLL_LOG"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <append>true</append>
        <!-- 日志路径 -->
        <file>${logBase}/metadataColl.log</file>

        <encoder>
            <pattern>%date [%thread] %-5level %caller{2} %logger %msg%n</pattern>
            <charset class="java.nio.charset.Charset">UTF-8</charset>
        </encoder>

        <!-- 设置滚动策略 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 设置日志命名模式 -->
            <FileNamePattern>${logBase}/api.log.%d{yyyy-MM-dd}.%i
            </FileNamePattern>
            <!-- 最多保留X天log -->
            <maxHistory>3</maxHistory>

            <timeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>50MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
    </appender>

    <!-- 业务 appender - DATASERVICE_MNG_LOG-->
    <appender name="DATASERVICE_MNG_LOG"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <append>true</append>
        <!-- 日志路径 -->
        <file>${logBase}/dataService.log</file>

        <encoder>
            <pattern>%date [%thread] %-5level %caller{2} %logger %msg%n</pattern>
            <charset class="java.nio.charset.Charset">UTF-8</charset>
        </encoder>

        <!-- 设置滚动策略 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 设置日志命名模式 -->
            <FileNamePattern>${logBase}/dataService.log.%d{yyyy-MM-dd}.%i
            </FileNamePattern>
            <!-- 最多保留X天log -->
            <maxHistory>3</maxHistory>

            <timeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>50MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
    </appender>

    <!-- appender 定义区 -end- -->

    <!-- logger 定义区 -start- -->
    <!-- 公共 logger -->
    <logger name="com.xxxx" level="ERROR">
        <appender-ref ref="SSM_WEB_LOG"/>
    </logger>
    <logger name="com.xxxx.webmvc" level="ERROR">
        <appender-ref ref="SSM_WEB_LOG"/>
    </logger>
    <logger name="org.mybatis.spring.SqlSessionUtils" level="ERROR">
        <appender-ref ref="SSM_WEB_LOG"/>
    </logger>
    <logger name="test" level="ERROR">
        <appender-ref ref="SSM_WEB_LOG"/>
    </logger>
    <logger name="CORE_MNG">
        <level value="ERROR"/>
        <appender-ref ref="CODE_LOG"/>
        <appender-ref ref="FILE_ERROR"/>
    </logger>
    <logger name="API_MNG">
        <level value="ERROR"/>
        <appender-ref ref="API_LOG"/>
        <appender-ref ref="FILE_ERROR"/>
    </logger>
    <logger name="DB_POOL_MNG">
        <level value="ERROR"/>
        <appender-ref ref="DB_POOL_LOG"/>
        <appender-ref ref="FILE_ERROR"/>
    </logger>

    <!-- 业务 logger -->
    <logger name="METADATACOLL_MNG_FACADE">
        <level value="ERROR"/>
        <appender-ref ref="METADATACOLL_LOG"/>
        <appender-ref ref="FILE_ERROR"/>
    </logger>
    <logger name="DATASERVICE_MNG_CORE">
        <level value="ERROR"/>
        <appender-ref ref="DATASERVICE_MNG_LOG"/>
        <appender-ref ref="FILE_ERROR"/>
    </logger>
    
    <root level="INFO"> <!-- INFO / ERROR / ... -->
        <appender-ref ref="STDOUT" />
        <appender-ref ref="FILE_INFO" />
        <appender-ref ref="FILE_ERROR" />
    </root>
</configuration> 

step4 Maven:pom.xml 引入 slf4j、logback

  • pom.xml 引入 slf4j、logback

一般此类日志包,会被抽取出来,作为整个公司的公共基础工程包,而不是普通工程师自行引入。

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>jcl-over-slf4j</artifactId>
</dependency>
  • pom.xml 配置 maven构建工程时引入 配置资源文件(logback.xml / applicationContext.xml 等)
``` shell wydataeye src/main/conf ```

6 日志等级、输出日志的条件: 日志事件 VS 配置的日志等级

理解思路1

Event Level	LoggerConfig Level

TRACE	        DEBUG	INFO	WARN	ERROR	FATAL	OFF
ALL	        YES	YES	YES	YES	YES	YES	NO
TRACE	        YES	NO	NO	NO	NO	NO	NO
DEBUG	        YES	YES	NO	NO	NO	NO	NO
INFO	        YES	YES	YES	NO	NO	NO	NO
WARN	        YES	YES	YES	YES	NO	NO	NO
ERROR	        YES	YES	YES	YES	YES	NO	NO
FATAL	        YES	YES	YES	YES	YES	YES	NO
OFF	        NO	NO	NO	NO	NO	NO	NO

左边竖栏是Event Level,右边横栏是LoggerConfig Level。
YES的意思就是这个event可以通过filter,NO的意思就是不能通过filter。
可以看到:INFO级别的日志Event是无法被ERROR级别的LoggerConfig的filter接受的,所以,INFO信息不会被输出。

理解思路2

log4j定义了8个级别的log(除去OFF和ALL,可以说分为6个级别),优先级从高到低依次为:OFF、FATAL、ERROR、WARN、INFO、DEBUG、TRACE、 ALL。

ALL:最低等级的,用于打开所有日志记录。
TRACE: designates finer-grained informational events than the DEBUG.Since:1.2.12,很低的日志级别,一般不会使用。
DEBUG: 指出细粒度信息事件对调试应用程序是非常有帮助的,主要用于开发过程中打印一些运行信息。
INFO:  消息在粗粒度级别上突出强调应用程序的运行过程。打印一些你感兴趣的或者重要的信息,这个可以用于生产环境中输出程序运行的一些重要信息,但是不能滥用,避免打印      过多的日志。
WARN: 表明会出现潜在错误的情形,有些信息不是错误信息,但是也要给程序员的一些提示。
ERROR: 指出虽然发生错误事件,但仍然不影响系统的继续运行。打印错误和异常信息,如果不想输出太多的日志,可以使用这个级别。
FATAL: 指出每个严重的错误事件将会导致应用程序的退出。这个级别比较高了。重大错误,这种级别你可以直接停止程序了。
OFF: 最高等级的,用于关闭所有日志记录。

如果将log level设置在某一个级别上,那么比此级别优先级高的log都能打印出来。
例如,如果设置优先级为WARN,那么OFF、FATAL、ERROR、WARN 4个级别的log能正常输出,而INFO、DEBUG、TRACE、 ALL级别的log则会被忽略。
Log4j建议只使用四个级别,优先级从高到低分别是ERROR、WARN、INFO、DEBUG。

7 参考文献

posted @ 2020-06-04 14:38  千千寰宇  阅读(293)  评论(0编辑  收藏  举报