基于logback實(shí)現(xiàn)純java版本的SDK組件
開(kāi)源SDK:
<!--Java通用日志組件SDK--> <dependency> <groupId>io.github.mingyang66</groupId> <artifactId>oceansky-logger</artifactId> <version>4.3.6</version> </dependency> <!-- Java基于logback的日志組件SDK --> <dependency> <groupId>io.github.mingyang66</groupId> <artifactId>emily-spring-boot-logger</artifactId> <version>4.3.6</version> </dependency>
在項(xiàng)目開(kāi)發(fā)過(guò)程中通常會(huì)使用logback作為日志記錄的依賴工具,使用方式是引入logback相關(guān)jar包,然后配置logback.xml配置文件的方式來(lái)實(shí)現(xiàn);xml的配置方案如果是一個(gè)兩個(gè)項(xiàng)目還好,那如果是幾十個(gè)項(xiàng)目呢?每個(gè)項(xiàng)目都要寫(xiě)一遍配置文件也是一鍵很繁瑣的事情,而且配置文件還容易出錯(cuò),那我們有沒(méi)有辦法將其改造成一個(gè)純java版本的SDK組件呢?如果我們需要用的時(shí)候只需要將其依賴引入項(xiàng)目中開(kāi)箱即用是不是很方便。
一、開(kāi)源SDK項(xiàng)目規(guī)劃
- 新建oceansky-logger sdk,不依賴任何三方組件,不依賴任何web容器;
- 新建emily-spring-boot-logger sdk,為基于springboot的項(xiàng)目提供開(kāi)箱即用的starter;
二、oceansky-logger基礎(chǔ)庫(kù)SDK支持哪些功能
- 支持基礎(chǔ)日志打??;
private static final Logger baseLogger = LoggerFactory.getLogger(LogbackController.class); baseLogger.error("--------error"); baseLogger.info("--------info"); baseLogger.debug("--------debug"); baseLogger.warn("--------warn"); baseLogger.trace("--------trace");
這些日志會(huì)打印到指定的日志文件夾,分別存儲(chǔ)到error、warn、info、debug文件夾下;
- 支持分組日志打??;
private static final Logger logger = LoggerFactory.getGroupLogger(LogbackController.class, "group/test"); groupLogger.error("+++++++++++==ttttttttttttt"); groupLogger.debug("+++++++++++==ttttttttttttt"); groupLogger.info("+++++++++++==ttttttttttttt"); groupLogger.warn("+++++++++++==ttttttttttttt"); groupLogger.trace("+++++++++++==ttttttttttttt");
這些日志會(huì)分別打印到指定的分組文件夾group/test下面,分別存儲(chǔ)到error、warn、info、debug文件夾下;
- 支持模塊日志打印;
private static final Logger logger = LoggerFactory.getModuleLogger(LogbackController.class, "test1", "tt0"); logger..info("ni-----------------" + System.currentTimeMillis());
這些日志分別被記錄到指定的文件夾及指定的文件名中,同一個(gè)項(xiàng)目中可以指定N多個(gè)這樣的日志記錄模塊;
- 支持是否將上述三種日志展示到控制臺(tái)上,控制統(tǒng)一通過(guò)LoggerContextInitializer.init方法實(shí)現(xiàn);
- console控制臺(tái)支持基于ANSI編碼的顏色高亮展示;
- 異常堆棧允許展示每一行末尾追加對(duì)應(yīng)所屬的jar包,如下示例的中括號(hào)內(nèi):
2023-07-19 14:16:38.405 ERROR default --- [tp-nio-8080-exec-1] c.e.i.t.controller.LogbackController:35 : -----error test----
java.lang.NullPointerException: Cannot invoke "String.length()" because "s" is null
at com.emily.infrastructure.test.controller.LogbackController.debug(LogbackController.java:33) ~[classes/:na]
at com.emily.infrastructure.test.controller.LogbackController$$FastClassBySpringCGLIB$$2de19373.invoke(<generated>) ~[classes/:na]
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.3.28.jar:5.3.28]
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:793) ~[spring-aop-5.3.28.jar:5.3.28]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.3.28.jar:5.3.28]
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) ~[spring-aop-5.3.28.jar:5.3.28]
at com.alibaba.druid.support.spring.stat.DruidStatInterceptor.invoke(DruidStatInterceptor.java:70) ~[druid-1.2.18.jar:na]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.28.jar:5.3.28]
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) ~[spring-aop-5.3.28.jar:5.3.28]
- 支持日志debug模式,展示內(nèi)部狀態(tài)信息及調(diào)試信息;
- 支持基于ZIP、GZ的歸檔日志壓縮,壓縮率在80%以上;
- 允許重復(fù)初始化logger,多次初始化以最后一次為準(zhǔn)(每次初始化都會(huì)重置原來(lái)的初始化內(nèi)容)
LoggerContextInitializer.init(new LoggerProperties())
三、emis-spring-boot-logger基礎(chǔ)庫(kù)SDK支持哪些功能
完全基于oceansky-logger sdk組件為springboot提供的starter組件;
提供基于自動(dòng)化配置的開(kāi)箱即用的組件模式,只需在pom.xml引入starter既可以按照ocean-logger中指定的使用方案使用;
自動(dòng)化配置屬性控制root、group、module、appender、滾動(dòng)策略等,具體配置如下:
#日志組件 #啟動(dòng)日志訪問(wèn)組件,默認(rèn):true spring.emily.logger.enabled=true #是否開(kāi)啟debug模式,默認(rèn):false spring.emily.logger.debug=true #發(fā)生異常打印異常堆棧時(shí)是否將包信息追加到每行末尾,默認(rèn):true spring.emily.logger.packaging-data=true #日志文件存放路徑,默認(rèn)是:./logs spring.emily.logger.appender.path=./logs #如果是 true,日志被追加到文件結(jié)尾,如果是 false,清空現(xiàn)存文件,默認(rèn)是true spring.emily.logger.appender.append=true #如果是 true,日志會(huì)被安全的寫(xiě)入文件,即使其他的FileAppender也在向此文件做寫(xiě)入操作,效率低,默認(rèn)是 false|Support multiple-JVM writing to the same log file spring.emily.logger.appender.prudent=false #設(shè)置是否將輸出流刷新,確保日志信息不丟失,默認(rèn):true spring.emily.logger.appender.immediate-flush=true #是否開(kāi)啟基于文件大小和時(shí)間的SizeAndTimeBasedRollingPolicy歸檔策略 #歸檔策略(SIZE_AND_TIME_BASED、TIME_BASE),默認(rèn):TIME_BASE spring.emily.logger.appender.rolling-policy.type=TIME_BASE #設(shè)置要保留的最大存檔文件數(shù)量,以異步方式刪除舊文件,默認(rèn) 7 spring.emily.logger.appender.rolling-policy.max-history=2 #最大日志文件大小 KB、MB、GB,默認(rèn):500MB spring.emily.logger.appender.rolling-policy.max-file-size=10KB #控制所有歸檔文件總大小 KB、MB、GB,默認(rèn):5GB spring.emily.logger.appender.rolling-policy.total-size-cap=5GB #設(shè)置重啟服務(wù)后是否清除歷史日志文件,默認(rèn):false spring.emily.logger.appender.rolling-policy.clean-history-on-start=true #壓縮模式(NONE、GZ、ZIP),默認(rèn):ZIP spring.emily.logger.appender.rolling-policy.compression-mode=ZIP #是否開(kāi)啟異步記錄Appender,默認(rèn):false spring.emily.logger.appender.async.enabled=false #隊(duì)列的最大容量,默認(rèn)為 256 spring.emily.logger.appender.async.queue-size=256 #默認(rèn),當(dāng)隊(duì)列還剩余 20% 的容量時(shí),會(huì)丟棄級(jí)別為 TRACE, DEBUG 與 INFO 的日志,僅僅只保留 WARN 與 ERROR 級(jí)別的日志。想要保留所有的事件,可以設(shè)置為 0 spring.emily.logger.appender.async.discarding-threshold=0 # 根據(jù)所引用 appender 隊(duì)列的深度以及延遲, AsyncAppender 可能會(huì)耗費(fèi)長(zhǎng)時(shí)間去刷新隊(duì)列。 # 當(dāng) LoggerContext 被停止時(shí), AsyncAppender stop 方法會(huì)等待工作線程指定的時(shí)間來(lái)完成。 # 使用 maxFlushTime 來(lái)指定最大的刷新時(shí)間,單位為毫秒。在指定時(shí)間內(nèi)沒(méi)有被處理完的事件將會(huì)被丟棄。這個(gè)屬性的值的含義與 Thread.join(long)) 相同 # 默認(rèn)是 1000毫秒 spring.emily.logger.appender.async.max-flush-time=1000 # 在隊(duì)列滿的時(shí)候 appender 會(huì)阻塞而不是丟棄信息。設(shè)置為 true,appender 不會(huì)阻塞你的應(yīng)用而會(huì)將消息丟棄,默認(rèn)為 false spring.emily.logger.appender.async.never-block=false #是否將日志信息輸出到控制臺(tái),默認(rèn):true spring.emily.logger.root.console=false #基礎(chǔ)日志文件路徑,默認(rèn):"" spring.emily.logger.root.file-path=base #日志級(jí)別,即該等級(jí)之上才會(huì)輸出,ERROR > WARN > INFO > DEBUG > TRACE >ALL, 默認(rèn):INFO spring.emily.logger.root.level=info #記入文件日志格式-不帶顏色 spring.emily.logger.root.pattern=%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %cn --- [%18.18thread] %-36.36logger{36}:%-4.4line : %msg %n #控制臺(tái)輸出格式-帶顏色,默認(rèn):[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%thread] [%-5level] [%-36.36logger{36}:%-4.4line] : %msg%n spring.emily.logger.root.console-pattern=%d{yyyy-MM-dd HH:mm:ss.SSS} %highlight(%-5level) %cn --- [%18.18thread] %cyan(%-36.36logger{36}:%-4.4line) : %msg %n #是否將模塊日志輸出到控制臺(tái),默認(rèn):false spring.emily.logger.group.console=true #日志級(jí)別,即該等級(jí)之上才會(huì)輸出,ERROR > WARN > INFO > DEBUG > TRACE >ALL, 默認(rèn):INFO spring.emily.logger.group.level=info #模塊日志輸出格式,默認(rèn):%msg%n spring.emily.logger.group.pattern=%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %cn --- [%18.18thread] %-36.36logger{36}:%-4.4line : %msg %n #是否將模塊日志輸出到控制臺(tái),默認(rèn):false spring.emily.logger.module.console=true #日志級(jí)別,即該等級(jí)之上才會(huì)輸出,ERROR > WARN > INFO > DEBUG > TRACE >ALL, 默認(rèn):DEBUG spring.emily.logger.module.level=info #模塊日志輸出格式,默認(rèn):%msg%n spring.emily.logger.module.pattern=%msg%n
四、組件使用方法
oceansky-logger組件SDK使用方法,調(diào)用初始化方法后即可開(kāi)始日志記錄的愉快旅程
LoggerProperties properties = new LoggerProperties(); LoggerContextInitializer.init(properties);
emily-spring-boot-logger是一個(gè)基于springboot自動(dòng)化配置,開(kāi)箱即用的組件,只需要引入組件既可以使用;
到此這篇關(guān)于基于logback實(shí)現(xiàn)純java版本的SDK組件的文章就介紹到這了,更多相關(guān)java實(shí)現(xiàn)SDK組件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解在Spring-Boot中實(shí)現(xiàn)通用Auth認(rèn)證的幾種方式
這篇文章主要介紹了詳解在Spring-Boot中實(shí)現(xiàn)通用Auth認(rèn)證的幾種方式,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-07-07Java實(shí)現(xiàn)拓?fù)渑判虻氖纠a
這篇文章我們要講的是拓?fù)渑判?,這是一個(gè)針對(duì)有向無(wú)環(huán)圖的算法,主要是為了解決前驅(qū)后繼的關(guān)系,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2022-05-05Java后臺(tái)通過(guò)Collections獲取list集合中最大數(shù),最小數(shù)代碼
這篇文章主要介紹了Java后臺(tái)通過(guò)Collections獲取list集合中最大數(shù),最小數(shù)代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-08-08SpringBoot 統(tǒng)一公共返回類的實(shí)現(xiàn)
本文主要介紹了SpringBoot 統(tǒng)一公共返回類的實(shí)現(xiàn),配置后臺(tái)的統(tǒng)一公共返回類,這樣做目的是為了統(tǒng)一返回信息,文中示例代碼介紹的很詳細(xì),感興趣的可以了解一下2022-01-01JavaFX如何獲取ListView(列表視圖)的選項(xiàng)
這篇文章主要介紹了JavaFX如何獲取ListView(列表視圖)的選項(xiàng),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01LeetCode?動(dòng)態(tài)規(guī)劃之矩陣區(qū)域和詳情
這篇文章主要介紹了LeetCode?動(dòng)態(tài)規(guī)劃之矩陣區(qū)域和詳情,文章基于Java的相關(guān)資料展開(kāi)對(duì)LeetCode?動(dòng)態(tài)規(guī)劃的詳細(xì)介紹,需要的小伙伴可以參考一下2022-04-04簡(jiǎn)單談?wù)凧ava中String類型的參數(shù)傳遞問(wèn)題
這篇文章主要介紹了簡(jiǎn)單談?wù)凧ava中String類型的參數(shù)傳遞問(wèn)題的相關(guān)資料,需要的朋友可以參考下2015-12-12Java利用openoffice將doc、docx轉(zhuǎn)為pdf實(shí)例代碼
這篇文章主要介紹了Java利用openoffice將doc、docx轉(zhuǎn)為pdf實(shí)例代碼,分享了相關(guān)代碼示例,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01