Spring Boot Logging 配置

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Boot Logging 配置相关的知识,希望对你有一定的参考价值。

参考技术A

Spring Boot 能够使用Logback, Log4J2 , java util logging 作为日志记录工具。Spring Boot 默认使用Logback作为日志记录工具。日志默认输出到控制台但也能输出到文件中。我们通过spring-boot-starter-logging 加入Logback依赖,其实只要我们加入任意的Spring Boot starter 都会默认引入spring-boot-starter-logging,因此 我们不需要分开加入他们。

logging.level.* : 作为package(包)的前缀来设置日志级别。
logging.file : 配置日志输出的文件名,也可以配置文件名的绝对路径。
logging.path : 配置日志的路径。如果没有配置 logging.file ,Spring Boot 将默认使用spring.log作为文件名。
logging.pattern.console : 定义console中logging的样式。
logging.pattern.file : 定义文件中日志的样式。
logging.pattern.level : 定义渲染不同级别日志的格式。默认是%5p.
logging.exception-conversion-word : .定义当日志发生异常时的转换字
PID : 定义当前进程的ID

下面将讨论在 application.properties , application.ym , Logback XML 中配置Logback以及在Spirng Boot 应用中使用Log4J2.

logging.level设置日志级别。我们可以使用TARCE , DEBUG , INFO , WARN , ERROR , FATAL , OFF 。可以使用root级别和package级别来控制日志的输入级别。创建一个具有以下依赖关系的应用程序。

使用 src\\main\\resources\\application.properties 配置日志级别

使用 src\\main\\resources\\application.yml

Spring Boot 默认把日志输入到console,如果我们要把日志输入到文件中,需要配置logging.file 或者logging.path属性性。logging.file属性用来定义文件名。他不仅仅可以配置文件名,也可以路径+文件名。

在这种情况下mylogfile.log将在根目录中创建。我们也可以为为mylogfile.log分配一个路径,如concretepage/mylogfile.log。这种情况下我们将在相对根目录下创建concretepage/mylogfile.log。我们也可以为日志文件配置绝对路径。
application.yml 中配置

配置logging.path或者logging.path属性将日志输出到文件夹中。logging.path属性用来定义日志文件路径
application.properties 中配置logging.path属性

将会相对根路径下创建concretepage/logs/spring.log ,也可以配置绝对路径

application.yml 配置

通过设置logging.patter.console属性我们能改变输出到console的日志样式。日志样式包括时间,日志级别,线程名,日志名以及消息。我们可以按我们的喜好改变日志样式。
application.properties

application.yml

改变文件中的日志样式我们需要设置logging.pattern.file属性。首先通过logging.file或logging.path属性,把日志记录到文件中。

通过logging.path属性将在根目录下创建concretepage/logs并默认使用spring.log作为文件名。logging.pattern.console是设置console的日志样式
application.yml

通过命令行改变日志的输出级别
Sping Boot 默认输出ERROR , WARN , INFO 级别的日志。我们可以通过命令行使能DEBUG ,TRACE级别的日志输出,效果是跟配置文件一样的。想象我们有一个名为my-app.jar的可执行的JAR包我们可以在启动应用是使能DEBUG级别日志输出。

在application.properties中配置

application.yml

相同的方式使能TRACE级别的日志

application.properties

application.yml

在应用程序中记录日志
创建一个SLF4J的例子,首先获得org.slf4j.Logger的实例。

在application.properties配置包com.concretepage日志记录级别

输出

使用Logback XML 文件
Sping Boot中默认使用logback, 我们可以在application.properties或者application.yml中设置日志级别。如果想使用XML配置Logback,我们需要在类路径下创建logback-spring.xml文件
src\\main\\resources\\logback-spring.xml

使用自定义日志:Log4J2
我们使用任何的starter,默认加入Logback 依赖spring-boot-starter-logging。为了使用Log4J2,我们首先要去除spring-boot-starter-logging并且引入spring-boot-starter-log4j2 依赖

现在我们可以在类路径下创建并配置log4j2-spring.xml

