最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring如何按業(yè)務(wù)模塊輸出日志到不同的文件詳解

 更新時間:2022年05月06日 16:29:50   作者:huan1993  
最近做項目時有一個記錄操作日志的需求,比如某個用戶進行了查詢、刪除、修改等操作,下面這篇文章主要給大家介紹了關(guān)于Spring如何按業(yè)務(wù)模塊輸出日志到不同文件的相關(guān)資料,需要的朋友可以參考下

一、背景

在我們開發(fā)的過程中,可能存在如下情況:

1、有些時候我們需要調(diào)用第三方的接口,一般情況下,調(diào)用接口,我們都會記錄請求的入?yún)⒑晚憫?yīng)的。如果我們自己系統(tǒng)的日志和第三方的日志混合到一個日志文件中,那么可能查找日志就比較麻煩了。那么我們是否可以將第三方系統(tǒng)的日志單獨放到另外的文件中呢?

2、或者有些時候我們系統(tǒng)需要進行數(shù)據(jù)遷移,如果某條數(shù)據(jù)遷移失敗了,是否單獨放到一個日志文件中比較清晰呢?

二、需求

從上圖中可以看到我們的需求比較簡單

1、系統(tǒng)啟動日志和 login 模塊日志記錄到 springboot-spring.log 文件中。

2、第三方業(yè)務(wù)(QQ)模塊的日志記錄到 springboot-qq.log文件中。

3、第三方業(yè)務(wù)(QQ)模塊提供了一個login(loginName)方法,方法的入?yún)oginName需要記錄到springboot-qqLoginName.log文件中,模擬一、背景中提到的數(shù)據(jù)遷移失敗,記錄失敗的數(shù)據(jù)到單獨的日志文件中。

三、技術(shù)實現(xiàn)

1、采用的日志框架

此處使用logback來完成日志的記錄,因為SpringBoot應(yīng)用程序默認(rèn)的就是采用的logback來記錄日志。

2、如果實現(xiàn)分模塊、分文件記錄日志1、 編寫appender,這個可以簡單的理解日志需要輸出到哪里。

比如:

<!-- 此處定義的日志輸出到控制臺 -->
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
        <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [${PID:- }] [%thread] %-5level %logger{50}#%method:%L -%msg%n</pattern>

    </encoder>
</appender>

<!-- 此處定義日志輸出到 springboot-qq-日期.第幾個.log 文件中 -->
<appender name="qqAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
        <fileNamePattern>logs/springboot-qq-%d{yyyy-MM-dd}-.%i.log</fileNamePattern>
    </rollingPolicy>
   
</appender>

2、如何實現(xiàn)模塊輸出日志

此處就需要我們來配置 logger了。logger的name屬性指定到具體的全包名,然后引用我們上面定義的appender即可。

<!-- 在QQ這個包下的日志單獨使用 qqAppender 來輸出 -->
<logger name="com.huan.springboot.qq" level="info" additivity="false">
    <appender-ref ref="qqAppender"/>
    <appender-ref ref="stdout"/>
</logger>

配置logger,logger的name為需要單獨生成文件的那個包的全包名,然后在里面引用上面定義的appender

3、如果實現(xiàn)將loginName輸出到指定的文件

其實還是使用 logger 來實現(xiàn),logger的name需要和 LoggerFactory.getLogger("此處寫具體logger的name的值")

注意:

此處可能有一個坑,就是可能會丟失類名,那么我們?nèi)绾芜M行解決呢?可以通過MDC來解決。

.... %X{CLASSNAME}#%method:%L -%msg%n
MDC.put("CLASSNAME", QQService.class.getName());
qqLoginName.info("登錄用戶:[{}]", loginName);

即xml中使用%X{CLASSNAME},在java代碼中使用MDC存入CLASSNAME的值。

四、代碼實現(xiàn)

1、編寫xml日志文件

1、編寫appender

1、輸出日志到控制臺

