前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SpringBoot框架日志详解

SpringBoot框架日志详解

作者头像
科技新语
发布2024-10-15 12:02:49
1020
发布2024-10-15 12:02:49

日志的作用

在本地调试的时候,我们可以通过断点等方式进行调试、但是当系统在测试环境或者被部署到生产环境 中,我们无法通过断点进行调试。而且很多时候我们都是等问题发生之后才能获知问题的出现。这个时候 我们需要一个可靠的方式记录问题发生的情况。日志系统虽然不能实现什么业务、也无法提高系统的性 能。但是日志是保证服务可靠的重要功能。

日志级别

日志级别

描述

输出内容的日志级别

all

最低等级的,用于打开所有日志记录。

all,trace,debug,info,warn,error,fatal,off

trace

这是一个很低的日志级别,一般使用不到。

trace,debug,info,warn,error,fatal,off

debug

指出细粒度信息事件对调试应用程序是非常有帮助的,主要用于开发过程中打印一些运行信息。

debug,info,warn,error,fatal,off

info

消息在粗粒度级别上突出强调应用程序的运行过程。打印一些你感兴趣的或者重要的信息,这个可以用于生产环境中输出程序运行的一些重要信息,但是不能滥用,避免打印过多的无用日志日志,导致系统在出现问题时,大多浪费时间在无用的日志上,而且还占用空间。

info,warn,error,fatal,off

warn

表明会出现潜在错误的情形,有些信息不是错误信息,但是也要给程序员的一些提示。

warn,error,fatal,off

error

指出虽然发生错误事件,但仍然不影响系统的继续运行。打印错误和异常信息,如果不想输出太多的日志,可以使用这个级别。

error,fatal,off

fatal

指出每个严重的错误事件将会导致应用程序的退出。这个级别比较高了。重大错误,这种级别你可以直接停止程序了。

fatal,off

off

最高等级的,用于关闭所有日志记录。

off(也就是不输出任何日志信息)

注:error、warn、info、debug日志级别较为常用。

日志框架

市场上存在非常多的日志框架,分为日志门面(日志的抽象层)和日志实现。 可以这样理解:日志门面相当于是接口,日志实现相当于是接口的实现类。

日志门面

日志实现

JCL(Jakarta Commons Logging) SLF4j(Simple Logging Facade for Java) jboss-logging

Log4j JUL(java.util.logging) Log4j2 Logback

注:使用日志框架需要选择一个日志门面(抽象层)、一个日志实现,搭配使用。

  • 默认情况下,SpringBoot使用了slf4j+logback这样的日志门面和日志实现的组合,所以我们这边不对日志框架进行修改,直接在原有的日志基础上进行配置。
  • 我们在引入spring-boot-starter-web依赖时,已经包含了 spring-boot-starter-logging这个日志依赖。所以我们无需在引入spring-boot-starter-logging依赖

日志相关配置

文件输出

默认情况下,Spring Boot将日志输出到控制台,不会写到日志文件。如果要编写除控制台输出之外的日志文件,则需在application.properties中设置logging.file或logging.path属性。 属性设置解释logging.file设置文件,可以是绝对路径,也可以是相对路径。如:logging.file=my.log 如果只配置 logging.file,会在项目的当前路径下生成一个 xxx.log 日志文件。logging.path设置目录,会在该目录下创建spring.log文件,并写入日志内容,如:logging.path=/var/log如果只配置 logging.path,在 /var/log文件夹生成一个日志文件为 spring.log 注:二者不能同时使用,如若同时使用,则只有logging.file生效

级别控制

所有支持的日志记录系统都可以在Spring环境中设置记录级别(例如在application.properties中) 格式为:’logging.level.* = LEVEL’ 解释:

  • logging.level:日志级别控制前缀,*为包名或Logger名
  • LEVEL:选项TRACE, DEBUG, INFO, WARN, ERROR, FATAL, OFF

举例:logging.level.com.dudu=DEBUGcom.dudu包下所有class以DEBUG级别输出 根据不同的日志系统,你可以按如下规则组织配置文件名,就能被正确加载。

自定义日志配置

