logback学习

日志系统是每个程序必然需要的基础设施,在学习 spring boot 的过程中,涉及到了 logback 库的使用,这里记录一下。
目前只是本地存储,后面应该需要搭建一个日志服务做集中管理。

SLF4J (Simple Logging Facade For Java),它是一个针对于各类Java日志框架的统一Facade抽象。
SLF4J定义了统一的日志抽象接口,而真正的日志实现则是在运行时决定。

日志级别有 TRACE < DEBUG < INFO < WARN < ERROR < OFF (output no logs)
Logback 配置文件 logback-spring.xml

Logback 是 log4j 框架的作者开发的新一代日志框架,它效率更高、能够适应诸多的运行环境,同时原生支持 SLF4J。
官网手册

默认情况下,Spring Boot会用 Logback 来记录日志,并用INFO级别输出到控制台。
在运行应用程序和其他例子时,你应该已经看到很多INFO级别的日志了。
bff73681.png
日志输出内容元素具体如下:
时间日期:精确到毫秒
日志级别:ERROR, WARN, INFO, DEBUG or TRACE
进程ID
分隔符:— 标识实际日志的开始
线程名:方括号括起来(可能会截断控制台输出)
Logger名:通常使用源代码的类名
日志内容

package chapters.introduction;

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

public class HelloWorld1 {

public static void main(String[] args) {

Logger logger = LoggerFactory.getLogger("chapters.introduction.HelloWorld1");
logger.debug("Hello world.");

}
}

输出

20:49:07.962 [main] DEBUG chapters.introduction.HelloWorld1 - Hello world.

没有配置的时候,会自动配置 ConsoleAppender 到日志的 root 节点,root 节点必须指定一个日志级别

查看 logback 的内部状态

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.core.util.StatusPrinter;

public class HelloWorld2 {

public static void main(String[] args) {
Logger logger = LoggerFactory.getLogger("chapters.introduction.HelloWorld2");
logger.debug("Hello world.");

// print internal state
LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
StatusPrinter.print(lc);
}
}

输出

12:49:22.203 [main] DEBUG chapters.introduction.HelloWorld2 - Hello world.
12:49:22,076 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.groovy]
12:49:22,078 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback-test.xml]
12:49:22,093 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.xml]
12:49:22,093 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Setting up default configuration.

配置文件

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<property name="APP_NAME" value="studySpringBoot"/>
<contextName>${APP_NAME}</contextName>
<include resource="org/springframework/boot/logging/logback/base.xml"/>
<jmxConfigurator/>

<!--<logger name="org.springframework.web" level="DEBUG"/>-->
<!--<logger name="com.springboot.in.action" level="TRACE"/>-->

<!--<logger name="org.apache.velocity.runtime.log" level="INFO"/>-->

<!-- logback为java中的包 -->
<logger name="com.tyler.study.controller" level="DEBUG"/>

<appender name="dailyRollingFileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>${user.home}/logs/${APP_NAME}</File>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- daily rolling over -->
<FileNamePattern>${APP_NAME}.%d{yyyy-MM-dd}.log</FileNamePattern>
<!-- keep 30 days' log history -->
<maxHistory>30</maxHistory>
<totalSizeCap>5GB</totalSizeCap>
</rollingPolicy>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
<encoder>
<Pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{35} - %msg %n</Pattern>
</encoder>
</appender>
<!--TRACE, DEBUG, INFO, WARN, ERROR-->
<root level="INFO">
<appender-ref ref="CONSOLE"/>
<!--<appender-ref ref="FILE"/>-->
<appender-ref ref="dailyRollingFileAppender"/>
</root>
</configuration>

根节点包含的属性
scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true.
scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟.
debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。

812698e6.png 设置变量 用来定义变量值的标签, 有两个属性,name和value;其中name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。

设置上下文名称
每个logger都关联到logger上下文,默认上下文名称为“default”。但可以使用设置成其他名字,用于区分不同应用程序的记录。一旦设置,不能修改。

用来设置某一个包或者具体的某一个类的日志打印级别、以及指定仅有一个name属性,一个可选的level和一个可选的additivity属性。

name:用来指定受此logger约束的某一个包或者具体的某一个类。
level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,还有一个特殊值INHERITED或者同义词NULL,代表强制执行上级的级别。
如果未设置此属性,那么当前logger将会继承上级的级别。
additivity:是否向上级logger传递打印信息。默认是true。
可以包含零个或多个元素,标识这个appender将会添加到这个logger。

也是元素,但是它是根logger。只有一个level属性,应为已经被命名为”root”.

level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,不能设置为INHERITED或者同义词NULL。默认是DEBUG。
可以包含零个或多个元素,标识这个appender将会添加到这个logger。

filter

ThresholdFilter

大于等于的会允许,小于的会拒绝

<configuration>
<appender name="CONSOLE"
class="ch.qos.logback.core.ConsoleAppender">
<!-- deny all events with a level below INFO, that is TRACE and DEBUG -->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<encoder>
<pattern>
%-4relative [%thread] %-5level %logger{30} - %msg%n
</pattern>
</encoder>
</appender>
<root level="DEBUG">
<appender-ref ref="CONSOLE" />
</root>
</configuration>

使用注意

logger.debug("Processing trade with id:[{}] and symbol : [{}] ", id, symbol)
反例(不要这么做):
logger.debug("Processing trade with id: " + id + " symbol: " + symbol);