SpringBoot中l(wèi)ogback日志保存到mongoDB的方法
Springboot默認(rèn)集成的就是logback,logback相對(duì)來說是優(yōu)秀于log4j的,log4j2也是參考了logback的設(shè)計(jì)。
自定義Appender非常簡(jiǎn)單,繼承一下AppenderBase類即可。
可以看到有個(gè)AppenderBase,有個(gè)UnsynchronizedAppenderBase,還有個(gè)AsyncAppenderBase繼承了UnsynchronizedAppenderBase。從名字就能看出來區(qū)別,異步的、普通的、不加鎖的。
我們定義一個(gè)MongoDBAppender繼承UnsynchronizedAppenderBase
public class MongoDBAppender extends UnsynchronizedAppenderBase<ILoggingEvent> { @Override protected void append(ILoggingEvent eventObject) { MongoTemplate mongoTemplate = ApplicationContextProvider.getBean(MongoTemplate.class); if (mongoTemplate != null) { final BasicDBObject doc = new BasicDBObject(); doc.append("level", eventObject.getLevel().toString()); doc.append("logger", eventObject.getLoggerName()); doc.append("thread", eventObject.getThreadName()); doc.append("message", eventObject.getFormattedMessage()); mongoTemplate.insert(doc, "log"); } } }
必須要實(shí)現(xiàn)一個(gè)append方法,這個(gè)方法就是logback輸出日志的地方,日志都保存在eventObject對(duì)象中,我們只需要獲取對(duì)象里的值并做自己的處理即可。
我們可以想象為,系統(tǒng)的ConsoleAppender就是不停的System.out.print(eventObject.getXXX),而FileAppender就是用OutpuptStream輸出到文件里。
我們要做的就是把日志保存到mongo里,Springboot已經(jīng)提供了MongoTemplate模板,需要注意日志輸出是隨著系統(tǒng)啟動(dòng)就開始的,而剛開始時(shí)MongoTemplate還沒有被初始化,是需要等待Spring給MongoTemplate賦值的。所以剛開始時(shí)為null,需要等spring初始化完畢,MongoTemplate才有值。
由于這個(gè)Appender不歸spring管理,所以我采用單獨(dú)獲取bean的方式。其中ApplicationContextProvider如下:
@Component public class ApplicationContextProvider implements ApplicationContextAware { private static ApplicationContext context; public static ApplicationContext getApplicationContext() { return context; } @Override public void setApplicationContext(ApplicationContext ac) throws BeansException { context = ac; } public static <T> T getBean(Class<T> tClass) { return context.getBean(tClass); } public static <T> T getBean(String name, Class<T> tClass) { return context.getBean(name, tClass); } }
上面mongo操作日志入庫(kù)的比較簡(jiǎn)單,字段也沒有用完,大家可以根據(jù)自己希望保存的屬性來設(shè)計(jì)mongo的結(jié)構(gòu),然后入庫(kù)。
pom.xml
<dependency> <groupId>org.mongodb</groupId> <artifactId>mongo-java-driver</artifactId> <version>3.4.2</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> <version>1.1.11</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.1.11</version> </dependency>
在Spring-logback.xml使用也很簡(jiǎn)單
<?xml version="1.0" encoding="UTF-8"?> <configuration> <include resource="org/springframework/boot/logging/logback/base.xml" /> <appender name="MY_FILE" class="com.example.demo.mongo.MongoDBAppender"> </appender> <!-- 測(cè)試環(huán)境+開發(fā)環(huán)境. 多個(gè)使用逗號(hào)隔開. --> <springProfile name="test,dev"> <logger name="org.springframework.web" level="INFO"> <appender-ref ref="MY_FILE"/> </logger> <logger name="com.example" level="INFO" /> </springProfile> </configuration>
只需要指明appender 的class即可。就是這么簡(jiǎn)單。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Springboot項(xiàng)目保存本地系統(tǒng)日志文件的實(shí)現(xiàn)方法
- Springboot項(xiàng)目使用Slf4j將日志保存到本地目錄的實(shí)現(xiàn)代碼
- Springboot中Aspect切面的實(shí)現(xiàn)方式(以記錄日志為例)
- SpringBoot整合log4j2日志的實(shí)現(xiàn)
- SpringBoot+slf4j實(shí)現(xiàn)全鏈路調(diào)用日志跟蹤的方法(一)
- SpringBoot+slf4j線程池全鏈路調(diào)用日志跟蹤問題及解決思路(二)
- SpringBoot項(xiàng)目中控制臺(tái)日志的保存配置操作
相關(guān)文章
深入理解Java基礎(chǔ)之try-with-resource語(yǔ)法糖
這篇文章主要介紹了深入理解Java基礎(chǔ)之try-with-resource語(yǔ)法糖,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-02-02SpringBoot?Profile多環(huán)境配置方式
這篇文章主要介紹了SpringBoot?Profile多環(huán)境配置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06如果淘寶的七天自動(dòng)確認(rèn)收貨讓你設(shè)計(jì)你用Java怎么實(shí)現(xiàn)
在面試的時(shí)候如果面試官問淘寶的七天自動(dòng)確認(rèn)收貨讓你設(shè)計(jì),你會(huì)怎么具體實(shí)現(xiàn)呢?跟著小編看一下下邊的實(shí)現(xiàn)過程,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值2021-09-09SpringBoot集成Beetl后統(tǒng)一處理頁(yè)面異常的方法
這篇文章主要介紹了SpringBoot集成Beetl后統(tǒng)一處理頁(yè)面異常的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08Java通過notify和wait實(shí)現(xiàn)線程間的通信功能
在軟件開發(fā)中,線程是實(shí)現(xiàn)并發(fā)執(zhí)行的重要手段,然而,線程之間的協(xié)作與通信卻是開發(fā)者必須重點(diǎn)考慮的挑戰(zhàn)之一,Java作為一種廣泛應(yīng)用于多線程編程的語(yǔ)言,本文將深入探討Java中通過notify和wait實(shí)現(xiàn)線程間通信的機(jī)制,需要的朋友可以參考下2024-06-06Spring注解Autowired的底層實(shí)現(xiàn)原理詳解
從當(dāng)前springboot的火熱程度來看,java?config的應(yīng)用是越來越廣泛了,在使用java?config的過程當(dāng)中,我們不可避免的會(huì)有各種各樣的注解打交道,其中,我們使用最多的注解應(yīng)該就是@Autowired注解了。本文就來聊聊Autowired的底層實(shí)現(xiàn)原理2022-10-10使用@Autowired注解警告Field injection is not recommended的解決
這篇文章主要介紹了使用@Autowired注解警告Field injection is not recommended的解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04