原文: http://www.concretepage.com/spring-boot/spring-boot-logging-example

Spring boot logging

Spring boot logging

文章目录

源码

源码链接 https://gitee.com/mayun_xiaodu/spring-boot-all

上一节 Spring boot 配置文件读取和yaml结构

Spring boot 配置文件读取和yaml结构


首先我们搭一个web工程,集成spring-boot-starter-web;spring-boot-starter-web中依赖了spring-boot-starter-logging;
启动springboot

springboot 启动日志

springboot 提供的默认输出日志


 .   ____          _            __ _ _
/\\\\ / ___'_ __ _ _(_)_ __  __ _ \\ \\ \\ \\
( ( )\\___ | '_ | '_| | '_ \\/ _` | \\ \\ \\ \\
\\\\/  ___)| |_)| | | | | || (_| |  ) ) ) )
 '  |____| .__|_| |_|_| |_\\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot ::        (v2.1.6.RELEASE)

2021-03-29 09:55:06.451  INFO 80640 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
2021-03-29 09:55:06.473  INFO 80640 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2021-03-29 09:55:06.473  INFO 80640 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.21]
2021-03-29 09:55:06.566  INFO 80640 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2021-03-29 09:55:06.566  INFO 80640 --- [           main] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 1249 ms
2021-03-29 09:55:06.753  INFO 80640 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
2021-03-29 09:55:06.882  INFO 80640 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''

自定义logging

(这里使用 slf4j + logback 进行示例)

1.配置文件中设置日志参数

logging:
  level:
    root: info   # 配置root 的级别
    com.xiaodu.springboot.logging: warn # 配置具体包下的日志级别
  file:
    max-size: 10KB
    max-history: 7
  path: logging-logs
  pattern:
    ## %d日期格式  %level 日志级别  %t 线程  %loggerlength logger名 %m 日志内容 %L 日志输出的行数, %n 换行;
    console: '%dyyyy-MM-dd HH:mm:ss.SSS [%level] [%15t] %logger20 => %m Line: %L%n'

代码中输出日志

  // 进行日志输出
        log.trace("trace => ", "springboot-logging");
        log.debug("debug => ", "springbooot-logging");
        log.info("info => ", "springboot-logging");
        log.warn("warn => ", "springboot-logging");
        log.error("error => ", "springboot-logging");

在配置文件中设置了日志的root 为info级别, com.xiaodu.springboot.logging 包下的logger为warn级别;日志文件最大10KB, 保存7天;存放路径为 loggin-logs目录下;并自定义了日志输出的console格式
启动程序

  .   ____          _            __ _ _
 /\\\\ / ___'_ __ _ _(_)_ __  __ _ \\ \\ \\ \\
( ( )\\___ | '_ | '_| | '_ \\/ _` | \\ \\ \\ \\
 \\\\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.1.6.RELEASE)

