Spring-3-日志管理

本文详细介绍了Spring Boot的日志管理,包括日志框架的选择(如SLF4J、Logback),默认配置(如日志级别、文件输出、格式设置),以及如何自定义日志配置文件(如logback-spring.xml)。通过实例展示了如何改变日志级别、输出位置和格式,并讲解了使用<springProfile>进行条件日志显示。
Spring-3-日志管理

1 日志框架简介

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

日志抽象层日志实现
SLF4Jlog4j2、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

@RestControllerpublic 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.namelogging.file.pathExampleDescription
(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_File\myfirst\spring-boot-part3\logs

运行后会在F:\Java_File\myfirst\spring-boot-part3\logs生成spring.log日志文件

2.2.2  logging.file.name
logging:  level:    root: info  file:    #path: F:\Java_File\myfirst\spring-boot-part3\logs    name: my.log

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

图片

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

2.3 日志的格式设置

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

图片

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

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

logging:  level:    root: info  file:    #path: F:\Java_File\myfirst\spring-boot-part3\logs    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中的结果展示为:

  • 控制台结果

  • 图片

  • .log结果

  • 图片

3 SpringBoot 自定义配置日志文件

Logging SystemCustomization
Logbacklogback-spring.xml, logback-spring.groovy, logback.xml, or logback.groovy
Log4j2log4j2-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级别的日志

日志文件结果:

图片

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级别的日志

图片

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值