SpringBoot中l(wèi)ogback日志保存到mongoDB的方法
Springboot默認(rèn)集成的就是logback,logback相對(duì)來(lái)說(shuō)是優(yōu)秀于log4j的,log4j2也是參考了logback的設(shè)計(jì)。
自定義Appender非常簡(jiǎn)單,繼承一下AppenderBase類(lèi)即可。
可以看到有個(gè)AppenderBase,有個(gè)UnsynchronizedAppenderBase,還有個(gè)AsyncAppenderBase繼承了UnsynchronizedAppenderBase。從名字就能看出來(lái)區(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)就開(kāi)始的,而剛開(kāi)始時(shí)MongoTemplate還沒(méi)有被初始化,是需要等待Spring給MongoTemplate賦值的。所以剛開(kāi)始時(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)單,字段也沒(méi)有用完,大家可以根據(jù)自己希望保存的屬性來(lái)設(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)境+開(kāi)發(fā)環(huán)境. 多個(gè)使用逗號(hào)隔開(kāi). -->
<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)用日志跟蹤問(wèn)題及解決思路(二)
- SpringBoot項(xiàng)目中控制臺(tái)日志的保存配置操作
相關(guān)文章
深入理解Java基礎(chǔ)之try-with-resource語(yǔ)法糖
這篇文章主要介紹了深入理解Java基礎(chǔ)之try-with-resource語(yǔ)法糖,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-02-02
SpringBoot?Profile多環(huán)境配置方式
這篇文章主要介紹了SpringBoot?Profile多環(huán)境配置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06
如果淘寶的七天自動(dòng)確認(rèn)收貨讓你設(shè)計(jì)你用Java怎么實(shí)現(xiàn)
在面試的時(shí)候如果面試官問(wèn)淘寶的七天自動(dòng)確認(rèn)收貨讓你設(shè)計(jì),你會(huì)怎么具體實(shí)現(xiàn)呢?跟著小編看一下下邊的實(shí)現(xiàn)過(guò)程,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值2021-09-09
SpringBoot集成Beetl后統(tǒng)一處理頁(yè)面異常的方法
這篇文章主要介紹了SpringBoot集成Beetl后統(tǒng)一處理頁(yè)面異常的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08
Java通過(guò)notify和wait實(shí)現(xiàn)線程間的通信功能
在軟件開(kāi)發(fā)中,線程是實(shí)現(xiàn)并發(fā)執(zhí)行的重要手段,然而,線程之間的協(xié)作與通信卻是開(kāi)發(fā)者必須重點(diǎn)考慮的挑戰(zhàn)之一,Java作為一種廣泛應(yīng)用于多線程編程的語(yǔ)言,本文將深入探討Java中通過(guò)notify和wait實(shí)現(xiàn)線程間通信的機(jī)制,需要的朋友可以參考下2024-06-06
Spring注解Autowired的底層實(shí)現(xiàn)原理詳解
從當(dāng)前springboot的火熱程度來(lái)看,java?config的應(yīng)用是越來(lái)越廣泛了,在使用java?config的過(guò)程當(dāng)中,我們不可避免的會(huì)有各種各樣的注解打交道,其中,我們使用最多的注解應(yīng)該就是@Autowired注解了。本文就來(lái)聊聊Autowired的底層實(shí)現(xiàn)原理2022-10-10
使用@Autowired注解警告Field injection is not recommended的解決
這篇文章主要介紹了使用@Autowired注解警告Field injection is not recommended的解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04