2021-03-29 11:15:52.700 [INFO] [           main] o.s.b.w.e.t.TomcatWebServer => Tomcat initialized with port(s): 8080 (http) Line: 90
2021-03-29 11:15:52.719 [INFO] [           main] o.a.c.c.StandardService => Starting service [Tomcat] Line: 173
2021-03-29 11:15:52.719 [INFO] [           main] o.a.c.c.StandardEngine => Starting Servlet engine: [Apache Tomcat/9.0.21] Line: 173
2021-03-29 11:15:52.799 [INFO] [           main] o.a.c.c.C.[.[.[/] => Initializing Spring embedded WebApplicationContext Line: 173
2021-03-29 11:15:52.799 [INFO] [           main] o.s.w.c.ContextLoader => Root WebApplicationContext: initialization completed in 1360 ms Line: 283
2021-03-29 11:15:52.938 [INFO] [           main] o.s.s.c.ThreadPoolTaskExecutor => Initializing ExecutorService 'applicationTaskExecutor' Line: 171
2021-03-29 11:15:53.069 [INFO] [           main] o.s.b.w.e.t.TomcatWebServer => Tomcat started on port(s): 8080 (http) with context path '' Line: 202
2021-03-29 11:15:53.072 [WARN] [           main] c.x.s.l.LoggingApplication => warn => springboot-logging Line: 28
2021-03-29 11:15:53.074 [ERROR] [           main] c.x.s.l.LoggingApplication => error => springboot-logging Line: 29

2.使用日志文件配置logging
resources 下创建 logback.xml
具体的java 日志规范这里不再阐述。
创建一个简单的logback.xml; 配置了 root, logger, layout, appender

<?xml version="1.0" encoding="UTF-8"?>

<configuration debug="false">

    <property name="APP_NAME" value = "springboot-logging-test"/>
<!--输出到控制台-->
    <appender name = "console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>$APP_NAME -- %dyyyy-MM-dd HH:mm:ss.SSS [%level] [%15t] %logger20 => %m Line: %L%n</pattern>
        </encoder>
    </appender>
<!--输出到文件-->
    <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>springboot-log-test/$APP_NAME_stdout.log</File>
<!-- 配置文件滚动策略 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--            滚动生成的文件名称-->
            <FileNamePattern>springboot-log-test/$APP_NAME_stdout.%dyyyy-MM-dd-%i.log</FileNamePattern>
<!--      最大保存7天的日志      -->
            <maxHistory>7</maxHistory>
<!--         日志文件超过5kb后,生成一个新的文件记录日志-->
            <MaxFileSize>5KB</MaxFileSize>
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>$APP_NAME -- %dyyyy-MM-dd HH:mm:ss.SSS [%level] [%15t] %logger20 => %m Line: %L%n</pattern>
        </encoder>
    </appender>
    <logger name ="com.xiaodu.springboot.logging">
        <level value = "debug"/>
    </logger>

    <root>
        <level value="info"/>
        <appender-ref ref="console"/>
        <appender-ref ref="file"/>
    </root>
</configuration>


以上配置后我们打印的日志

springboot-logging-test -- 2021-03-29 12:07:54.944 [DEBUG] [           main] c.x.s.l.LoggingApplication => Running with Spring Boot v2.1.6.RELEASE, Spring v5.1.8.RELEASE Line: 53
springboot-logging-test -- 2021-03-29 12:07:54.945 [INFO] [           main] c.x.s.l.LoggingApplication => No active profile set, falling back to default profiles: default Line: 646
springboot-logging-test -- 2021-03-29 12:07:56.164 [INFO] [           main] o.s.b.w.e.t.TomcatWebServer => Tomcat initialized with port(s): 8080 (http) Line: 90
springboot-logging-test -- 2021-03-29 12:07:56.223 [INFO] [           main] o.a.c.h.Http11NioProtocol => Initializing ProtocolHandler ["http-nio-8080"] Line: 173
springboot-logging-test -- 2021-03-29 12:07:56.229 [INFO] [           main] o.a.c.c.StandardService => Starting service [Tomcat] Line: 173
springboot-logging-test -- 2021-03-29 12:07:56.229 [INFO] [           main] o.a.c.c.StandardEngine => Starting Servlet engine: [Apache Tomcat/9.0.21] Line: 173
springboot-logging-test -- 2021-03-29 12:07:56.299 [INFO] [           main] o.a.c.c.C.[.[.[/] => Initializing Spring embedded WebApplicationContext Line: 173
springboot-logging-test -- 2021-03-29 12:07:56.299 [INFO] [           main] o.s.w.c.ContextLoader => Root WebApplicationContext: initialization completed in 1289 ms Line: 283
springboot-logging-test -- 2021-03-29 12:07:56.461 [INFO] [           main] o.s.s.c.ThreadPoolTaskExecutor => Initializing ExecutorService 'applicationTaskExecutor' Line: 171
springboot-logging-test -- 2021-03-29 12:07:56.561 [INFO] [           main] o.a.c.h.Http11NioProtocol => Starting ProtocolHandler ["http-nio-8080"] Line: 173
springboot-logging-test -- 2021-03-29 12:07:56.582 [INFO] [           main] o.s.b.w.e.t.TomcatWebServer => Tomcat started on port(s): 8080 (http) with context path '' Line: 202
springboot-logging-test -- 2021-03-29 12:07:56.584 [INFO] [           main] c.x.s.l.LoggingApplication => Started LoggingApplication in 1.972 seconds (JVM running for 2.929) Line: 59
springboot-logging-test -- 2021-03-29 12:07:56.586 [DEBUG] [           main] c.x.s.l.LoggingApplication => debug => springbooot-logging Line: 26
springboot-logging-test -- 2021-03-29 12:07:56.586 [INFO] [           main] c.x.s.l.LoggingApplication => info => springboot-logging Line: 27
springboot-logging-test -- 2021-03-29 12:07:56.587 [WARN] [           main] c.x.s.l.LoggingApplication => warn => springboot-logging Line: 28
springboot-logging-test -- 2021-03-29 12:07:56.587 [ERROR] [           main] c.x.s.l.LoggingApplication => error => springboot-logging Line: 29

日志文件保存路径

也可以直接生成压缩包, 修改文件后缀即可

 <FileNamePattern>springboot-log-test/$APP_NAME_stdout.%dyyyy-MM-dd-%i.log.gz</FileNamePattern>

springboot 对logback中的扩展支持

resources 下创建 logback-spring.xml

(springboot 优先加载 “logback-test.groovy”, “logback-test.xml”,
“logback.groovy”, “logback.xml”, 若classpath下没有发现以上文件,则加载
“logback-test-spring.groovy”, “logback-test-spring.xml”,
“logback-spring.groovy”, “logback-spring.xml” 日志配置文件)
我们现在使用logback-spring.xml, 然后 把 logback.xml 临时改下名称 logback-temp.xml或者删除也可以

logback-spring.xml
spring 特有的日志标签

  • springProperty 获取spring配置信息
  • springProfile 根据spring.profile.active 进行不同的环境使用不同的日志配置
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!--获取spirng配置信息-->
    <springProperty name = "AAA" source = "spring.application.name"/>

    <appender name = "console" class = "ch.qos.logback.core.ConsoleAppender">
        <Target>System.out</Target>
        <encoder>
            <pattern>$AAA%dyyyy-MM-dd HH:mm:ss.SSS [%level] [%t] %c20 => %m%n</pattern>
        </encoder>
    </appender>
<!--根据spring.profiles.active 指定环境 使用不同logger进行不同环境中的不同级别日志打印-->
    <springProfile name = "dev | test">
        <logger name = "com.xiaodu.springboot.logging">
            <level value = "debug"/>
        </logger>
    </springProfile>

    <springProfile name = "prod">
        <logger name = "com.xiaodu.springboot.logging">
            <level value = "warn"/>
        </logger>
    </springProfile>
    <root>
        <level value="info"/>
        <appender-ref ref="console"/>
    </root>
</configuration>
 上述是一个简单的日志配置文件; springboot 提供了 springProperty 属性进行获取环境配置信息,
   springprofile 进行获取 spring.profiles.active信息;根据不同的开发,测试,生成环境进行不同的日志输出

控制台日志颜色输出

logback 自带的日志显示

%color(日志内容) 表示
示例:

  1. %red(%t)
  2. %blue(%logger)

    完整示例
    <pattern>%magenta($AAA) – %dyyyy-MM-dd HH:mm:ss.SSS %red([%5level]) %blue([%10t]) %cyan(%40logger39) : %yellow(%m) %n</pattern>

springboot 提供的 %clr
格式: %clr(日志内容)color; 不指定color时可以根据日志的级别自动显示颜色
springboot 提供了日志颜色转换器,ColorConverter

<!--   日志颜色转换器 -->
    <conversionRule conversionWord="clr" Spring boot logging

Spring-Boot配置项

如何在spring-boot可执行jar文件中配置java logging.properties

spring boot、logback 和 logging.config 属性

Spring Boot学习

当 logging.config 指向 logfj2 外部配置文件的错误文件位置时,spring-boot 应用程序停止