?Springboot默認集成的就是logback,logback相對來說是優秀于log4j的,log4j2也是參考了logback的設計。
自定義Appender非常簡單,繼承一下AppenderBase類即可。
可以看到有個AppenderBase,有個UnsynchronizedAppenderBase,還有個AsyncAppenderBase繼承了UnsynchronizedAppenderBase。從名字就能看出來區別,異步的、普通的、不加鎖的。
我們定義一個MongoDBAppender繼承UnsynchronizedAppenderBase
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
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" ); } } } |
必須要實現一個append方法,這個方法就是logback輸出日志的地方,日志都保存在eventObject對象中,我們只需要獲取對象里的值并做自己的處理即可。
我們可以想象為,系統的ConsoleAppender就是不停的System.out.print(eventObject.getXXX),而FileAppender就是用OutpuptStream輸出到文件里。
我們要做的就是把日志保存到mongo里,Springboot已經提供了MongoTemplate模板,需要注意日志輸出是隨著系統啟動就開始的,而剛開始時MongoTemplate還沒有被初始化,是需要等待Spring給MongoTemplate賦值的。所以剛開始時為null,需要等spring初始化完畢,MongoTemplate才有值。
由于這個Appender不歸spring管理,所以我采用單獨獲取bean的方式。其中ApplicationContextProvider如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
@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操作日志入庫的比較簡單,字段也沒有用完,大家可以根據自己希望保存的屬性來設計mongo的結構,然后入庫。
pom.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
< 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使用也很簡單
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
<? 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 > <!-- 測試環境+開發環境. 多個使用逗號隔開. --> < 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即可。就是這么簡單。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。
原文鏈接:http://blog.csdn.net/tianyaleixiaowu/article/details/73332313