logback官方文档
在实际项目开发中,日志框架是不可避免的。目前常用的日志框架包括log4j和logback等。
该文章将选取logback作为日志框架讲解。logback提供的日志功能主要有两个方面:
Logback 构建在三个主要的类上:Logger,Appender 和 Layout。这三个不同类型的组件一起作用能够让开发者根据消息的类型以及日志的级别来打印日志。
Logger作为日志的记录器,把它关联到应用的对应的context后,主要用于存放日志对象,也可以定义日志类型、级别。各个logger 都被关联到一个 LoggerContext,LoggerContext负责制造logger,也负责以树结构排列各 logger。
Appender主要用于指定日志输出的目的地,,目的地可以是控制台、文件、远程套接字服务器、 MySQL、PostreSQL、 Oracle和其他数据库、 JMS和远程UNIX Syslog守护进程等。
Layout 负责把事件转换成字符串,输出格式化的日志信息。
/**
* 日志logger以树状形式来组织
* 以.作为前缀分隔符,
*/
public static void testLoggerTree(){
java.util.logging.Logger logger1= java.util.logging.Logger.getLogger("x");
java.util.logging.Logger logger2= java.util.logging.Logger.getLogger("x.y");
java.util.logging.Logger logger3= java.util.logging.Logger.getLogger("x.y.z");
//查询日志1,2,3的父级日志
//x.y
System.out.println(logger3.getParent().getName());
//x
System.out.println(logger2.getParent().getName());
//"",其父级日志是java.util.logging.LogManager$RootLogger
//根据层级关系,所有的日志的顶层parent均是java.util.logging.LogManager$RootLogger
System.out.println(logger1.getParent().getName());
}
Logback框架分为5个日志级别,TRACE < DEBUG < INFO < WARN < ERROR。框架会根据设定的不同日志级别打印出不同的日志信息。
在未设置日志级别的情况下,会继承日志层级关系最靠近的那个日志级别。
日志名称 | 设置的日志级别 | 生效的日志级别 |
---|---|---|
root | DEBUG | DEBUG |
X | none | DEBUG |
X.Y | none | DEBUG |
X.Y.Z | none | DEBUG |
root日志下的子日志包括X,X.Y,X.Y.Z,在所有的子日志均未设置日志级别情形下,将继承顶级root的日志级别DEBUG
日志打印生效的核心原则是 日志请求级别大于等于设定的日志logger的级别
public class Mylogger {
public static void main(String[] args) {
//logger类型为ch.qos.logback.classic.Logger;
Logger logger= (Logger) LoggerFactory.getLogger("com.logger");
//TRACE < DEBUG < INFO < WARN < ERROR
//设置日志级别 类型为ch.qos.logback.classic.Logger
logger.setLevel(Level.INFO);
//DEBUG
logger.debug("debug ing");
//等于 14:34:36.561 [main] INFO com.logger - info ing
logger.info("info ing");
//大于 14:34:36.564 [main] WARN com.logger - warn ing
logger.warn("warn ing");
}
logback初始化流程
最后一步的目的是为了保证在所有的配置文件都没有被找到的情况下,提供一个默认的配置。
/**
* Logger的初始化过程
*/
public static void testLogInit(){
//获得日志的上线文
LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
//打印内部状态
StatusPrinter.print(context);
}
【整合SpringBoot项目进行说明】
1 相关依赖
<dependencies>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
dependencies>
2 logback-base.xml 【用于配置logger基础信息】
<included>
<contextName>logbackcontextName>
<property name="log.path" value="d:\\logs" />
<conversionRule
conversionWord="clr"
converterClass="org.springframework.boot.logging.logback.ColorConverter" />
<conversionRule
conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
<conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
<property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
<appender name="LOG_CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<Pattern>${CONSOLE_LOG_PATTERN}Pattern>
<charset>UTF-8charset>
encoder>
appender>
<appender name="LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/logback.logfile>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
<charset>UTF-8charset>
encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/info/log-info-%d{yyyy-MM-dd}.%i.logfileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MBmaxFileSize>
timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>15maxHistory>
rollingPolicy>
appender>
included>
3 logback-spring.xml 【根据环境配置】
<configuration>
<include resource="logback-base.xml" />
<springProfile name="dev">
<logger name="com.controller" additivity="false" level="debug">
<appender-ref ref="LOG_CONSOLE"/>
logger>
springProfile>
<springProfile name="pro">
<logger name="com.controller" additivity="false" level="info">
<appender-ref ref="LOG_FILE"/>
logger>
springProfile>
<root level="info">
<appender-ref ref="LOG_CONSOLE" />
<appender-ref ref="LOG_FILE" />
root>
configuration>
4 测试类
@RestController
@RequestMapping("/user")
public class UserController {
//类路径为com.controller.UserController
//继承com.controller下的logger属性 所以Logger的级别为DEBUG
Logger logger = LoggerFactory.getLogger(UserController.class);
@GetMapping("/get")
public String get(){
//TRACE
logger.trace("trace...");
//打印输出
logger.debug("debug...");
//打印输出
logger.info("info...");
//打印输出
logger.warn("warn...");
//打印输出
logger.error("error...");
return "OK";
}
}