6.1 Logback日志

在Spring Boot框架中,默认使用的是Logback日志。接下来我们看一下Spring Boot是如何使用日志的。

6.1.1 Logback简介

Logback日志框架(官网地址:https://logback.qos.ch/)是由Log4j创始人开发的另一套开源日志组件。Logback的体系非常强大,提供了3个模块供开发者使用。

· logback-core:属于Logback的基础模块,是其他两个模块的基础。

· logback-classic:可以看作Log4j的改进版本,同时logback-classic自身实现了SLF4J API,使开发者可以在Logback框架与其他日志框架(如Log4j或java.util.logging)之间自由切换。

· logback-access:与Servlet容器(如Tomcat和Jetty)集成,以提供HTTP访问日志功能。

当然,Logback支持开发者基于logback-core模块构建自定义模块。

6.1.2 日志格式

Spring Boot项目启动后,默认可以看到如图6-1所示的界面

Spring Boot logback 日志过期删除 springboot日志模块_日志输出

从图6-1中可以看到,Spring的Logo部分是Spring Boot框架自带的,我们只观察日志部分。日志大致分为如下格式。

· 时间日期:显示日志打印时间,精确到毫秒。

· 日志级别:日志级别分为FATAL、ERROR、WARN、INFO、DEBUG、TRACE。

· 进程ID:进程ID指的是当前应用对应的PID。

· 分隔符:分隔符用于区分实际日志消息的开始。

· 线程名称:括在方括号中(可能会截断控制台输出)。

· 记录器名称:一般使用类名。

· 日志内容:日志输出的具体内容。

6.1.3 控制台输出

在Spring Boot默认应用日志配置中,会将日志默认输出到控制台中。在默认情况下,只会记录ERROR-level、WARN-level和INFO-level级别的日志消息。当然,也可以指定日志级别进行日志输出,如果指定了日志级别,那么只会对应输出高于指定级别的日志信息。当然,Spring Boot默认为我们提供了调试模式(建议在开发过程中开启),启动调试模式有如下两种方式。

· 启动JAR模式:在启动JAR的时候通过使用–debug标志启动应用程序调试模式,如代码清单6-1所示。

代码清单6-1 Logback项目jar方式启动应用

java -jar myapp.jar --debug

· 在配置文件中的配置:在application.properties或者application.yml中配置属性debug=true。

同时,默认日志提供彩色日志输出,如果终端支持ANSI,那么在默认设置下,TRACE、DEBUG和INFO级别为绿色,WARN级别为黄色,ERROR和FATAL级别为红色。

6.1.4 日志文件输出

默认情况下,Spring Boot只会将日志消息打印到控制台,并不会将日志写入日志文件。但是在实际项目中,一定会需要日志文件来分析程序。其实在Spring Boot工程中,想要输出控制台之外的日志文件很简单,只需要在application.properties文件或application.yml文件内设置logging.file或logging.path属性即可。

· logging.file :设置日志文件,这里可以设置文件的绝对路径,也可以设置文件的相对路径,具体可以根据情况设置,如logging.file=test.log。

· logging.path :设置日志目录,在设置好目录后,会在设置目录文件夹下创建一个spring.log,如设置logging.path=/Users/dalaoyang。

上述两个属性中,如果只设置一个,那么Spring Boot应用会默认读取该配置;如果同时设置,那么只有logging.file会生效。

Spring Boot应用日志文件输出与控制台输入内容一致,在日志文件达到10MB的时候会自动分隔日志文件,默认情况下会记录ERROR-level、WARN-level和INFO-level消息。当然,日志文件可以通过设置logging.file.max-size属性更改大小限制,并非无法更改。

6.1.5 日志级别

所有受支持的日志记录系统都可以通过使用TRACE、DEBUG、INFO、WARN、ERROR、FATAL或OFF之一来在Spring中设置记录器级别,如下面几种格式。

· logging.level.root = WARN:root日志以WARN级别输出消息。

· logging.level.com.dalaoyang = DEBUG:com.dalaoyang包下的类以DEBUG级别输出。

另外,也可以设置日志组来批量设置日志级别,比如设定com.dalaoyang.controller和com.dalaoyang.service为同一组(包与包之间用英文格式的逗号分隔),如代码清单6-2所示。

代码清单6-2 Logback项目配置日志组

logging.group.dalaoyang =com.dalaoyang.controller,com.dalaoyang.service

然后,设置dalaoyang组日志级别为TRACE,如代码清单6-3所示。

代码清单6-3 Logback项目配置日志组日志级别

logging.level.dalaoyang = TRACE

Spring Boot默认提供两个日志组,如代码清单6-4所示。

Spring Boot logback 日志过期删除 springboot日志模块_日志文件_02

6.1.6 日志配置

除了上面介绍的配置属性外,其实还有很多属性供我们使用,例如:

· logging.exception-conversion-word:记录异常时使用的转换字。

· logging.file:设置日志文件。

· logging.file.max-size:最大日志文件大小。

· logging.config:日志配置。

· logging.file.max-history:最大归档文件数量。

· logging.path:日志文件目录。

· logging.pattern.console:在控制台输出的日志模式。

· logging.pattern.dateformat:日志格式内的日期格式。

· logging.pattern.file:默认使用日志模式。

· logging.pattern.level:日志级别。

· PID:当前进程ID。

6.1.7 基于XML配置日志

Spring Boot默认支持通过XML配置自定义日志格式及输出,并且在ApplicationContext创建前就已经进行了初始化。在Spring Boot默认使用的Logback中,可以通过在src/mian/resources文件夹下定义logback.xml或logback-spring.xml作为日志配置。

不过Spring Boot官方推荐优先使用带有-spring的文件名作为你的日志配置(如使用logback-spring.xml,而不是logback.xml),因为如果命名为logback-spring.xml日志配置,就可以在日志输出的时候引入一些Spring Boot特有的配置项。当然,也支持自定义日志配置,比如在application.properties或application.yml中配置logging.config=classpath:logback- config.xml,就会读取logback-config.xml配置对日志进行输出。

  1. 控制台输出日志
    接下来,我们改造一下日志文件格式。首先在src/mian/resources目录下创建一个logback-spring.xml,这里以输出到控制台为例,可以在配置文件中设置如下内容,如代码清单6-5所示

    在上述pattern标签中的内容都对应日志相关的信息,分别如下。

· %date:日志输出时间,也可以使用%d来表示,同时可以用{yyyy-MM-dd HH:mm:ss.SSS}的形式对日志的输出时间进行格式化。

· %thread:输出日志的进程名字。

· %-5level:日志级别,并且使用5个字符靠左对齐,也可以使用%p输出日志级别。

· %logger{80}:日志输出者的名字。

· %msg:日志消息。

· %n:平台的换行符。

· %c:用来在日志上输出类的全名。

这里需要注意,将编码格式设置为UTF-8,避免中文乱码。

在root标签内设置日志级别,效果等同于在配置文件中设置logging.pattern.level。

  1. 彩色日志输出
    启动项目后,可以看到日志有对应输出,但是日志并没有颜色。接下来我们修改一下配置文件,如代码清单6-6所示。
  2. Spring Boot logback 日志过期删除 springboot日志模块_日志文件_03

  3. 在这里需要配置几个Logback提供的彩色日志类,并使用这些对日志进行修饰。这次配置有一个不同点是,Logback配置文件可以使用property标签自定义属性,然后在下面使用${property属性name值}。在完成上述配置后,再次启动日志就可以看到彩色日志了。
  4. 日志文件输出
    控制台输出日志的形式一般只有开发环境这样使用,一般来说,生产环境需要将日志输出到日志文件进行日志分析,并且会将日志根据级别输出到不同日志文件中。同时,如果日志文件太大,就可以设置日志文件根据大小分隔,如代码清单6-7所示。
  5. Spring Boot logback 日志过期删除 springboot日志模块_日志输出_04

  6. 在上述配置中包含很多新标签,分别说明如下。

· file:日志文件位置。

· maxFileSize:设置最大日志文件大小。

· maxHistory:只保留最近30天的日志,防止日志过多占用磁盘。

· fileNamePattern:指定精确到分的日志切分方式。

· filter:标签中的level设置日志级别

  1. 输出指定包文件日志
    Logback可以指定输出某个包下的类的日志,这种方式比较简单,只需要指定包路径及日志级别即可,如代码清单6-8所示。

Spring Boot logback 日志过期删除 springboot日志模块_spring_05

Spring Boot使用Logback日志大致就这几种形式。当然,可以根据具体项目更加细化地配置日志文件,这里不再更多地描述了,毕竟实际业务场景不同,配置的方法也不同

6.2 Log4j日志

Log4j是笔者第一个接触的日志框架,截至目前还有很多工程使用这个日志框架。接下来我们学习一下Spring Boot如何使用Log4j日志。

6.2.1 Log4j简介

Log4j日志(官网地址:http://logging.apache.org/log4j/1.2/)是一个使用Java编写的日志框架,由Apache Software Foundation的一个专门的Committers团队开发。

Log4j虽然是一个使用Java开发的框架,但是它同样支持很多编程语言使用,如C、C++、.Net、PL/SQL。

6.2.2 Spring Boot使用Log4j

虽然现在已经不推荐使用Log4j了,但是这里还是简单介绍一下Spring Boot如何使用Log4j框架。在6.1节我们了解到Spring Boot默认引用Logback日志,这里需要在pom文件中移除spring-boot-starter-logging依赖,并加入Log4j依赖,如代码清单6-9所示。

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j</artifactId>
            <version>1.3.2.RELEASE</version>
            <type>pom</type>
        </dependency>

6.2.3 控制台输出

在使用Log4j的时候,默认会读取src/main/resources下的log4j.properties文件。其实道理和配置Logback类似,先进行输出到控制台的配置,如代码清单6-10所示。

log4j.rootLogger=debug,CONSOLE,FILE

##输出到控制台
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.Threshold=DEBUG
log4j.appender.CONSOLE.layout.ConversionPattern=%d{yyyy-MM-dd HH\:mm\:ss} -%-4r [%t] %-5p  %x - %m%n
log4j.appender.CONSOLE.Target=System.out
log4j.appender.CONSOLE.Encoding=gbk
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout

上述配置大致包含如下内容。

· log4j.appender.CONSOLE:控制台日志输出类。

· log4j.appender.CONSOLE.Threshold:日志级别。

· log4j.appender.CONSOLE.layout.ConversionPattern:日志输出信息格式。

· log4j.appender.CONSOLE.Target:使用System.error作为输出。

· log4j.appender.CONSOLE.Encoding:日志编码格式。

· log4j.appender.CONSOLE.layout:设置输出样式。

在日志输出格式中可以使用如下自定义样式进行配置。

· %c:输出所属的类目,通常就是所在类的全名。

· %C:输出Logger所在类的名称,通常就是所在类的全名。

· %d:输出日志时间点的日期或时间,默认格式为ISO8601,与Logback一致,可以格式化日期格式,比如%d{yyy MMM dd HH:mm:ss}。

· %F:输出所在类的类名称,只有类名。

· %l:输出语句所在的行数,包括类名、方法名、文件名、行数。

· %L:输出语句所在的行数。

· %m:输出代码中指定的信息,如log(message)中的message。

· %M:输出方法名。

· %p:输出日志级别,即DEBUG、INFO、WARN、ERROR、FATAL。

· %r:输出自应用启动到输出该Log信息耗费的毫秒数。

· %t:输出产生该日志事件的线程名。

· %n:输出一个回车换行符,Windows平台为“/r/n”,UNIX平台为“/n”。

· %%:用来输出百分号“%”。

6.2.4 日志文件输出

如果需要使用日志输出,就需要对配置文件新增如下配置,如代码清单6-11所示。

##输出到日志文件 每10M分成一个日志文件
log4j.appender.FILE=org.apache.log4j.DailyRollingFileAppender
log4j.appender.FILE.File=/Users/dalaoyang/Downloads/log
log4j.appender.FILE.DatePattern = '_'yyyy-MM-dd-HH-mm'.log'
log4j.appender.FILE.MaxFileSize=10MB
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=%d%n%m%n

上述配置大致包含如下内容:

· log4j.appender.FILE:日志文件输出类。

· log4j.appender.FILE.File:日志文件输出路径。

· log4j.appender.FILE.DatePattern:日志文件后缀格式。

· log4j.appender.FILE.MaxFileSize:日志文件输出大小。

· log4j.appender.FILE.layout:设置输出样式。

· log4j.appender.FILE.layout.ConversionPattern:日志输出信息格式。

到这里,已经配置完成了。感兴趣的读者可以自己配置看看。Log4j官网上已经不推荐使用Log4j框架,而推荐使用拥有更好性能的Log4j 2框架,所以这里稍作了解即可。

Spring Boot使用Log4j源码下载:
百度网盘链接:https://pan.baidu.com/s/1DkvaDjVsMk0Osu2RZ4AYVg
提取码:lor