日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

SpringBoot默認日志框架(slf4j)的使用以及配置文件

作者:weixin_44953227 更新時間: 2022-04-09 編程語言

目錄

  • 前言
    • 自定義日志配置
    • 日志級別
  • 使用
    • 1. 依賴
    • 2. 配置 logback-spring.xml
    • 3. 全局日志AOP實現

前言

SpringBoot 在所有內部日志中使用Commons Logging,但是默認配置也提供了對常用日志的支持,如:Java Util Logging,Log4J, Log4J2和Logback。每種Logger都可以通過配置使用控制臺或者文件輸出日志內容。

默認日志Logback

SLF4J——簡單日志門面,對應的英文為Simple Logging Facade,是存取日志的標準接口,包括slf4j、log4j、jdk logging api和apache common-log等具體實現。

其實SLF4J類似于Commons Logging,也是一個日志接口,而Logback類似于Log4j,是一個日志的實現。

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v2.4.5)

2021-05-11 14:37:21.934  INFO 10716 --- [  restartedMain] com.pro.MyBlogSiteApplication            : Starting MyBlogSiteApplication using Java 11.0.9 on DESKTOP-04S0A5K with PID 10716 (C:\Users\ibbd\Desktop\sundry\my-blog-site\target\classes started by ibbd in C:\Users\ibbd\Desktop\sundry\my-blog-site)
2021-05-11 14:37:21.937  INFO 10716 --- [  restartedMain] com.pro.MyBlogSiteApplication            : The following profiles are active: dev
2021-05-11 14:37:22.021  INFO 10716 --- [  restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable
2021-05-11 14:37:22.021  INFO 10716 --- [  restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG'
2021-05-11 14:37:23.584  INFO 10716 --- [  restartedMain] c.a.d.s.b.a.DruidDataSourceAutoConfigure : Init DruidDataSource
2021-05-11 14:37:24.675  INFO 10716 --- [  restartedMain] com.alibaba.druid.pool.DruidDataSource   : {dataSource-1} inited
2021-05-11 14:37:25.656  INFO 10716 --- [  restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8081 (http)
2021-05-11 14:37:25.675  INFO 10716 --- [  restartedMain] o.apache.catalina.core.StandardService   : Starting service [Tomcat]

從默認的日志信息可以看出

  • 時間日期:精確到毫秒

  • 日志級別:ERROR, WARN, INFO, DEBUG or TRACE

  • 進程ID

  • 分隔符:— 標識實際日志的開始

  • 線程名:方括號括起來(可能會截斷控制臺輸出)

  • Logger名:通常使用源代碼的類名

  • 日志內容


自定義日志配置

根據不同的日志系統,你可以按如下規則組織配置文件名,就能被正確加載:

Logback:logback-spring.xml, logback-spring.groovy, logback.xml, logback.groovy

Log4j:log4j-spring.properties, log4j-spring.xml, log4j.properties, log4j.xml

Log4j2:log4j2-spring.xml, log4j2.xml

JDK (Java Util Logging):logging.properties

Spring Boot官方推薦優先使用帶有-spring的文件名作為你的日志配置(如使用logback-spring.xml,而不是logback.xml),命名為logback-spring.xml的日志配置文件,spring boot可以為它添加一些spring boot特有的配置項(下面會提到)。

默認的命名規則,并且放在 src/main/resources 下面即可

如果你即想完全掌控日志配置,但又不想用logback.xml作為Logback配置的名字,application.yml可以通過logging.config屬性指定自定義的名字:

logging.config=classpath:logging-config.xml

日志級別

日志級別從低到高分為

TRACE < DEBUG < INFO < WARN < ERROR < FATAL

如果設置為 WARN ,則低于 WARN 的信息都不會輸出

一般設置為 DEBUG 就夠用了



使用

1. 依賴

spring-boot-starter 這個包就自帶了 logging 的依賴包, AOP這個包后面會用到

使用的 SpringBoot 版本:v2.4.5

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

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

2. 配置 logback-spring.xml

src/main/resources 目錄下新建 logback-spring.xml 配置文件






<configuration scan="true" scanPeriod="30 seconds">
    
    <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="LOG_PATH" value="./logs"/>

    
    <property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{${LOG_DATEFORMAT_PATTERN:-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}}" />
    
    <property name="FILE_LOG_PATTERN" value="${FILE_LOG_PATTERN:-%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%15t] %-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}" />


    
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${CONSOLE_LOG_PATTERN}pattern>
            <charset>UTF-8charset>
        encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <onMatch>ACCEPTonMatch>
            <onMismatch>DENYonMismatch>
        filter>
    appender>


    
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            
            <FileNamePattern>${LOG_PATH}/my-blog-site.%d{yyyy-MM-dd}.%i.logFileNamePattern>
            
            <maxFileSize>100MBmaxFileSize>
            
            <maxHistory>30maxHistory>
        rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${FILE_LOG_PATTERN}pattern>
            <charset>UTF-8charset>
        encoder>
        





    appender>


    
    <springProfile name="dev,prod">
        <logger name="org.springframework" level="INFO" additivity="false">
            <appender-ref ref="CONSOLE"/>
            <appender-ref ref="FILE"/>
        logger>
        <logger name="com.netflix" level="INFO" additivity="false">
            <appender-ref ref="CONSOLE"/>
            <appender-ref ref="FILE"/>
        logger>
        <logger name="com.pro.test" level="DEBUG" additivity="false">
            <appender-ref ref="CONSOLE"/>
            <appender-ref ref="FILE"/>
        logger>
        <logger name="java.sql" level="DEBUG" additivity="false">
            <appender-ref ref="CONSOLE"/>
            <appender-ref ref="FILE"/>
        logger>
        
        <logger name="com.pro" level="DEBUG,INFO" additivity="false">
            <appender-ref ref="CONSOLE"/>
            <appender-ref ref="FILE"/>
        logger>
    springProfile>

	<root level="INFO">
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="FILE" />
    root>
configuration>

3. 全局日志AOP實現

Pointcut 切入點說明

1. execution(public * *(..)) # ——表示匹配所有public方法
2. execution(* set*(..)) # ——表示所有以“set”開頭的方法
3. execution(* com.pro.service.UserService.*(..)) # ——表示匹配所有UserService接口的方法
4. execution(* com.pro.service.*.*(..)) # ——表示匹配service包下所有的方法
5. execution(* com.pro.service..*.*(..)) # ——表示匹配service包和它的子包下的方法

# () 參數說明
()匹配沒有參數;  (..)代表任意多個參數;   (*)代表一個參數,但可以是任意型;    (*,String)代表第一個參數為任何值,第二個為String類型。

記錄日志

package com.pro.aspect;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;


/**
 * 請求日志處理
 */
@Aspect
@Component
public class WebLogAspect {
    private static final Logger LOGGER = LoggerFactory.getLogger(WebLogAspect.class);

    ThreadLocal<Long> startTime = new ThreadLocal<>();

    // 切入點
    @Pointcut("execution(* com.pro.controller..*.*(..))")
    public void pc() {}

    // 前置通知
    @Before("pc()")
    public void doBefore(JoinPoint joinPoint) {
        // 記錄請求開始時間
        startTime.set(System.currentTimeMillis());

        // 接收請求, 記錄請求內容
        ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = requestAttributes.getRequest();
        // 記錄請求內容
        LOGGER.info("URL: " + request.getRequestURL().toString());
        LOGGER.info("HTTP_METHOD: " + request.getMethod());
        LOGGER.info("IP: " + request.getRemoteAddr());
        LOGGER.info("CLASS_METHOD: " + joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());
        LOGGER.info("Args: " + Arrays.toString(joinPoint.getArgs()));
    }

    // 返回通知
    @AfterReturning(returning = "result", pointcut = "pc()")
    public void doAfterReturning(Object result) {
        // 請求返回內容
        LOGGER.info("RESPONSE: " + result);
        LOGGER.info("SPEND TIME: " + (System.currentTimeMillis() - startTime.get()));

        // 用完之后移除, 避免內存泄漏
        startTime.remove();
    }
    
    // 異常通知
    @AfterThrowing(value = "pc()", throwing = "e")
    public void doAfterThrowing(JoinPoint joinPoint, Exception e) {
        // 獲取類名加方法名
        String name = joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName();
        // 記錄異常信息
        LOGGER.info("Exception_Class_Method: {}, Exception_Message: {}", name, e.getMessage());
    }
}

原文鏈接:https://blog.csdn.net/weixin_44953227/article/details/116654006

欄目分類
最近更新