由于日志服务一般都在ApplicationContext创建前就初始化了,它并不是必须通过Spring的配置文件控制。因此通过系统属性和传统的Spring Boot外部配置文件依然可以很好的支持日志控制和管理。 根据不同的日志系统,你可以按如下规则组织配置文件名,就能被正确加载: 日志框架默认的日志文件名Logbacklogback-spring.xml,logback-spring.groovy,logback.xml,logback.groovyLog4jlog4j-spring.properties,log4j-spring.xml,log4j.properties,log4j.xmlLog4j2log4j2-spring.xml,log4j2.xmlJDK (Java Util Logging)logging.properties 如果你即想完全掌控日志配置,但又不想用logback-spring.xml作为Logback配置的名字,可以在application.properties配置文件里面通过logging.config属性指定自定义的名字: arduino 代码解读复制代码logging.config=classpath:logging-config.xml 注:我们要把日志配置文件(logback-spring.xml)放在src/main/resources下面即可 配置文件:(参考) xml 代码解读复制代码<?xml version="1.0" encoding="UTF-8"?> <configuration scan="true" scanPeriod="10 seconds"> <!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 --> <!-- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true --> <!-- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 --> <!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 --> ​ <contextName>logback</contextName> <!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。 --> <property name="log.path" value="C:/workplace/guli_parent/logs" /> ​ <!-- 彩色日志 --> <!-- 配置格式变量:CONSOLE_LOG_PATTERN 彩色日志格式 --> <!-- magenta:洋红 --> <!-- boldMagenta:粗红--> <!-- cyan:青色 --> <!-- white:白色 --> <!-- magenta:洋红 --> <property name="CONSOLE_LOG_PATTERN" value="%yellow(%date{yyyy-MM-dd HH:mm:ss}) |%highlight(%-5level) |%blue(%thread) |%blue(%file:%line) |%green(%logger) |%cyan(%msg%n)"/> ​ ​ <!--输出到控制台--> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息--> <!-- 例如:如果此处配置了INFO级别,则后面其他位置即使配置了DEBUG级别的日志,也不会被输出 --> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>info</level> </filter> <encoder> <Pattern>${CONSOLE_LOG_PATTERN}</Pattern> <!-- 设置字符集 --> <charset>UTF-8</charset> </encoder> </appender> ​ ​ <!--输出到文件--> ​ <!-- 时间滚动输出 level为 INFO 日志 --> <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 正在记录的日志文件的路径及文件名 --> <file>${log.path}/log_info.log</file> <!--日志文件输出格式--> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> <charset>UTF-8</charset> </encoder> <!-- 日志记录器的滚动策略,按日期,按大小记录 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 每天日志归档路径以及格式 --> <fileNamePattern>${log.path}/info/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>100MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> <!--日志文件保留天数--> <maxHistory>15</maxHistory> </rollingPolicy> <!-- 此日志文件只记录info级别的 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>INFO</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> ​ <!-- 时间滚动输出 level为 WARN 日志 --> <appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 正在记录的日志文件的路径及文件名 --> <file>${log.path}/log_warn.log</file> <!--日志文件输出格式--> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> <charset>UTF-8</charset> <!-- 此处设置字符集 --> </encoder> <!-- 日志记录器的滚动策略,按日期,按大小记录 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${log.path}/warn/log-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>100MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> <!--日志文件保留天数--> <maxHistory>15</maxHistory> </rollingPolicy> <!-- 此日志文件只记录warn级别的 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>warn</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> ​ ​ <!-- 时间滚动输出 level为 ERROR 日志 --> <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 正在记录的日志文件的路径及文件名 --> <file>${log.path}/log_error.log</file> <!--日志文件输出格式--> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> <charset>UTF-8</charset> <!-- 此处设置字符集 --> </encoder> <!-- 日志记录器的滚动策略,按日期,按大小记录 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${log.path}/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>100MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> <!--日志文件保留天数--> <maxHistory>15</maxHistory> </rollingPolicy> <!-- 此日志文件只记录ERROR级别的 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ERROR</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> ​ <!-- <logger>用来设置某一个包或者具体的某一个类的日志打印级别、以及指定<appender>。 <logger>仅有一个name属性, 一个可选的level和一个可选的addtivity属性。 name:用来指定受此logger约束的某一个包或者具体的某一个类。 level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF, 如果未设置此属性,那么当前logger将会继承上级的级别。 --> <!-- 使用mybatis的时候,sql语句是debug下才会打印,而这里我们只配置了info,所以想要查看sql语句的话,有以下两种操作: 第一种把<root level="INFO">改成<root level="DEBUG">这样就会打印sql,不过这样日志那边会出现很多其他消息 第二种就是单独给mapper下目录配置DEBUG模式,代码如下,这样配置sql语句会打印,其他还是正常DEBUG级别: --> <!--开发环境:打印控制台--> <springProfile name="dev"> <!--可以输出项目中的debug日志,包括mybatis的sql日志--> <logger name="com.chen" level="INFO" /> ​ <!-- root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性 level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,默认是DEBUG 可以包含零个或多个appender元素。 --> <root level="INFO"> <appender-ref ref="CONSOLE" /> <appender-ref ref="INFO_FILE" /> <appender-ref ref="WARN_FILE" /> <appender-ref ref="ERROR_FILE" /> </root> </springProfile> ​ ​ <!--生产环境:输出到文件--> <springProfile name="pro"> ​ <root level="INFO"> <appender-ref ref="CONSOLE" /> <appender-ref ref="DEBUG_FILE" /> <appender-ref ref="INFO_FILE" /> <appender-ref ref="ERROR_FILE" /> <appender-ref ref="WARN_FILE" /> </root> </springProfile> ​ </configuration> 注意点:

  • 上面的日志配置文件使用了Grep Console插件,所以我们要提前安装这彩色日志插件。
  • 修改 的value属性,也就是修改日志文件保存的位置。
  • 修改的name属性,(输出在该包下的日志信息)。
  • 使用mybatis的时候,sql语句是debug日志级别下才会打印,所以我们要将mapper(dao)包的日志级别修改为debug。

后记

本文主要讲述了SpringBoot框架日志部分的原理和配置,希望能够对大家有所启发。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 日志的作用
  • 日志级别
  • 日志框架
  • 日志相关配置
    • 文件输出
      • 级别控制
        • 自定义日志配置
        • 后记
        相关产品与服务
        日志服务
        日志服务(Cloud Log Service,CLS)是腾讯云提供的一站式日志服务平台,提供了从日志采集、日志存储到日志检索,图表分析、监控告警、日志投递等多项服务,协助用户通过日志来解决业务运维、服务监控、日志审计等场景问题。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档