26. Logging

26. Logging

使用spring-boot-starter或者spring-boot-starter-logging引入日志。

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

Spring BootJULLOG4J2Logback提供了默认配置

默认情况下,当你引入spring-boot-starter,默认会使用SLF4JLogback

如果你需要使用别的日志实现日志门面,排除相应包,引入相关包

依赖关系
1️⃣ 默认使用SLF4JLogback

2️⃣ 在spring-core中,使用的是spring-jcl进行日志输出。spring-jcl可以理解成是SLF4JLogbackJULJCL等日志框架和日志门面的终极门面

26.1 日志格式

默认格式

默认日志格式如下

2014-03-05 10:57:51.112  INFO 45469 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet Engine: Apache Tomcat/7.0.52
2014-03-05 10:57:51.253  INFO 45469 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext

1️⃣ 日期和时间 - %d{yyyy-MM-dd:hh:mm:ss.SSS}

2️⃣ 日志级别 - ​%5p

3️⃣ Process ID - PID

4️⃣ 线程名称 - %15.15t

5️⃣ 类和方法名称 - %-40.40logger

6️⃣ 消息 - %msg%n

完整如下

%d{yyyy-MM-dd HH:mm:ss.SSS} %5p ${PID} --- [%15.15t] %40.440logger : %msg%n

支持颜色

可以使用clr(p1){p2}格式输出带颜色的日志

clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){yellow}

支持的颜色如下

  • blue
  • cyan
  • faint
  • green
  • magenta
  • red
  • yellow

你可以使用spring.output.asni.enabled=always/detect/never

  • Never - 表示不使用颜色
  • delect - 如果终端支持颜色,那么就开启颜色。不支持,就不开启。
  • always - 永远开启(不要使用,当终端不支持颜色,会导致乱码)
# 终端是否启用颜色 - 
spring.output.asni.enabled=delect

设置格式

使用logging.pattern.consolelogging.pattern.file来设置日志格式

# 控制台pattern
logging.pattern.console=%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){yellow} %clr(%5p){} %clr(${PID}){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger){cyan} %clr(:){faint} %msg%n
# 文件pattern
logging.pattern.file=%d{yyyy-MM-dd HH:mm:ss.SSS} %5p ${PID} --- [%15.15t] %40.440logger : %msg%n

26.3 文件输出

默认不输出文件。

如果需要使用文件,使用logging.file.pathlogging.file.name

# 26.3 文件
logging.file.path=F:/logs/
logging.file.name=F:/logs/sell.log

如果想输出到相对工程路径,使用相对目录

logging.file.path=./logs/

默认情况,如果你的实现是logback,还支持

  • 按照大小滚动
  • 按照时间清除备份
  • 按照大小清除备份
# 日志滚动策略
logging.file.max-size=2KB
# 日志滚动名称
logging.pattern.rolling-file-name=F:/logs/sell.%d{yyyy-MM-dd}.%i.log
# 开启之后,根据max-history和totcal-size-cap进行清除 - 仅仅logback生效
logging.file.clean-history-on-start=true
# 日志备份- 最多保存7填报
logging.file.max-history=7
# 日志备份 - 超过2KB,会被删除
loging.file.total-size-cap=2KB

26.4 日志级别

默认情况下,仅仅输出info级别往上。

设置root级别

使用debug=true或者logging.level.root=debug可以设置debug级别。区别是

  • debug=true - 仅仅针对一些模块设置debug
  • logging.level.root=debug - 所有模块设置debug
#  26.4 日志级别 - level
debug=true
logging.level.root = debug

对特定包设置level

使用logging.level.包名=级别

logging.level.com.yuki=debug

日志组

如果不同的包的日志级别相同,可以把他们放在一组,也叫日志组。

比如,我controller包设置debugdao包、service包设置info

使用logging.group.xx=xx,xx设置日志组

# 设置组
logging.group.yweb=com.yuki.log.web
logging.group.ydao=com.yuki.log.service, com.yuki.log.dao
# 设置级别
logging.level.yweb=info
logging.level.ydao=debugxxxxxxxxxx logging.group.yweb=com.yuki.log.weblogging.group.ydao=com.yuki.log.service, com.yuki.log.daologging.level.yweb=infologging.level.ydao=debugloggingproperties

26.6 使用自己的日志配置

springboot加载日志配置的流程是

  • 查看classpath中是否有相关日志配置
  • 都没有,使用defaults.xml属性配置

也就是说,如果你想自定义更多配置,比如

  • 按照时间滚动文件
  • 针对不同级别,输出到不同文件名称中。比如,debug输出到debug.log
Logging SystemCustomization
Logbacklogback-spring.xmllogback.xml
Log4j2log4j2-spring.xmllog4j2.xml
JDK(Java Util 日志记录)logging.properties

logback-spring.xmllogback.xml区别是。

  • logback-spring中提供了spring-profilespring-properties标签,可以给不同环境提供不同配置
  • logback-spring可以访问application.properties中内容。