<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
        <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [${PID:- }] [%thread] %-5level %logger{50}#%method:%L -%msg%n</pattern>
        <charset>UTF-8</charset>
    </encoder>
</appender>

2、編寫login模板的日志

<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>logs/springboot-spring-%d{yyyy-MM-dd}-.%i.log</fileNamePattern>
            <maxHistory>7</maxHistory>
            <maxFileSize>1MB</maxFileSize>
            <totalSizeCap>2GB</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [${PID:- }] [%thread] %-5level %logger{50}#%method:%L -%msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

3、編寫qq模板的日志

<appender name="qqAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>logs/springboot-qq-%d{yyyy-MM-dd}-.%i.log</fileNamePattern>
            <maxHistory>7</maxHistory>
            <maxFileSize>1MB</maxFileSize>
            <totalSizeCap>2GB</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [${PID:- }] [%thread] %-5level %logger{50}#%method:%L -%msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

4、編寫qq模塊loginName單獨輸出到文件的日志

<appender name="qqLoginNameAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>logs/springboot-qqLoginName-%d{yyyy-MM-dd}-.%i.log</fileNamePattern>
            <maxHistory>7</maxHistory>
            <maxFileSize>1MB</maxFileSize>
            <totalSizeCap>2GB</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [${PID:- }] [%thread] %-5level %X{CLASSNAME}#%method:%L -%msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

2、配置日志輸出到具體位置

1、配置login模塊

<root level="INFO">
    <appender-ref ref="stdout"/>
    <appender-ref ref="file"/>
</root>

login模塊屬于我們自己的系統(tǒng)模塊,此處使用 root標(biāo)簽來配置。

2、配置qq模塊

<!-- 在QQ這個包下的日志單獨使用 qqAppender 來輸出 -->
<logger name="com.huan.springboot.qq" level="info" additivity="false">
    <appender-ref ref="qqAppender"/>
    <appender-ref ref="stdout"/>
</logger>

此處name的值直接指定到了qq的全包名路徑。

3、配置loginName單獨輸出到文

<!-- 將所有的QQ登錄名防止在另外的文件中 -->
<logger name="qqLoginName" level="info" additivity="false">
    <appender-ref ref="qqLoginNameAppender"/>
    <appender-ref ref="stdout"/>
</logger>

2、編寫QQ模塊的代碼

@Component
public class QQService {

    private static final Logger log = LoggerFactory.getLogger(QQService.class);

    // getLogger("qqLoginName") 里的 qqLoginName 需要和 logback-spring.xml 中 logger的name一致,才會應(yīng)用
    private static final Logger qqLoginName = LoggerFactory.getLogger("qqLoginName");

    public void login(String loginName) {
        log.info("QQ業(yè)務(wù): 用戶:[{}]開始使用QQ來登錄系統(tǒng)", loginName);

        MDC.put("CLASSNAME", QQService.class.getName());
        qqLoginName.info("登錄用戶:[{}]", loginName);
    }
}

3、編寫login模塊的代碼

@RestController
public class LoginController {

    private static final Logger log = LoggerFactory.getLogger(LoginController.class);

    @Resource
    private QQService qqService;

    @GetMapping("login/{loginName}")
    public String login(@PathVariable("loginName") String loginName) {
        log.info("自己業(yè)務(wù):用戶:[{}]進行登錄", loginName);
        qqService.login(loginName);
        return "ok";
    }
}

五、運行結(jié)果

可以看到得到了我們期望的結(jié)果。

六、完整代碼

https://gitee.com/huan1993/spring-cloud-parent/tree/master/springboot/springboot-logger-split-file

七、一個小知識點

在SpringBoot中,如果我們要覆蓋默認(rèn)的logback配置,推薦使用logback-spring.xml來配置。

總結(jié)

