SpringBoot集成logback后訪問日志端點


問題描述

使用SpringBootAdmin(sba)監控Springboot服務時,配置了logback日志框架,按天滾動生成日志,此時在sba的日志監控頁面出現404,如下圖所示:

解決方案

查看瀏覽器控制台以及查詢sba文檔可知,此處日志的顯示主要是由spirngBoot的端點/actuator/logprofile控制日志顯示的,因此從訪問/actuator/logprofile端點開始解決。

創建一個測試項目

  • 環境

IDEA
JDK 1.8
SpringBoot 2.3.3

  • 引入meven依賴
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
</dependency>

引入web依賴是由於/actuator/logfile端點只有在web下才會生效

  • 修改application.yml文件
spring:
  application:
    name: actuator-logfile
logging:
  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}.log

management:
  endpoints:
    web:
      exposure:
        include: "*"     # <1>

<1>處的代碼表示開放所有的web端點,不開放的話會導致訪問不到/actuator/logfile端點

訪問/actuator/logfile端點

啟動測試項目,瀏覽器輸入/actuator/logfile,出現如下所示結果:

此時/actuator/logfile端點可以正常訪問。

添加logback

  • 引入logback文件如下
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="10 seconds">
    <contextName>logback</contextName>
    <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%n</pattern>
        </encoder>
    </appender>

    <appender name="LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/${log.name}.log</file>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/${log.name}.%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>1</maxHistory>
        </rollingPolicy>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>DEBUG</level>
        </filter>
    </appender>

    <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/${log.name}-error.log</file>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
            <charset>UTF-8</charset> <!-- 此處設置字符集 -->
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/${log.name}-error.%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>1</maxHistory>
        </rollingPolicy>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>



    <springProfile name="dev">
        <root level="debug">
            <appender-ref ref="CONSOLE" />
            <appender-ref ref="LOG_FILE" />
            <appender-ref ref="ERROR_FILE" />
        </root>
    </springProfile>


    <!-- 4.2 生產環境:輸出到文檔 -->
    <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,出現如下界面:

此時竟然訪問不到,這是什么鬼?

解決方案

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

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

但是有個問題,logback中配置的是滾動生成日志文件,每天生成的日志文件都帶有后綴,因此需要在logback配置中顯式指名生成的文件名稱:

        <file>${log.path}/${log.name}.log</file>   <1>

添加上述配置后,雖然當天的日志文件不帶有日志后綴,但是第二天生成新的日志文件之后,今天的就會帶有日期后綴,不影響日志查看的同時也能滿足端點訪問。

總結

使用logback時,要指定具體的日志文件后才能給logfile端點訪問到,否則不能正確訪問。

具體的測試代碼已上傳gitee


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM