spring boot logback_SpringBoot集成logback后访问日志端点

问题描述

使用SpringBootAdmin(sba)监控Springboot服务时,配置了logback日志框架,按天滚动生成日志,此时在sba的日志监控页面出现404,如下图所示:

501c87ab192b6f056fead8876bcbefa3.png

解决方案

查看浏览器控制台以及查询sba文档可知,此处日志的显示主要是由spirngBoot的端点/actuator/logprofile控制日志显示的,因此从访问/actuator/logprofile端点开始解决。

创建一个测试项目

  • 环境

IDEA JDK 1.8 SpringBoot 2.3.3

  • 引入meven依赖

<dependency>  <groupId>org.springframework.bootgroupId>  <artifactId>spring-boot-starter-actuatorartifactId>dependency><dependency>  <groupId>org.springframework.bootgroupId>  <artifactId>spring-boot-starter-webartifactId>dependency>

引入web依赖是由于/actuator/logfile端点只有在web下才会生效

  • 修改application.yml文件

spring:  application:    name: actuator-logfilelogging:  level:    root: info    com.lzm: debug  pattern:    file: "%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(%5p) %clr(${PID}){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n%wEx"  file:  #    path: ./logs/${spring.application.name}   # path和name设置一个即可,name的优先级高      name: ./logs/${spring.application.name}.logmanagement:  endpoints:    web:      exposure:        include: "*"     # <1>

<1>处的代码表示开放所有的web端点,不开放的话会导致访问不到/actuator/logfile端点

访问/actuator/logfile端点

启动测试项目,浏览器输入/actuator/logfile,出现如下所示结果:

95dcfb8522d92bc98715c54488a328fd.png

此时/actuator/logfile端点可以正常访问。

添加logback

  • 引入logback文件如下

<?xml version="1.0" encoding="UTF-8"?><configuration scan="true" scanPeriod="10 seconds">    <contextName>logbackcontextName>    <property name="log.path" value="logs" />    <property name="log.name" value="actuator-logfile" />    <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}}" />    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">        <encoder>            <pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%npattern>        encoder>    appender>    <appender name="LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">        <file>${log.path}/${log.name}.logfile>        <encoder>            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%npattern>            <charset>UTF-8charset>        encoder>        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">            <fileNamePattern>${log.path}/${log.name}.%d{yyyy-MM-dd}.logfileNamePattern>            <maxHistory>1maxHistory>        rollingPolicy>        <filter class="ch.qos.logback.classic.filter.LevelFilter">            <level>DEBUGlevel>        filter>    appender>    <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">        <file>${log.path}/${log.name}-error.logfile>        <encoder>            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%npattern>            <charset>UTF-8charset>         encoder>        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">            <fileNamePattern>${log.path}/${log.name}-error.%d{yyyy-MM-dd}.logfileNamePattern>            <maxHistory>1maxHistory>        rollingPolicy>        <filter class="ch.qos.logback.classic.filter.LevelFilter">            <level>ERRORlevel>            <onMatch>ACCEPTonMatch>            <onMismatch>DENYonMismatch>        filter>    appender>    <springProfile name="dev">        <root level="debug">            <appender-ref ref="CONSOLE" />            <appender-ref ref="LOG_FILE" />            <appender-ref ref="ERROR_FILE" />        root>    springProfile>        <springProfile name="prod">        <root level="info">            <appender-ref ref="LOG_FILE" />            <appender-ref ref="ERROR_FILE" />        root>    springProfile>    <include resource="org/springframework/boot/logging/logback/console-appender.xml" />    <logger name="jdbc.sqlonly" level="OFF">logger>    <logger name="jdbc.audit" level="INFO">logger>    <logger name="jdbc.resultset" level="OFF">logger>    <logger name="jdbc.connection" level="OFF">logger>    <logger name="jdbc.sqltiming" level="OFF">        <appender-ref ref="CONSOLE" />    logger>    <logger name="org.springframework.web.servlet" level="info" />    <logger name="org.springframework.data.mongodb.core" level="DEBUG"/>configuration>
  • 修改logging配置

logging:  level:    root: info  pattern:    file: "%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(%5p) %clr(${PID}){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n%wEx"#  file: <1>#    path: ./logs/${spring.application.name}#    name: ./logs/${spring.application.name}.log  config: classpath:logback-custom.xml  <2>

<1>处注释掉是由于使用了logback之后,file.path或者file.name已经失效了 <2>指定logback的配置文件

  • 访问/actuator/logfile,出现如下界面:

9a6802080b78c8896e42a2262b5c88ae.png

此时竟然访问不到,这是什么鬼?

解决方案

添加logback之后,需要额外添加一个配置,指定生成的日志文件才可以,配置如下:

management:  endpoint:    logfile:      external-file: logs/${spring.application.name}.log

但是有个问题,logback中配置的是滚动生成日志文件,每天生成的日志文件都带有后缀,因此需要在logback配置中显式指名生成的文件名称:

`<appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">        <file>${log.path}/${log.name}.logfile>   <1> appender>

添加上述配置后,虽然当天的日志文件不带有日志后缀,但是第二天生成新的日志文件之后,今天的就会带有日期后缀,不影响日志查看的同时也能满足端点访问。

总结

使用logback时,要指定具体的日志文件后才能给logfile端点访问到,否则不能正确访问。

具体的测试代码已上传gitee(https://gitee.com/liaidai/springboot-actuator-logfile)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值