步驟如下
首先定義封裝所需要的日志信息的實體類
1
2
3
4
5
6
7
8
9
10
11
|
public class MyLog { //根據需要定義字段 @Id private String id; private Date ts; private String level; private String msg; private String thread; //屬性的get/set方法(略) } |
定義操作mongodb的接口
1
2
3
|
@Repository public interface LogRepository extends MongoRepository<MyLog, String>{ } |
定義一個MongoDBAppender繼承UnsynchronizedAppenderBase
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
@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的配置了
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
<? xml version = "1.0" encoding = "UTF-8" ?> < configuration > < contextName >logback</ contextName > <!—設置變量:輸出格式 --> < property name = "log.format" value = "%d [%thread] %-5level %logger{68} %line - logId[[%X{client}][%X{request_id}]] - %msg%n" /> <!-- 輸出到控制臺 --> < 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 > |
下面簡要的介紹一下自定義日志配置文件中的內容
首先介紹一下日志選型的原因
Spring Boot在所有內部日志中使用Commons Logging,但是默認配置也提供了對常用日志的支持,如:Java Util Logging,Log4J, Log4J2和Logback。每種Logger都可以通過配置使用控制臺或者文件輸出日志內容。
Logback是log4j框架的作者開發的新一代日志框架,它效率更高、能夠適應諸多的運行環境,同時天然支持SLF4J。SpringBoot默認使用Logback。
自定義日志配置
由于日志服務一般都在ApplicationContext創建前就初始化了,它并不是必須通過Spring的配置文件控制。因此通過系統屬性和傳統的Spring Boot外部配置文件依然可以很好的支持日志控制和管理。
根據不同的日志系統,你可以按如下規則組織配置文件名,就能被正確加載:
Spring Boot官方推薦優先使用帶有-spring的文件名作為你的日志配置(如使用logback-spring.xml,而不是logback.xml),命名為logback-spring.xml的日志配置文件,spring boot可以為它添加一些spring boot特有的配置項(下面會提到)。
根節點<configuration>包含的屬性
scan:當此屬性設置為true時,配置文件如果發生改變,將會被重新加載,默認值為true。
scanPeriod:設置監測配置文件是否有修改的時間間隔,如果沒有給出時間單位,默認單位是毫秒。當scan為true時,此屬性生效。默認的時間間隔為1分鐘。
debug:當此屬性設置為true時,將打印出logback內部日志信息,實時查看logback運行狀態。默認值為false。
根節點<configuration>的子節點:
<configuration>下面一共有2個屬性,3個子節點,分別是:
屬性一:設置上下文名稱<contextName>
每個logger都關聯到logger上下文,默認上下文名稱為“default”。但可以使用設置成其他名字,用于區分不同應用程序的記錄。一旦設置,不能修改,可以通過%contextName來打印日志上下文名稱。
屬性二:設置變量<property>
用來定義變量值的標簽,有兩個屬性,name和value;其中name的值是變量的名稱,value的值時變量定義的值。通過定義的值會被插入到logger上下文中。定義變量后,可以使“${}”來使用變量
子節點一<appender>
appender用來格式化日志輸出節點,有倆個屬性name和class,class用來指定哪種輸出策略,常用就是控制臺輸出策略和文件輸出策略。
控制臺輸出ConsoleAppender
<encoder>表示對日志進行編碼:
- %d{HH: mm:ss.SSS}——日志輸出時間
- %thread——輸出日志的進程名字,這在Web應用以及異步任務處理中很有用
- %-5level——日志級別,并且使用5個字符靠左對齊
- %logger{36}——日志輸出者的名字
- %msg——日志消息
- %n——平臺的換行符
子節點二<root>
root節點是必選節點,用來指定最基礎的日志輸出級別,只有一個level屬性。
level:用來設置打印級別,大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,不能設置為INHERITED或者同義詞NULL。
默認是DEBUG。
可以包含零個或多個元素,標識這個appender將會添加到這個loger。
子節點三<logger>
<logger>用來設置某一個包或者具體的某一個類的日志打印級別、以及指定<appender>。<logger>僅有一個name屬性,一個可選的level和一個可選的addtivity屬性。
name:用來指定受此loger約束的某一個包或者具體的某一個類。
level:用來設置打印級別,大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,還有一個特俗值INHERITED或者同義詞NULL,代表強制執行上級的級別。如果未設置此屬性,那么當前loger將會繼承上級的級別。
addtivity:是否向上級loger傳遞打印信息。默認是true。
logger在實際使用的時候有兩種情況
第一種:帶有loger的配置,不指定級別,不指定appender
第二種:帶有多個loger的配置,指定級別,指定appender
先來看一看代碼中如何使用
我們可以通過logger對象輸出不同級別的日志信息
以下兩種方式均可實現對具體方法進行不同級別的日志管理
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持服務器之家。
原文鏈接:https://blog.csdn.net/ssswd163/article/details/88956091