如果可能,我们建议您将-spring变体用于日志记录配置(例如logback-spring.xml而不是logback.xml)。如果使用标准配置位置,Spring 将无法完全控制日志初始化。

使用特定日志

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    <exclusions>
        <!-- 排除logback + slf4j -->
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>

<!-- 使用 log4j + slf4j2 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

26.7 logback-spring.xml

如果你使用logback-spring.xml,可以使用springProfilelogbackproperties。可以实现

  • 不同环境,配置不同日志路径
<!-- properties - 通用属性 -->
<!-- 样式 -->
<property name="log.pattern" value="%yellow(%d{yyyy-MM-dd HH:mm:ss.SSS}) %5level %magenta(${PID}) --- %magenta([%15.15t]) %cyan(%-40.40logger{39}) :  %msg%n" />
<property name="log.maxHistory" value="30" />
<property name="log.level" value="info" />
<!-- ?spring-profile - 设置文件路径? -->
<springProfile name="dev">
    <!-- ?设置属性 ?-->
	<springProperty name="log.path" source="log.path" defaultValue="F:/logs/dev/" />
</springProfile>
<springProfile name="prod">
     <!-- ?设置属性 ?-->
	<springProperty name="log.path" source="log.path" defaultValue="F:/logs/prod/" />
</springProfile>

26.8 汇总

logback配置文件

<?xml version="1.0" encoding="utf-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
    <!-- properties - 通用属性 -->
    <property name="log.pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %5level ${PID} --- [%15.15t] %-40.40logger{39} :  %msg%n" />
    <property name="log.path" value="F:/logs/" />
    <property name="log.maxHistory" value="30" />
    <property name="log.level" value="debug" />

    <!-- appender - 输出 -->
    <appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${log.pattern}</pattern>
            <charset>utf-8</charset>
        </encoder>
    </appender>

    <appender name="debugAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${log.pattern}</pattern>
        </encoder>
        <file>${log.path}/debug.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/debug/debug-%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>${log.maxHistory}</maxHistory>
        </rollingPolicy>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>DEBUG</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    <appender name="infoAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${log.pattern}</pattern>
        </encoder>
        <file>${log.path}/info.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/info/info-%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>${log.maxHistory}</maxHistory>
        </rollingPolicy>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    <appender name="errorAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${log.pattern}</pattern>
        </encoder>
        <file>${log.path}/error.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/error/error-%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>${log.maxHistory}</maxHistory>
        </rollingPolicy>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- logger - 日志记录器 -->
    <logger name="root" level="info">
        <appender-ref ref="consoleAppender" />
    </logger>
    <logger name="com.yuki" level="${log.level}" additivity="true">
        <appender-ref ref="debugAppender" />
        <appender-ref ref="infoAppender" />
        <appender-ref ref="errorAppender" />
    </logger>
</configuration>

application.proerties中的常用log属性

# 26.1 日志格式 - pattern
# 日志颜色
spring.output.ansi.enabled=detect
# 日志格式 - 有颜色
logging.pattern.console=%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){yellow} %clr(%5p){} %clr(${PID}){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger){cyan} %clr(:){faint} %msg%n
logging.pattern.file=%d{yyyy-MM-dd HH:mm:ss.SSS} %5p ${PID} --- [%15.15t] %40.440logger : %msg%n


# 26.3 文件 - file
logging.file.path=F:/logs/
logging.file.name=F:/logs/sell.log
# 日志滚动
logging.file.max-size=2KB
# 文件名称 - 仅当日志实现是logack时候,才生效(支持)
logging.pattern.rolling-file-name=F:/logs/sell.%d{yyyy-MM-dd}.%i.log
# 开启之后,根据max-history和totcal-size-cap进行清除 - 仅仅logback生效
logging.file.clean-history-on-start=true
# 最多保存7天
logging.file.max-history=7
# 日志备份超过2KB,会被删除
logging.file.total-size-cap=2KB


#  26.4 日志级别 - level
# root设置级别
debug=true
logging.level.root = debug
# 自己的包设置级别
logging.level.com.yuki=debug
# 日志组
logging.group.yweb=com.yuki.log.web
logging.group.ydao=com.yuki.log.service, com.yuki.log.dao
logging.level.yweb=info
logging.level.ydao=debug
属性变量作用
logging.pattern.consoleCONSOLE_LOG_PATTERN?控制台pattern
logging.pattern.fileFILE_LOG_PATTERN?文件pattern
spring.output.ansi.enabled?是否启用颜色
logging.file.path?日志目录
logging.file.nameLOG_FILE?日志文件
logging.file.max-sizeLOG_FILE_MAX_SIZE?最大滚动大小
logging.pattern.rolling-file-name?滚动名称
logging.file.max-historyLOG_FILE_MAX_HISTORY?保存时间
logging.file.total-size-cap?超过,备份会被清除
logging.file.clean-history-on-start?启动时候,清除
debug?日志级别
logging.level.xxx?保日志级别
logging.group.xxx?日志组

版权声明:本文为sinat_34003720原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。