Java動(dòng)態(tài)批量生成logback日志文件的示例
應(yīng)用場(chǎng)景舉個(gè)例子:
當(dāng)我一個(gè)服務(wù)需要啟動(dòng)n個(gè)端口,來監(jiān)聽n個(gè)來源的數(shù)據(jù),并且處理數(shù)據(jù)邏輯一致;但是我想要它們的日志分開文件夾來打印,從而更好的分析問題,那么就可以用我下面提供的模版了;
動(dòng)態(tài)生成日志logger,然后通過對(duì)象管理起來,然后我們可以從這個(gè)管理器內(nèi)拿logger來打印日志,或者從LoggerFactory根據(jù)id去拿logger對(duì)象
public void initLogger(Set<Integer> keySet) {
// 獲取 Logback 的 LoggerContext
LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
for (Integer port : keySet) {
Logger logger = null;
try {
String currPath = bsePath + "/" + port + "/";
// 創(chuàng)建 Logger
logger = context.getLogger("LOGGER-" + port);
logger.setLevel(Level.ALL);
logger.setAdditive(false); // 禁止繼承父 Logger 的 Appender
// 創(chuàng)建 Appender
RollingFileAppender<ILoggingEvent> appender = new RollingFileAppender<>();
appender.setContext(context);
appender.setName("DYNAMIC_APPENDER_" + port);
appender.setFile(currPath + "app.log");
// 配置滾動(dòng)策略
TimeBasedRollingPolicy<ILoggingEvent> rollingPolicy = new TimeBasedRollingPolicy<>();
rollingPolicy.setContext(context);
rollingPolicy.setParent(appender);
rollingPolicy.setFileNamePattern(currPath + "log-%d{yyyy-MM-dd}.%i.log");
rollingPolicy.setMaxHistory(3);
rollingPolicy.setTotalSizeCap(FileSize.valueOf("7GB"));
// 配置 SizeAndTimeBasedFNATP
SizeAndTimeBasedFNATP<ILoggingEvent> triggeringPolicy = new SizeAndTimeBasedFNATP<>();
triggeringPolicy.setContext(context);
triggeringPolicy.setMaxFileSize(FileSize.valueOf("100MB"));
triggeringPolicy.setTimeBasedRollingPolicy(rollingPolicy);
rollingPolicy.setTimeBasedFileNamingAndTriggeringPolicy(triggeringPolicy);
try {
rollingPolicy.start(); // 啟動(dòng)滾動(dòng)策略
} catch (Exception e) {
log.error("Failed to start rolling or triggering policy:", e);
}
// 配置編碼器
PatternLayoutEncoder encoder = new PatternLayoutEncoder();
encoder.setContext(context);
encoder.setPattern("%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n");
encoder.start();
// 設(shè)置 Appender
appender.setRollingPolicy(rollingPolicy);
appender.setEncoder(encoder);
try {
appender.start();
} catch (Exception e) {
log.error("Failed to start appender: ", e);
}
// 將 Appender 添加到 Logger
logger.addAppender(appender);
// 輸出日志
logger.info("測(cè)試日志,輸出到動(dòng)態(tài)路徑文件:{}", currPath);
} catch (Exception e) {
log.error("初始化logger失敗:{}", port);
throw new RuntimeException(e);
}
LightManagerBo lightManagerBo = port2ManagerMap.computeIfAbsent(port, k -> new LightManagerBo());
lightManagerBo.setLogger(logger);
}
}到此這篇關(guān)于Java動(dòng)態(tài)批量生成logback日志文件的示例的文章就介紹到這了,更多相關(guān)Java批量生成logback文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringCloud Eureka 服務(wù)注冊(cè)實(shí)現(xiàn)過程
這篇文章主要介紹了SpringCloud Eureka 服務(wù)注冊(cè)實(shí)現(xiàn)過程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10
Spring?Boot?整合?Thymeleaf?實(shí)例分享
這篇文章主要分享了Spring?Boot整合Thymeleaf,Thymeleaf是新一代的Java模板引擎,類似于Velocity、FreeMarker等傳統(tǒng)引擎,關(guān)于其更多相關(guān)內(nèi)容,需要的小伙伴可以參考一下2022-05-05
Java編程實(shí)現(xiàn)漢字按字母順序排序的方法示例
這篇文章主要介紹了Java編程實(shí)現(xiàn)漢字按字母順序排序的方法,結(jié)合具體實(shí)例形式分析了java編碼轉(zhuǎn)換及字母排序相關(guān)操作技巧,需要的朋友可以參考下2017-07-07
詳解如何在SpringBoot中優(yōu)雅地重試調(diào)用第三方API
作為后端程序員,我們的日常工作就是調(diào)用一些第三方服務(wù),將數(shù)據(jù)存入數(shù)據(jù)庫,返回信息給前端。本文為大家介紹了如何在SpringBoot中優(yōu)雅地重試調(diào)用第三方API,需要的可以參考一下2022-12-12
java多線程應(yīng)用實(shí)現(xiàn)方法
以前沒有寫筆記的習(xí)慣,現(xiàn)在慢慢的發(fā)現(xiàn)及時(shí)總結(jié)是多么的重要了,呵呵。雖然才大二,但是也快要畢業(yè)了,要加油2012-11-11
java -D參數(shù)設(shè)置系統(tǒng)屬性無效問題及解決
這篇文章主要介紹了java -D參數(shù)設(shè)置系統(tǒng)屬性無效問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12
IDEA創(chuàng)建Servlet程序的兩種實(shí)現(xiàn)方法
Servlet是JavaWeb應(yīng)用程序中不可或缺的組件之一,本文主要介紹了IDEA創(chuàng)建Servlet程序的兩種實(shí)現(xiàn)方法,具有一定的參考價(jià)值,感興趣的可以了解一下2023-10-10
Spring事務(wù)失效的9大場(chǎng)景與解決方法
在日常開發(fā)中,我們經(jīng)常使用Spring事務(wù),這篇文章主要來和大家聊聊Spring事務(wù)失效的 9 種場(chǎng)景,并提供了相應(yīng)的解決方法,有需要的小伙伴可以參考一下2025-04-04

