Spring-3-日志管理

Spring-3-日志管理

1 日志框架简介

我们在开发过程中会经常使用的日志,目前存在很多日志框架:JCL、SLF4J、log4j、logback等等。

日志抽象层 日志实现
SLF4J log4j2、Logback

选择一个日志抽象层框架+日志实现,类似我们使用JDBC选择不同的数据驱动。

SpringBoot日志默认设置

  • SLF4J+Logback

  • 默认值输出到控制台

  • 默认级别Level为INFO

  • 默认日志文件大小为10M

  • 输出格式为

    2019-03-05 10:57:51.702 INFO 45469 --- [ost-startStop-1] osbcembedded.FilterRegistrationBean:映射过滤器:'hiddenHttpMethodFilter' 到:[/*]

    输出以下项目:

    • 日期和时间:毫秒精度,易于排序。

    • 日志级别:ERRORWARNINFODEBUGTRACE

    • 进程标识。

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

    • 线程名称:括在方括号中(可能会被截断以用于控制台输出)。

    • 记录器名称:这通常是源类名称(通常缩写)。

    • 日志消息

2 SpringBoot日志的默认配置

2.1 日志默认级别

新建一个Controller,端口默认为8080

@RestController
public class HelloController {

  Logger logger = LoggerFactory.getLogger(HelloController.class);
  @RequestMapping("/")
  public String index(){
      //由低到高 trace<debug<info<warn<error
      //可以调整输出的日志级别;日志就只会在这个级别以以后的高级别生效
      logger.trace("trace级别的日志");
      logger.debug("debug级别的日志");
      //SpringBoot默认给我们使用的是info级别的,没有指定级别的就用SpringBoot默认规定的级别;root级别
      logger.info("info级别的日志");
      logger.warn("warn级别的日志");
      logger.error("error级别的日志");

      return "logger info ";
  }
}

访问http://localhost:8080/后发现控制台输入为:


INFO 35004 --- [nio-8080-exec-1] c.l.s.controller.HelloController         : info级别的日志
WARN 35004 --- [nio-8080-exec-1] c.l.s.controller.HelloController         : warn级别的日志
ERROR 35004 --- [nio-8080-exec-1] c.l.s.controller.HelloController         : error级别的日志

我们发现trace和debug级别日志没有出现,这是因为SpringBoot日志默认级别为Info,日志只显示Info以及这个级别更高级别的日志,日志顺序为trace<debug<info<warn<error那么如果我们想显示trace或者debug级别的日志就需要修改配置文件application.yml

logging:
level:
  root: trace  #修改日志的级别,默认root是info

访问http://localhost:8080/后发现控制台输入为:

TRACE 21896 --- [nio-8080-exec-2] c.l.s.controller.HelloController        : trace级别的日志
DEBUG 21896 --- [nio-8080-exec-2] c.l.s.controller.HelloController       : debug级别的日志
INFO 21896 --- [nio-8080-exec-2] c.l.s.controller.HelloController         : info级别的日志
WARN 21896 --- [nio-8080-exec-2] c.l.s.controller.HelloController         : warn级别的日志
ERROR 21896 --- [nio-8080-exec-2] c.l.s.controller.HelloController       : error级别的日志

2.2 文件输出

默认情况下SpringBoot 日志只在控制台输出,如果想让日志输出到文件,需要设置属性logging.file.name或者logging.file.path

下表对logging.file.name和logging.file.path进行比较

logging.file.name logging.file.path Example Description
(none) (none)
只能在控制台输出
Specific file (none) my.log 写入指定的日志文件。名称可以是确切的位置,也可以是相对于当前目录的位置。
(none) Specific directory /var/log 将spring.log写到制定的文件夹,可以是确切的位置,也可以是相对于当前目录的位置

2.2.1 logging.file.path

logging:
level:
  root: info
file:
  path: F:Java_Filemyfirstspring-boot-part3logs

运行后会在F:Java_Filemyfirstspring-boot-part3logs生成spring.log日志文件

2.2.2  logging.file.name

logging:
level:
  root: info
file:
  #path: F:Java_Filemyfirstspring-boot-part3logs
  name: my.log

运行后会在该项目下生成my.log日志文件

Spring-3-日志管理

logging.file.name, logging.file.path 不能同时生效 logging.file.name会覆盖logging.file.path

2.3 日志的格式设置

我们先查看一下,默认在控制台的输出:

Spring-3-日志管理

%d-时间格式
%thread-线程
%-5level-从左5字符宽度
%logger{50}-日志50个字符
%msg-信息
%n-换行

application.yml中配置日志格式使用%clr转换字配置颜色

logging:
level:
  root: info
file:
  #path: F:Java_Filemyfirstspring-boot-part3logs
  name: my.log
pattern:
  console: "%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){yellow} %clr([%thread]){red} %highlight(%-5level) %logger{50} -%msg%n"
  file: "%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){yellow} === %clr([%thread]){red} == %highlight(%-5level) == %logger{50} == %msg%n"

在console和my.log中的结果展示为:

  • 控制台结果


  • Spring-3-日志管理

  • .log结果


  • Spring-3-日志管理

3 SpringBoot 自定义配置日志文件

Logging System Customization
Logback logback-spring.xml, logback-spring.groovy, logback.xml, or logback.groovy
Log4j2 log4j2-spring.xml or log4j2.xml
JDK (Java Util Logging) logging.properties

配置路径

src/main/resources/

  • Logback -> logback.xml 或 logback-spring.xml

  • Log4j2 -> log4j2.xml 或 log4j2-spring.xml

  • JUL -> logging.properties

新建src/main/resources/logback-spring.xml

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

<configuration scan="true" scanPeriod="60 seconds" debug="false">
   <!-- 属性定义 -->
   <!--日志保存路径-->
   <property name="LOG_HOME" value="${user.dir}/logs/"/>
   <property name="appName" value="OA-SEARCH"/>
   <property name="maxHistory" value="90"/>

   <!-- 彩色日志依赖的渲染类 -->
   <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
   <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
   <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />

   <property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}" />

   <!-- ConsoleAppender 控制台输出日志 -->
   <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
       <!-- 对日志进行格式化 -->
       <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
           <pattern>${CONSOLE_LOG_PATTERN}</pattern>
           <charset>utf8</charset>
       </encoder>
   </appender>


   <!-- DEBUG日志 -->
   <!-- 滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件 RollingFileAppender-->
   <appender name="DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 对日志进行格式化 -->
       <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
           <pattern>${CONSOLE_LOG_PATTERN}</pattern>
           <charset>utf8</charset>
       </encoder>
       <!-- 过滤器,记录「所有」级别的日志 -->
       <filter class="ch.qos.logback.classic.filter.LevelFilter">
           <level>DEBUG</level>
           <onMatch>ACCEPT</onMatch>
           <onMismatch>DENY</onMismatch>
       </filter>
       <!-- 滚动策略: 时间 和 大小 -->
       <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
           <fileNamePattern>${LOG_HOME}/debug/debugLog-%d{yyyy-MM-dd}.%i.txt</fileNamePattern>
           <maxFileSize>256MB</maxFileSize>
           <maxHistory>${maxHistory}</maxHistory>
           <totalSizeCap>20GB</totalSizeCap>
       </rollingPolicy>
       <encoder>
           <pattern>%d{yyyy-MM-dd HH:mm:ss:SSS} [%thread] %-5level %logger{50}(%F %L) -%msg%n</pattern>
       </encoder>
   </appender>

   <!-- INFO级别日志 -->
   <appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
       <!-- 过滤器,只记录「INFO」级别的日志 -->
       <filter class="ch.qos.logback.classic.filter.LevelFilter">
           <level>INFO</level>
           <onMatch>ACCEPT</onMatch>
           <onMismatch>DENY</onMismatch>
       </filter>
       <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
           <fileNamePattern>${LOG_HOME}/info/infoLog-%d{yyyy-MM-dd}.%i.txt</fileNamePattern>
           <maxFileSize>256MB</maxFileSize>
           <maxHistory>${maxHistory}</maxHistory>
           <totalSizeCap>20GB</totalSizeCap>
       </rollingPolicy>
       <encoder>
           <pattern>%d{yyyy-MM-dd HH:mm:ss:SSS} [%thread] %-5level %logger{50}(%F %L) -%msg%n</pattern>
       </encoder>
   </appender>

   <!-- WARN级别日志 -->
   <appender name="WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
       <!-- 过滤器,只记录「WARN」级别的日志 -->
       <filter class="ch.qos.logback.classic.filter.LevelFilter">
           <level>WARN</level>
           <onMatch>ACCEPT</onMatch>
           <onMismatch>DENY</onMismatch>
       </filter>
       <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
           <fileNamePattern>${LOG_HOME}/warn/warnLog-%d{yyyy-MM-dd}.%i.txt</fileNamePattern>
           <maxFileSize>256MB</maxFileSize>
           <maxHistory>${maxHistory}</maxHistory>
           <totalSizeCap>20GB</totalSizeCap>
       </rollingPolicy>
       <encoder>
           <pattern>%d{yyyy-MM-dd HH:mm:ss:SSS} [%thread] %-5level %logger{50}(%F %L) -%msg%n</pattern>
       </encoder>
   </appender>

   <!-- ERROR级别日志 -->
   <appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
       <!-- 过滤器,只记录「ERROR」级别的日志 -->
       <filter class="ch.qos.logback.classic.filter.LevelFilter">
           <level>ERROR</level>
           <onMatch>ACCEPT</onMatch>
           <onMismatch>DENY</onMismatch>
       </filter>
       <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
           <fileNamePattern>${LOG_HOME}/error/errorLog-%d{yyyy-MM-dd}.%i.txt</fileNamePattern>
           <maxFileSize>256MB</maxFileSize>
           <maxHistory>${maxHistory}</maxHistory>
           <totalSizeCap>20GB</totalSizeCap>
       </rollingPolicy>
       <encoder>
           <pattern>%d{yyyy-MM-dd HH:mm:ss:SSS} [%thread] %-5level %logger{50}(%F %L) -%msg%n</pattern>
       </encoder>
   </appender>


   <!-- MyBatis log configure -->
   <logger name="com.apache.ibatis" level="DEBUG"/>
   <logger name="org.mybatis.spring" level="DEBUG"/>
   <logger name="java.sql.Connection" level="DEBUG"/>
   <logger name="java.sql.Statement" level="DEBUG"/>
   <logger name="java.sql.PreparedStatement" level="DEBUG"/>

   <logger name="druid.sql" level="INFO"/>
   <logger name="org.mybatis.spring" level="INFO"/>
   <logger name="org.springframework" level="INFO"/>
   <logger name="org.springframework.context" level="WARN"/>
   <logger name="org.springframework.beans" level="WARN"/>
   <logger name="com.baomidou.mybatisplus" level="INFO"/>
   <logger name="org.apache.ibatis.io" level="INFO"/>

   <!-- 自己项目的mapper 路径 -->
   <logger name="com.aoke.oa.search" level="INFO"/>


   <!-- 根日志,所有日志appender都必须包含在root/logger中,否则不会起作用 -->
   <root level="INFO">
       <appender-ref ref="STDOUT"/>
       <appender-ref ref="DEBUG"/>
       <appender-ref ref="INFO"/>
       <appender-ref ref="WARN"/>
       <appender-ref ref="ERROR"/>
   </root>
</configuration>

启动应用后访问 http://localhost:8080/。控制台结果为:

2022-02-16 19:38:51.776  INFO 11448 --- [nio-8080-exec-1] c.l.s.controller.HelloController         : info级别的日志
2022-02-16 19:38:51.776 WARN 11448 --- [nio-8080-exec-1] c.l.s.controller.HelloController         : warn级别的日志
2022-02-16 19:38:51.776 ERROR 11448 --- [nio-8080-exec-1] c.l.s.controller.HelloController         : error级别的日志

日志文件结果:

Spring-3-日志管理

3.1 使用使用<springProfile>查看不同条件日志

修改/logback-spring.xml

    <!-- 根日志,所有日志appender都必须包含在root/logger中,否则不会起作用 -->
  <root level="INFO">
      <appender-ref ref="STDOUT"/>
      <springProfile name="dev">
          <appender-ref ref="DEBUG"/>
      </springProfile >
      <appender-ref ref="INFO"/>
      <appender-ref ref="WARN"/>
      <springProfile name="production">
          <appender-ref ref="ERROR"/>
      </springProfile >
  </root>


添加VM参数 -Dspring.profiles.active=dev 启动应用后访问 http://localhost:8080/

2022-02-16 19:48:50.000  INFO 14824 --- [nio-8080-exec-4] c.l.s.controller.HelloController         : info级别的日志
2022-02-16 19:48:50.000 WARN 14824 --- [nio-8080-exec-4] c.l.s.controller.HelloController         : warn级别的日志
2022-02-16 19:48:50.001 ERROR 14824 --- [nio-8080-exec-4] c.l.s.controller.HelloController         : error级别的日志

Spring-3-日志管理

发现没有出现debug文件夹控制台也没有出现debug信息



原文始发于微信公众号(springboot葵花宝典):Spring-3-日志管理

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/184479.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!