SpringBoot中l(wèi)ogback日志保存到mongoDB的方法
Springboot默認集成的就是logback,logback相對來說是優(yōu)秀于log4j的,log4j2也是參考了logback的設計。
自定義Appender非常簡單,繼承一下AppenderBase類即可。
可以看到有個AppenderBase,有個UnsynchronizedAppenderBase,還有個AsyncAppenderBase繼承了UnsynchronizedAppenderBase。從名字就能看出來區(qū)別,異步的、普通的、不加鎖的。
我們定義一個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");
}
}
}
必須要實現(xiàn)一個append方法,這個方法就是logback輸出日志的地方,日志都保存在eventObject對象中,我們只需要獲取對象里的值并做自己的處理即可。
我們可以想象為,系統(tǒng)的ConsoleAppender就是不停的System.out.print(eventObject.getXXX),而FileAppender就是用OutpuptStream輸出到文件里。
我們要做的就是把日志保存到mongo里,Springboot已經(jīng)提供了MongoTemplate模板,需要注意日志輸出是隨著系統(tǒng)啟動就開始的,而剛開始時MongoTemplate還沒有被初始化,是需要等待Spring給MongoTemplate賦值的。所以剛開始時為null,需要等spring初始化完畢,MongoTemplate才有值。
由于這個Appender不歸spring管理,所以我采用單獨獲取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操作日志入庫的比較簡單,字段也沒有用完,大家可以根據(jù)自己希望保存的屬性來設計mongo的結構,然后入庫。
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使用也很簡單
<?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>
<!-- 測試環(huán)境+開發(fā)環(huán)境. 多個使用逗號隔開. -->
<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即可。就是這么簡單。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
深入理解Java基礎之try-with-resource語法糖
這篇文章主要介紹了深入理解Java基礎之try-with-resource語法糖,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-02-02
SpringBoot?Profile多環(huán)境配置方式
這篇文章主要介紹了SpringBoot?Profile多環(huán)境配置方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06
如果淘寶的七天自動確認收貨讓你設計你用Java怎么實現(xiàn)
在面試的時候如果面試官問淘寶的七天自動確認收貨讓你設計,你會怎么具體實現(xiàn)呢?跟著小編看一下下邊的實現(xiàn)過程,對大家的學習或工作具有一定的參考借鑒價值2021-09-09
SpringBoot集成Beetl后統(tǒng)一處理頁面異常的方法
這篇文章主要介紹了SpringBoot集成Beetl后統(tǒng)一處理頁面異常的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-08-08
Java通過notify和wait實現(xiàn)線程間的通信功能
在軟件開發(fā)中,線程是實現(xiàn)并發(fā)執(zhí)行的重要手段,然而,線程之間的協(xié)作與通信卻是開發(fā)者必須重點考慮的挑戰(zhàn)之一,Java作為一種廣泛應用于多線程編程的語言,本文將深入探討Java中通過notify和wait實現(xiàn)線程間通信的機制,需要的朋友可以參考下2024-06-06
Spring注解Autowired的底層實現(xiàn)原理詳解
從當前springboot的火熱程度來看,java?config的應用是越來越廣泛了,在使用java?config的過程當中,我們不可避免的會有各種各樣的注解打交道,其中,我們使用最多的注解應該就是@Autowired注解了。本文就來聊聊Autowired的底層實現(xiàn)原理2022-10-10
使用@Autowired注解警告Field injection is not recommended的解決
這篇文章主要介紹了使用@Autowired注解警告Field injection is not recommended的解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-04-04

