[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
<?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 参考文献
[J2EE:中间件]Slf4J+Logback快速入门的更多相关文章
- Logback 快速入门 / 使用详解
官方文档: http://logback.qos.ch/manual/index.html 一.简介 Java 开源日志框架,以继承改善 log4j 为目的而生,是 log4j 创始人 Ceki Gü ...
- 使用 SLF4J + LogBack 构建日志系统(转)
转载自:http://www.cnblogs.com/mailingfeng/p/3499436.html 上次我们讨论了如何选择一个好的开源日志系统方案,其中的结论是:使用 SLF4J + LogB ...
- 开源分布式中间件 DBLE 快速入门指南
GitHub:https://github.com/actiontech/dble 官方中文文档:https://actiontech.github.io/dble-docs-cn/ 一.环境准备 D ...
- 一文快速入门分库分表中间件 Sharding-JDBC (必修课)
书接上文 <一文快速入门分库分表(必修课)>,这篇拖了好长的时间,本来计划在一周前就该写完的,结果家庭内部突然人事调整,领导层进行权利交接,随之宣布我正式当爹,紧接着家庭地位滑落至第三名, ...
- 在項目中快速部署SLF4J+LOGBACK
想了解SLF4J,LOGBACK是什么?可以访问:http://www.slf4j.org/ http://logback.qos.ch/ 本文大部分参考了Cody Burleson<Ho ...
- JAVA WEB快速入门之从编写一个基于SpringBoot+Mybatis快速创建的REST API项目了解SpringBoot、SpringMVC REST API、Mybatis等相关知识
JAVA WEB快速入门系列之前的相关文章如下:(文章全部本人[梦在旅途原创],文中内容可能部份图片.代码参照网上资源) 第一篇:JAVA WEB快速入门之环境搭建 第二篇:JAVA WEB快速入门之 ...
- Elastic 技术栈之快速入门
Elastic 技术栈之快速入门 概念 ELK 是什么 ELK 是 elastic 公司旗下三款产品 ElasticSearch .Logstash .Kibana 的首字母组合. ElasticSe ...
- spring boot入门教程——Spring Boot快速入门指南
Spring Boot已成为当今最流行的微服务开发框架,本文是如何使用Spring Boot快速开始Web微服务开发的指南,我们将使创建一个可运行的包含内嵌Web容器(默认使用的是Tomcat)的可运 ...
- 零基础快速入门SpringBoot2.0教程 (三)
一.SpringBoot Starter讲解 简介:介绍什么是SpringBoot Starter和主要作用 1.官网地址:https://docs.spring.io/spring-boot/doc ...
- Springboot 完整搭建快速入门,必看!
前言 手把手教你Springboot微服务项目搭建快速入门,通过本文学习Springboot的搭建快速入门,掌握微服务大致的配置服务,后续将会继续将核心组件引入到项目中,欢迎关注,点赞,转发. Spr ...
随机推荐
- 主要的原型设计工具 :Axure RP
一. Axure RP简介: Axure RP 能帮助网站需求设计者,快捷而简便的创建基于网站构架图的带注释页面示意图.操作流程图.以及交互设计,并可自动生成用于演示的网页文件和规格文件,以提供演示与 ...
- 3DMAX2023卸载方法,如何完全彻底卸载删除清理干净3dmax各种残留注册表和文件?【转载】
3dmax2023卸载重新安装方法,使用清理卸载工具箱完全彻底删除干净3dmax2023各种残留注册表和文件.3dmax2023显示已安装或者报错出现提示安装未完成某些产品无法安装的问题,怎么完全彻底 ...
- swoft-个基于 Swoole 原生协程的PHP 微服务框架
刚才百度了一下swoft框架,官网打不开了,仓库也暂停了.不由感慨.曾经和同事踩了许多坑使用此极其小众的框架完成微服务项目.使用它的唯一目的就是提高程序性能(底层使用了协程),为此大家都学习了很多新知 ...
- Mongodb+Stadio 3
一.安装Mongodb https://www.mongodb.com/download-center/community 请下载对应的系统 安装过程请不要选择 当所有的步骤值完成的时候,找到你的安 ...
- filter CTF
filter CTF 输入url http://dc1ce3ad-eed4-48fd-a068-71aef12f7654.node.vaala.ink?file=demo.php 参考题目filter ...
- nodejs 利用URL和querystring获取get查询参数
为深入理解request的get url信息及参数传递,利用URL和querystring获取对应的信息,测试成功,记录如下: 1.编写server.js文件 http=require("h ...
- 自定义配置Springboot内嵌的tomcat
两种方法都可以:例子:在tomcat里添加MIME类型,application/wasm 1. import org.springframework.boot.web.embedded.tomcat. ...
- C++生成均匀分布的随机实数
#include<random> #include<iostream> int main() { //定义均匀分布对象,均匀分布区间(a,b)为(2,6) std::unifo ...
- 【VUE】关于pinia代替vuex
官方文档:https://pinia.web3doc.top/ 知乎讲解:https://zhuanlan.zhihu.com/p/533233367
- linux环境变量配置错误后命令无法使用解决方案
环境变量配置时多复制了一个空格,导致执行source /etc/profile后提示错误,无法编辑和查看文件 解决方案: 查看当前系统变量:echo $PATH 临时修改:export PATH=/u ...