这是本节的多页打印视图。 点击此处打印.

返回本页常规视图.

日志

所有开发者的好基友,一个成熟的系统离不开日志系统的建设,这里将介绍下如何配置日志、使用日志

1 - 1.日志管理之默认配置

对于一个后端来说,日志是不可缺少的,这个东西,形象点就像剑客手中的剑,没有剑你就刷不了帅,砍不了人。所以就有必要好好的说道说道,这个日志文件的管理了。本篇博文将关注以下几点内容

  • 日志级别选择
  • 日志输出到文件
  • 格式化输出
  • 日志文件管理(自动删除,压缩归档等)
  • 常用的logback-spring.xml配置

I. 默认日志参数

1. 基础项目搭建

创建一个SpringBoot项目,根据官方文档的说明,默认选择的是Logback来记录日志;logback也是相对来说用的比较多的框架了,下文全都默认以logback作为日志输出框架

By default, if you use the “Starters”, Logback is used for logging. Appropriate Logback routing is also included to ensure that dependent libraries that use Java Util Logging, Commons Logging, Log4J, or SLF4J all work correctly.

完整的pom依赖如下,即不需要引入什么特别的依赖,基本上就是SpringBoot项目最根本的项目结构

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.4.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
    <java.version>1.8</java.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
</dependencies>

<build>
    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </pluginManagement>
</build>

<repositories>
    <repository>
        <id>spring-milestones</id>
        <name>Spring Milestones</name>
        <url>https://repo.spring.io/milestone</url>
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
    </repository>
</repositories>

写一个简单的日志测试

@Slf4j
@SpringBootApplication
public class Application {

    public Application() {
        log.debug("---> debug start! <------");
        log.info("---> info start! <------");
        log.warn("---> warn start! <------");
        log.error("---> error start! <------");

        System.out.println("===> System.out.println <=====");
    }

    public static void main(String[] args) {
        SpringApplication.run(Application.class);
    }
}

看下控制台输出结果,info,warn,error可以正常输出且输出格式包含一些附加信息,System.out也可以正常输出,debug的日志没有

2018-09-26 14:16:01.136  INFO 38924 --- [           main] com.git.hui.boot.log.Application         : ---> info start! <------
2018-09-26 14:16:01.137  WARN 38924 --- [           main] com.git.hui.boot.log.Application         : ---> warn start! <------
2018-09-26 14:16:01.137 ERROR 38924 --- [           main] com.git.hui.boot.log.Application         : ---> error start! <------
===> System.out.println <=====

2. 配置说明

接下来在进入logback的配置文件之前,先看一下默认的配置有哪些,以及如何使用

a. debug日志支持

默认是不输出debug日志的,如果需要,则需要在配置文件中添加 debug=true 属性;同样可以设置trace=true,就可以看应用输出的trace日志

然而,即便开启了debug,上面测试中的debug日志也依然没有,那需要输出上面的debug日志,应该怎么设置?

b. log levels

上面的配置虽然在控制台打印了一些debug日志,但并没有打印我们业务代码中的debug日志,需要开启这个,需要如下设置

logging.level.root=DEBUG
logging.level.org.springframework=INFO
logging.level.org.hibernate=ERROR

上面这个配置就是指定包下日志输出的等级,root表示默认的级别

如上配置后,再次执行上面的代码,输出结果如下

log level测试

c. 输出格式

默认的输出格式如前面的截图,如果希望更改下输出的日志格式,可以通过修改属性来完成,一个也实例如下

logging.pattern.console=%date{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n

再次执行,输出样式如下

输出格式

至于这个属性值的构成原则,在后面说到logback.xml配置文件语法时,一并再说

说明

还有个参数可以设置文本的颜色,个人感觉实用性不是特别大,只贴下配置如下

## 检测终端是否支持ANSI,是的话就采用彩色输出
spring.output.ansi.enabled=detect
## %clr(){} 格式,使文本以蓝色输出
logging.pattern.console=%clr(%d{yyyy-MM-dd HH:mm:ss.SSS} %thread] %-5level %logger{36} - %msg%n){blue}

d. 输出文件

上面所有的日志都是输出到控制台,在实际的生成环境中,一般要求日志写到文件,可以方便随时进行查看,通过设置相关参数也可以很简单实现

## 输出的日志文件
logging.file=logs/info.log
## 当文件超过1G时,归档压缩
logging.file.max-size=1GB
## 日志文件最多保存3天
logging.file.max-history=3

同样执行前面的代码两次,输出如下, 两次的输出结果都可以在日志文件中查到,相比较于控制台而言,用于查历史日志就更加的方便了

输出文件演示

上图中,控制台的输出格式和日志文件的输出格式不一样,因为前面修改了控制台的输出样式;如果希望修改文件中的日志格式,也可以通过修改配置logging.pattern.file来实现

e. logback.xml配置

上面的配置虽然ok,但是对于Logback而言,还是有很多高级特性不太好配置,因此SpringBoot还是支持通过加载logback-spring.xml配置文件来定义日志相关的参数,只需要在资源文件目录下添加 logback-spring.xml 或者 logging.config 即可

II. 其他

相关文档

0. 项目

2 - 2.日志管理之logback配置文件

SpringBoot默认选用logback进行日志管理,前一篇讲述了默认配置日志的参数,然而这些内容比较初级,并不一定能满足我们更加特殊的需求(比如输出到多个不同的配置文件,不同的包路劲选择不同的输出方式等)

