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所示的界面
从图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所示。
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配置对日志进行输出。
- 控制台输出日志
接下来,我们改造一下日志文件格式。首先在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。
- 彩色日志输出
启动项目后,可以看到日志有对应输出,但是日志并没有颜色。接下来我们修改一下配置文件,如代码清单6-6所示。 - 在这里需要配置几个Logback提供的彩色日志类,并使用这些对日志进行修饰。这次配置有一个不同点是,Logback配置文件可以使用property标签自定义属性,然后在下面使用${property属性name值}。在完成上述配置后,再次启动日志就可以看到彩色日志了。
- 日志文件输出
控制台输出日志的形式一般只有开发环境这样使用,一般来说,生产环境需要将日志输出到日志文件进行日志分析,并且会将日志根据级别输出到不同日志文件中。同时,如果日志文件太大,就可以设置日志文件根据大小分隔,如代码清单6-7所示。 - 在上述配置中包含很多新标签,分别说明如下。
· file:日志文件位置。
· maxFileSize:设置最大日志文件大小。
· maxHistory:只保留最近30天的日志,防止日志过多占用磁盘。
· fileNamePattern:指定精确到分的日志切分方式。
· filter:标签中的level设置日志级别
- 输出指定包文件日志
Logback可以指定输出某个包下的类的日志,这种方式比较简单,只需要指定包路径及日志级别即可,如代码清单6-8所示。
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