到此這篇關(guān)于Spring如何按業(yè)務(wù)模塊輸出日志到不同文件的文章就介紹到這了,更多相關(guān)Spring輸出日志內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java實戰(zhàn)權(quán)限管理系統(tǒng)的實現(xiàn)流程

    Java實戰(zhàn)權(quán)限管理系統(tǒng)的實現(xiàn)流程

    讀萬卷書不如行萬里路,只學(xué)書上的理論是遠遠不夠的,只有在實戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+SpringBoot+MyBatis+AOP+LayUI+Mysql實現(xiàn)一個權(quán)限管理系統(tǒng),大家可以在過程中查缺補漏,提升水平
    2022-01-01
  • 簡單了解Java位域的一些知識

    簡單了解Java位域的一些知識

    這篇文章主要介紹了簡單了解Java位域的一些知識,這個概念是在 Effective Java中了解到的, 可以通過EnumSet來代替位域這種方式表達,需要的朋友可以參考下
    2019-07-07
  • Java中Connection timed out和Connection refused的區(qū)別講解

    Java中Connection timed out和Connection refused的區(qū)別講解

    今天小編就為大家分享一篇關(guān)于Java中Connection timed out和Connection refused的區(qū)別講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-04-04
  • Java中的Kafka消費者詳解

    Java中的Kafka消費者詳解

    這篇文章主要介紹了Java中的Kafka消費者詳解,Kafka是一個分布式流行消息系統(tǒng),通常用于大規(guī)模數(shù)據(jù)處理和實時數(shù)據(jù)流應(yīng)用程序,它具有高吞吐量、可擴展性和容錯性的特點,需要的朋友可以參考下
    2023-09-09
  • 使用java編程從0到1實現(xiàn)一個簡單計算器

    使用java編程從0到1實現(xiàn)一個簡單計算器

    這篇文章主要介紹了使用java編程從0到1實現(xiàn)一個簡單計算器,文章中用代碼實例講解的很清晰,有感興趣的同學(xué)可以學(xué)習(xí)研究下
    2021-02-02
  • springboot 多環(huán)境切換的方法

    springboot 多環(huán)境切換的方法

    這篇文章主要介紹了springboot 多環(huán)境切換的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • Java使用同步方法解決銀行取錢的安全問題案例分析

    Java使用同步方法解決銀行取錢的安全問題案例分析

    這篇文章主要介紹了Java使用同步方法解決銀行取錢的安全問題,結(jié)合具體案例形式分析了java同步方法實現(xiàn)多線程安全操作銀行取錢問題,需要的朋友可以參考下
    2019-09-09
  • WebService教程詳解(一)

    WebService教程詳解(一)

    WebService,顧名思義就是基于Web的服務(wù)。它使用Web(HTTP)方式,接收和響應(yīng)外部系統(tǒng)的某種請求,接下來通過本文給大家介紹WebService教程詳解(一),對webservice教程感興趣的朋友一起學(xué)習(xí)吧
    2016-03-03
  • Spring Boot中使用Spring-data-jpa的配置方法詳解

    Spring Boot中使用Spring-data-jpa的配置方法詳解

    今天小編就為大家分享一篇關(guān)于Spring Boot中使用Spring-data-jpa的配置方法詳解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • 解決Maven中關(guān)于依賴導(dǎo)入不進的問題

    解決Maven中關(guān)于依賴導(dǎo)入不進的問題

    這篇文章主要介紹了解決Maven中關(guān)于依賴導(dǎo)入不進的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11

最新評論

安溪县| 丽江市| 凤冈县| 乐安县| 灌云县| 耒阳市| 辉南县| 资溪县| 马龙县| 淮南市| 重庆市| 吉水县| 宁武县| 江都市| 仁寿县| 文昌市| 南川市| 府谷县| 曲靖市| 耿马| 新晃| 龙井市| 海伦市| 兴城市| 方山县| 阿拉尔市| 英吉沙县| 南木林县| 高尔夫| 南涧| 镇巴县| 惠东县| 沭阳县| 都兰县| 西华县| 鄂托克前旗| 平遥县| 乌恰县| 天全县| 宿迁市| 鲁甸县|