springboot實(shí)現(xiàn)將自定義日志格式存儲(chǔ)到mongodb中
步驟如下
首先定義封裝所需要的日志信息的實(shí)體類
public class MyLog { //根據(jù)需要定義字段 @Id private String id; private Date ts; private String level; private String msg; private String thread; //屬性的get/set方法(略) }
定義操作mongodb的接口
@Repository public interface LogRepository extends MongoRepository<MyLog, String>{ }
定義一個(gè)MongoDBAppender繼承UnsynchronizedAppenderBase
@Component Public class MongoDBAppender extends UnsynchronizedAppenderBase<LoggingEvent> implements ApplicationContextAware{ private static LogRepository logRepository; protected void append(LoggingEvent e){ MyLog myLog = new MyLog(); myLog.setLevel(e.getLevel().toString()); myLog.setMsg(e.getFormattedMessage()); myLog.setThread(e.getThreadName()); myLog.setTs(new Date(e.getTimeStamp())); logRepository.save(myLog); } Public void setApplicationContext(ApplicationContext applicationContext) { if (applicationContext.getAutowireCapableBeanFactory() .getBean(LogRepository.class) != null) { logRepository = (LogRepository) applicationContext .getAutowireCapableBeanFactory() .getBean(LogRepository.class); } } }
以上是java代碼部分
下面就是自定義日志文件logback.xml的配置了
<?xml version="1.0" encoding="UTF-8"?> <configuration > <contextName>logback</contextName> <!—設(shè)置變量:輸出格式 --> <property name="log.format" value="%d [%thread] %-5level %logger{68} %line - logId[[%X{client}][%X{request_id}]] - %msg%n"/> <!-- 輸出到控制臺(tái) --> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <charset>UTF-8</charset> <pattern>${log.format}</pattern> </encoder> </appender> <!--輸出到mongodb中--> <appender name="MONGODB" class="cn.mis.mongo.appender.MongoDBAppender"> </appender> <root level="INFO"> <appender-ref ref="STDOUT" /> <appender-ref ref="MONGODB" /> </root> <logger name="com.mis.mongo.controller.DemoController" level="WARN" additivity="false"> <appender-ref ref=" MONGODB "/> </logger> </configuration>
下面簡(jiǎn)要的介紹一下自定義日志配置文件中的內(nèi)容
首先介紹一下日志選型的原因
Spring Boot在所有內(nèi)部日志中使用Commons Logging,但是默認(rèn)配置也提供了對(duì)常用日志的支持,如:Java Util Logging,Log4J, Log4J2和Logback。每種Logger都可以通過配置使用控制臺(tái)或者文件輸出日志內(nèi)容。
Logback是log4j框架的作者開發(fā)的新一代日志框架,它效率更高、能夠適應(yīng)諸多的運(yùn)行環(huán)境,同時(shí)天然支持SLF4J。SpringBoot默認(rèn)使用Logback。
自定義日志配置
由于日志服務(wù)一般都在ApplicationContext創(chuàng)建前就初始化了,它并不是必須通過Spring的配置文件控制。因此通過系統(tǒng)屬性和傳統(tǒng)的Spring Boot外部配置文件依然可以很好的支持日志控制和管理。
根據(jù)不同的日志系統(tǒng),你可以按如下規(guī)則組織配置文件名,就能被正確加載:
Spring Boot官方推薦優(yōu)先使用帶有-spring的文件名作為你的日志配置(如使用logback-spring.xml,而不是logback.xml),命名為logback-spring.xml的日志配置文件,spring boot可以為它添加一些spring boot特有的配置項(xiàng)(下面會(huì)提到)。
根節(jié)點(diǎn)<configuration>包含的屬性
scan:當(dāng)此屬性設(shè)置為true時(shí),配置文件如果發(fā)生改變,將會(huì)被重新加載,默認(rèn)值為true。
scanPeriod:設(shè)置監(jiān)測(cè)配置文件是否有修改的時(shí)間間隔,如果沒有給出時(shí)間單位,默認(rèn)單位是毫秒。當(dāng)scan為true時(shí),此屬性生效。默認(rèn)的時(shí)間間隔為1分鐘。
debug:當(dāng)此屬性設(shè)置為true時(shí),將打印出logback內(nèi)部日志信息,實(shí)時(shí)查看logback運(yùn)行狀態(tài)。默認(rèn)值為false。
根節(jié)點(diǎn)<configuration>的子節(jié)點(diǎn):
<configuration>下面一共有2個(gè)屬性,3個(gè)子節(jié)點(diǎn),分別是:
屬性一:設(shè)置上下文名稱<contextName>
每個(gè)logger都關(guān)聯(lián)到logger上下文,默認(rèn)上下文名稱為“default”。但可以使用設(shè)置成其他名字,用于區(qū)分不同應(yīng)用程序的記錄。一旦設(shè)置,不能修改,可以通過%contextName來打印日志上下文名稱。
屬性二:設(shè)置變量<property>
用來定義變量值的標(biāo)簽,有兩個(gè)屬性,name和value;其中name的值是變量的名稱,value的值時(shí)變量定義的值。通過定義的值會(huì)被插入到logger上下文中。定義變量后,可以使“${}”來使用變量
子節(jié)點(diǎn)一<appender>
appender用來格式化日志輸出節(jié)點(diǎn),有倆個(gè)屬性name和class,class用來指定哪種輸出策略,常用就是控制臺(tái)輸出策略和文件輸出策略。
控制臺(tái)輸出ConsoleAppender
<encoder>表示對(duì)日志進(jìn)行編碼:
- %d{HH: mm:ss.SSS}——日志輸出時(shí)間
- %thread——輸出日志的進(jìn)程名字,這在Web應(yīng)用以及異步任務(wù)處理中很有用
- %-5level——日志級(jí)別,并且使用5個(gè)字符靠左對(duì)齊
- %logger{36}——日志輸出者的名字
- %msg——日志消息
- %n——平臺(tái)的換行符
子節(jié)點(diǎn)二<root>
root節(jié)點(diǎn)是必選節(jié)點(diǎn),用來指定最基礎(chǔ)的日志輸出級(jí)別,只有一個(gè)level屬性。
level:用來設(shè)置打印級(jí)別,大小寫無關(guān):TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,不能設(shè)置為INHERITED或者同義詞NULL。
默認(rèn)是DEBUG。
可以包含零個(gè)或多個(gè)元素,標(biāo)識(shí)這個(gè)appender將會(huì)添加到這個(gè)loger。
子節(jié)點(diǎn)三<logger>
<logger>用來設(shè)置某一個(gè)包或者具體的某一個(gè)類的日志打印級(jí)別、以及指定<appender>。<logger>僅有一個(gè)name屬性,一個(gè)可選的level和一個(gè)可選的addtivity屬性。
name:用來指定受此loger約束的某一個(gè)包或者具體的某一個(gè)類。
level:用來設(shè)置打印級(jí)別,大小寫無關(guān):TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,還有一個(gè)特俗值INHERITED或者同義詞NULL,代表強(qiáng)制執(zhí)行上級(jí)的級(jí)別。如果未設(shè)置此屬性,那么當(dāng)前l(fā)oger將會(huì)繼承上級(jí)的級(jí)別。
addtivity:是否向上級(jí)loger傳遞打印信息。默認(rèn)是true。
logger在實(shí)際使用的時(shí)候有兩種情況
第一種:帶有l(wèi)oger的配置,不指定級(jí)別,不指定appender
第二種:帶有多個(gè)loger的配置,指定級(jí)別,指定appender
先來看一看代碼中如何使用
我們可以通過logger對(duì)象輸出不同級(jí)別的日志信息
以下兩種方式均可實(shí)現(xiàn)對(duì)具體方法進(jìn)行不同級(jí)別的日志管理
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Spring Boot 項(xiàng)目中整合 MyBatis 和 PageHel
這篇文章主要介紹了Spring Boot 項(xiàng)目中整合 MyBatis 和 PageHelper的操作步驟,整合 PageHelper 到 Spring Boot 項(xiàng)目中主要包括添加依賴、配置數(shù)據(jù)源與 MyBatis、配置 PageHelper 以及在業(yè)務(wù)邏輯中使用 PageHelper 進(jìn)行分頁查詢,需要的朋友可以參考下2024-04-04基于springboot搭建的web系統(tǒng)架構(gòu)的方法步驟
這篇文章主要介紹了基于springboot搭建的web系統(tǒng)架構(gòu)的方法步驟,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-04-04Dubbo+Nacos服務(wù)啟動(dòng)報(bào)錯(cuò),返回unknown user的問題
這篇文章主要介紹了Dubbo+Nacos服務(wù)啟動(dòng)報(bào)錯(cuò),返回unknown user的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09java ThreadLocal線程局部變量常用方法使用場(chǎng)景示例詳解
這篇文章主要介紹了為大家java ThreadLocal線程局部變量常用方法使用場(chǎng)景示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07Java整型數(shù)與網(wǎng)絡(luò)字節(jié)序byte[]數(shù)組轉(zhuǎn)換關(guān)系詳解
這篇文章主要介紹了Java整型數(shù)與網(wǎng)絡(luò)字節(jié)序byte[]數(shù)組轉(zhuǎn)換關(guān)系,結(jié)合實(shí)例形式歸納整理了java整型數(shù)和網(wǎng)絡(luò)字節(jié)序的byte[]之間轉(zhuǎn)換的各種情況,需要的朋友可以參考下2017-08-08