所以本篇的内容,主要介绍logback.xml配置文件的语法,虽然与SpringBoot本身没有太多的关联性,但在SpringBoot项目中却非常实用

I. logback配置

也不针对语法进行逐一说明了,直接针对常见的xml配置文件进行分析,反正看完也会忘的,等到要用的时候,一般都是拷贝一个魔板,改改名啥的就over了

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!-- %m输出的信息,%p日志级别,%t线程名,%d日期,%c类的全名,%i索引【从数字0开始递增】,,, -->
    <!-- appender是configuration的子节点,是负责写日志的组件。 -->
    <!-- ConsoleAppender:把日志输出到控制台 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d [%t] %-5level %logger{36}.%M\(%file:%line\) - %msg%n</pattern>
            <!-- 控制台也要使用UTF-8,不要使用GBK,否则会中文乱码 -->
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!-- RollingFileAppender:滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件 -->
    <!-- 以下的大概意思是:1.先按日期存日志,日期变了,将前一天的日志文件名重命名为XXX%日期%索引,新的日志仍然是demo.log -->
    <!--             2.如果日期没有发生变化,但是当前日志的文件大小超过1KB时,对当前日志进行分割 重命名-->
    <appender name="story" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--如果只是想要 Error 级别的日志,那么需要过滤一下,默认是 info 级别的,ThresholdFilter-->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>
        <File>logs/story.log</File>
        <!-- rollingPolicy:当发生滚动时,决定 RollingFileAppender 的行为,涉及文件移动和重命名。 -->
        <!-- TimeBasedRollingPolicy: 最常用的滚动策略,它根据时间来制定滚动策略,既负责滚动也负责出发滚动 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 活动文件的名字会根据fileNamePattern的值,每隔一段时间改变一次 -->
            <!-- 文件名:log/demo.2018-06-23.0.log -->
            <fileNamePattern>logs/arch/story.%d.%i.log</fileNamePattern>
            <!-- 每产生一个日志文件,该日志文件的保存期限为3天 -->
            <maxHistory>3</maxHistory>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <!-- maxFileSize:这是活动文件的大小,默认值是10MB,测试时可改成1KB看效果 -->
                <maxFileSize>10MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <encoder>
            <!-- pattern节点,用来设置日志的输入格式 -->
            <pattern>
                %d %p (%file:%line\)- %m%n
            </pattern>
            <!-- 记录日志的编码:此处设置字符集 - -->
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!-- 指定项目中某个包,当有日志操作行为时的日志记录级别 -->
    <!-- 级别依次为【从高到低】:FATAL > ERROR > WARN > INFO > DEBUG > TRACE  -->
    <!-- additivity=false 表示匹配之后,不再继续传递给其他的logger-->
    <logger name="com.git.hui" level="DEBUG" additivity="false">
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="story"/>
    </logger>

    <logger name="com.github.hui" level="DEBUG" additivity="false">
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="story"/>
    </logger>

    <!-- 控制台输出日志级别 -->
    <root level="INFO">
        <appender-ref ref="STDOUT"/>
    </root>
</configuration>

1. appender

从前面的配置文件中,appender这个标签算是比较重要的,上面定义了两类,一个控制台输出,一个文件输出

a. 控制台or文件的选择

appender的class属性来选择

  • 控制台: ch.qos.logback.core.ConsoleAppender
  • 滚动时间窗口文件:ch.qos.logback.core.rolling.RollingFileAppender

b. 输出格式

以实例 <pattern>%d [%t] %-5level %logger{36}.%M\(%file:%line\) - %msg%n</pattern> 进行说明

{% blockquote 官网翻译@一灰灰Blog https://logback.qos.ch/manual/layouts.html%}

  • %m输出的信息,
  • %p日志级别,
  • %t线程名,
  • %d日期,
  • %c类的全名,
  • %i索引【从数字0开始递增】
  • %M方法名
  • %lines输出日志的行数
  • %F/%file源码文件名

{% endblockquote %}

c. 日志归档相关

一般是每天归档一下日志文件,避免所有的日志都堆积到一个文件,当单文件特别大时,分析也不是一件容易的事情,常见的两个设置参数

<!-- 日志文件最多保存三天 -->
<maxHistory>3</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
    <!-- maxFileSize:这是活动文件的大小,默认值是10MB,测试时可改成1KB看效果 -->
    <maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>

2. logger

另外一个标签就是logger了,name表示哪些包路径下的日志输出会匹配这个(或者logger直接使用了这个name,也会匹配他)

另外两个重要的属性,level表示输出日志的级别,挺实用的,可以根据实际场景设置某些日志输出,如框架层我只关系WARN级别日志;我自己的业务可能就像关注INFO的日志了

additivity 这个属性,很容易不设置,如果不设置,那么当一个日志输出,有多个logger匹配时,这个日志就会被输出多次,建议设置为false

II. 使用

根据前面配置的博文说明,logback.xml配置文件,推荐的用法是

  • 命名为 logback-spring.xml
  • 放在资源文件的根目录,或者config目录下

一般输出日志的用法,最常见的两种方式

// 创建LOGGER对象
private static final Logger LOGGER = LoggerFactory.getLogger(SelfBeanLoader.class);

// 输出日志的地方
LOGGER.info("info: {}", xxxx);

第二中就是使用lombok的 @Slf4j 注解

@Slf4j
public class SelfBeanLoader {
  ...
  // 输出日志的地方
  log.info("xxx");
}

III. 其他

0. 项目

推荐相关博文阅读