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 参考文献

最新文章

  1. er3
  2. queen8
  3. 第四章 使用Docker镜像和仓库
  4. 【五子棋AI循序渐进】——多线程搜索
  5. C语言 二级指针内存模型混合实战
  6. CodeForces - 416A (判断大于小于等于 模拟题)
  7. C语言调试的几种方法
  8. C#, float.ToString()的一个坑
  9. OpenCV中的常用函数
  10. [Angular 2] Dispatching Action with Payloads and type to Reducers
  11. Storm官方帮助手册翻译(下)
  12. Java web servers 间是如何实现 session 同步的
  13. The Lisp Curse /Lisp魔咒
  14. (copy)赋值构造函数的4种调用时机or方法
  15. Java创建柱状图及饼状图
  16. hadoop streaming 中跑python程序,自定义模块的导入
  17. Selenium+Java自动化之如何优雅绕过验证码
  18. C#获取程序启动目录
  19. 用不上索引的SQL语句
  20. SWIFT推送之本地推送(UILocalNotification)之二带按钮的消息

热门文章

  1. lgb文档学习
  2. 实验一 Linux系统与应用课程准备
  3. python+基本3D显示
  4. Windows使用技巧(持续更新)
  5. greenDao基础用法(一)
  6. linux shell 目录
  7. python C# DES 加密转换
  8. 【内存管理】ION内存管理器浅析(system heap)(基于linux 4.14)
  9. SAP B1 增加或删除单据,或者是新增修改BOM清单,报错‘出现内部错误时’,一般是控制过程 SBO_SP_TransactionNotification 里面的代码有问题,执行不下去了,因此一行行检查SQL代码,一般就能发现错误所在。
  10. 微信支付服务商api对接