日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

SpringBoot如何動態改變日志級別

瀏覽:176日期:2023-04-03 17:00:34
前言

關于日志級別,大部分項目可能都設置為info級別,當然也可能有一些追求性能或者說包含很多敏感信息的項目直接將級別設置為warn或者error;這時候如果項目中出現一些未知異常,需要用到很詳細的日志信息,此時如果項目中沒有動態改變日志級別的機制,排查問題將很棘手。

日志系統

我們常用的一些日志系統包括:Log4j2、Logback、Java Util Logging;我們想動態改變日志的級別,前提是這些日志系統都支持我們直接設置日志等級,當然這些系統提供了很簡單的接口;

Log4j2

LoggerContext loggerContext = (LoggerContext) LogManager.getContext(false);LoggerConfig loggerConfig = loggerContext.getConfiguration().getLoggers().get('root');loggerConfig.setLevel(level); Logback

LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();Logger logger = loggerContext.getLogger('root');((ch.qos.logback.classic.Logger) logger).setLevel(level); Java Util Logging

Logger logger = Logger.getLogger('root');logger.setLevel(level);

當然除了上面直接設置日志級別的方式,也有可以動態加載配置文件的方式,同樣也可以在配置文件中動態改變日志級別,以logback為例:

LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();File externalConfigFile = new File('logback.xml');JoranConfigurator configurator = new JoranConfigurator();configurator.setContext(lc);lc.reset(); configurator.doConfigure(externalConfigFileLocation);

上面簡單介紹了一下每種日志系統都是如何去設置日志級別的,最關鍵的是設置完之后,可以實時生效,立馬可以看到我們想要的日志;有了這些下面其實就是通過何種方式去改變日志級別的問題了;

如何動態改變級別

如何去動態改變級別,最簡單的方式就是對外提供一個接口,給定一個日志級別作為參數實時變更;或者通過配置中心的方式;另外其實像SpringBoot這些主流的框架本身也提供了動態修改的功能;下面可以具體看一下是如何實現的,以logback為例;

自定義接口

自定義一個給定日志級別的接口,外部直接通過調用接口來改變級別:

@RequestMapping(value = 'logLevel/{logLevel}')public String changeLogLevel(@PathVariable('logLevel') String logLevel) { try { LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory(); Logger logger = loggerContext.getLogger('root'); ((ch.qos.logback.classic.Logger) logger).setLevel(Level.valueOf(logLevel)); } catch (Exception e) { logger.error('changeLogLevel error', e); return 'fail'; } return 'success';}

想要改變日志級別直接請求如下地址即可,設置一個debug的級別:

http://[ip]:[port]/logLevel/debug

這種方式雖然比較簡單,但是如果節點很多的話,操作起來就很麻煩,當然也可以匯總所有節點路徑,一次操作觸發所有節點的請求;其實最好的辦法應該是類似發布訂閱的方式,發布者會給所有訂閱者都發送一個更改日志級別的通知,有新的節點只要成為訂閱者即可,這種方式其實就是現在主流的配置中心的方式。

配置中心

配置中心的目的其實就是把一些會經常變動的參數集中保存起來,某個系統啟動時去配置中心獲取相關的參數,同時會對這些參數進行監聽,后面在配置中心里面改變參數的值會實時推送給相關系統;這樣系統就可以在不重啟的情況下就更新了配置;利用現有的一些中間件我們就能很快實現一個配置中心,比如Zookeeper提供了對某個Node進行監聽的功能,MQ和Redis都有發布訂閱的功能,所以用來實時推送變更再好不過了;

Zookeeper方式

可以直接使用PathChildrenCache用來監聽子節點的CHILD_ADDED,CHILD_UPDATED,CHILD_REMOVED事件;這樣如果在Zookeeper服務端對節點的值就行更新,客戶端會觸發以上三個事件:

private void watcherPath(String path) { PathChildrenCache cache = new PathChildrenCache(client, path, true); cache.start(StartMode.POST_INITIALIZED_EVENT); cache.getListenable().addListener(new PathChildrenCacheListener() { @Override public void childEvent(CuratorFramework client, PathChildrenCacheEvent event) throws Exception { switch (event.getType()) { case CHILD_ADDED:break; case CHILD_UPDATED:String logLevel = new String(event.getData().getData()); //日志級別更新處理break; case CHILD_REMOVED:break; default:break; } } });} MQ方式

MQ一般都有Queue和Topic方式,Topic方式其實就是訂閱發布模式,所有的集群節點可以訂閱某個Topic,這樣發布端發送更新日志級別的消息,其他訂閱節點都能收到:

//日志等級Topicprivate final String TOPIC = 'LOGLEVEL'; private void watcherPaths() throws JMSException { Topic topic = session.createTopic(TOPIC); MessageConsumer consumer = session.createConsumer(topic); consumer.setMessageListener(new MessageListener() { @Override public void onMessage(Message message) { TextMessage tm = (TextMessage) message; String logLevel = tm.getText(); //日志級別更新處理 } });} Redis方式

Redis其實除了緩存的功能,也提供了類似MQ的發布訂閱的模式;集群節點通過訂閱一個channel,發布端通過此channel來發布消息:

private void watcherPaths() throws JMSException { jedis.subscribe(new JedisPubSub() { @Override public void onMessage(String channel, String message) { String logLevel = message; //日志級別更新處理 } },'LOGLEVEL');}SpringBoot內置

SpringBoot2.0之后可以通過actuator動態調整日志級別,主要是通過暴露loggers這個endpoint來實現,具體步驟如下:

需要引入actuator

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId></dependency> 暴露loggers

在application.properties中添加如下配置:

management.endpoints.web.exposure.include=loggers 查看日志級別

啟動服務可以通過:

http://[ip]:[port]/actuator/loggers

查看當前項目每個包的日志級別:

{levels: [ 'OFF','ERROR','WARN','INFO','DEBUG','TRACE'],loggers: { ROOT: { configuredLevel: 'INFO', effectiveLevel: 'INFO' },...} 動態修改日志級別

發送POST請求到:

http://[ip]:[port]/actuator/loggers/[包路徑]

需要在body中指定configuredLevel參數;比如修改整個項目日志級別為error:

http://[ip]:[port]/actuator/loggers/root

SpringBoot如何動態改變日志級別

關于SpringBoot內部是如何實現動態改變日志級別的,可以查看其實現核心類LoggersEndpoint:

@Endpoint(id = 'loggers')public class LoggersEndpoint { private final LoggingSystem loggingSystem; @WriteOperation public void configureLogLevel(@Selector String name, @Nullable LogLevel configuredLevel) { Assert.notNull(name, 'Name must not be empty'); this.loggingSystem.setLogLevel(name, configuredLevel); } ...}

具體通過LoggingSystem來對日志系統動態改變級別,上面也介紹了主流使用的日志系統,SpringBoot也都支持這些系統,這是一個抽象類,具體實現類:

JavaLoggingSystem Log4J2LoggingSystem LogbackLoggingSystem NoOpLoggingSystem

分別對應了幾種日志系統,這幾個類內部其實也是調用上面介紹的方法去改變日志級別,當然SpringBoot自動會識別出當前使用的是哪個日志系統,然后使用哪個LoggingSystem;

總結

大部分公司其實更多的還是使用配置中心的方式來動態改變日志級別,這種方式更加靈活,而且配置中心已經成為很多公司的標配組件,不光用來改變日志級別,所有有可能改變的參數都可以使用。

以上就是SpringBoot如何動態改變日志級別的詳細內容,更多關于SpringBoot 動態改變日志級別的資料請關注好吧啦網其它相關文章!

標簽: Spring
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
婷婷综合福利| 国产专区一区| 麻豆精品在线| 日韩伦理福利| 黄色亚洲在线| 91综合久久爱com| 欧美黑人做爰爽爽爽| 日韩欧美综合| 久久高清国产| 国产精品流白浆在线观看| 久久中文字幕一区二区三区| 色爱av综合网| 亚洲精品一二三**| 日本激情一区| 免费在线看一区| 精品五月天堂| 午夜在线视频一区二区区别| 国产精品午夜av| 91精品亚洲| 亚洲精品少妇| 中文字幕成在线观看| 三级在线观看一区二区| 老牛国内精品亚洲成av人片 | 视频一区欧美精品| 国产毛片一区二区三区| 91精品在线观看国产| 日本一不卡视频| 日韩久久电影| 日本aⅴ免费视频一区二区三区| 久久久久久色| 99热精品久久| 国产剧情一区| 亚洲精品午夜av福利久久蜜桃| 国产日产精品_国产精品毛片 | 国产精品原创| 亚洲一区欧美激情| 国内精品伊人| 蜜臀av在线播放一区二区三区| 精品九九在线| 亚洲欧洲免费| 久久精品导航| 国产精品亲子伦av一区二区三区| 免费观看久久av| 欧美国产不卡| 蜜臀a∨国产成人精品| 黄色在线观看www| 日韩av一区二区三区| 激情久久五月| 精品国产一区二区三区性色av| 久久www成人_看片免费不卡| 久久久久伊人| 日本在线视频一区二区| 欧美日韩一二三四| 精品一区二区三区在线观看视频| 免费看欧美美女黄的网站| 亚洲成av在线| 麻豆91精品视频| 日韩一区二区三区精品| 日韩一区二区免费看| 91日韩在线| 国产精品99久久免费观看| 视频一区在线视频| 国产综合激情| 国产v日韩v欧美v| 国产精品成人一区二区网站软件| 亚洲欧洲另类| 成人精品亚洲| 最近高清中文在线字幕在线观看1| 国产亚洲久久| 日韩av黄色在线| 亚洲视频电影在线| 亚洲经典在线| 激情欧美国产欧美| 91精品国产91久久久久久黑人| 精品一区二区三区中文字幕视频 | 另类欧美日韩国产在线| 日韩精品免费一区二区夜夜嗨 | 国产精品www.| 日本午夜精品一区二区三区电影| 日本欧美在线看| 黄页网站一区| 国产精品丝袜xxxxxxx| 久久精品国语| 日韩久久精品网| 日韩欧美一区二区三区在线视频 | 久久精品国产99国产| 国产视频一区二区在线播放| 日本aⅴ亚洲精品中文乱码| 美国三级日本三级久久99 | 国产亚洲人成a在线v网站| 日韩手机在线| 日韩在线视频一区二区三区| 免费不卡在线观看| 首页欧美精品中文字幕| 久色成人在线| 最新国产精品视频| 日韩二区三区在线观看| 日韩成人午夜精品| 国产精品自在| 国产精品成人国产| 国产成人久久精品一区二区三区| 岛国精品一区| 福利一区二区三区视频在线观看| 国产成人免费视频网站视频社区| 国产成人黄色| 电影亚洲精品噜噜在线观看| 亚洲综合在线电影| 久久精品高清| 精品在线播放| 久久亚洲一区| 欧美精品中文字幕亚洲专区| 欧美亚洲福利| 狂野欧美性猛交xxxx| 日韩免费一区| 一区三区视频| 一区二区三区网站| 欧美亚洲综合视频| 美女久久99| 国产亚洲一区二区手机在线观看| 免费观看久久av| 日韩中文字幕av电影| 少妇精品久久久一区二区| 国产日韩高清一区二区三区在线| 国产精品videossex| 国产一区日韩| 久久蜜桃av| 日韩中文字幕一区二区三区| 欧美影院精品| 精品国产亚洲一区二区三区| 欧洲一级精品| 免费视频最近日韩| 欧美黄色精品| 久久精品亚洲人成影院 | 日韩欧美中文字幕在线视频| 国产福利资源一区| 日韩高清成人| 久久午夜影视| 91嫩草精品| 91亚洲一区| 亚洲综合丁香| 久久av资源| 欧美91精品| 69堂免费精品视频在线播放| 国产中文在线播放| 蜜桃一区二区三区在线观看 | 久久久久九九精品影院| 99精品电影| 日韩一区精品| 女生影院久久| 亚洲免费观看高清完整版在线观| 另类小说一区二区三区| 久久婷婷亚洲| 日本免费在线视频不卡一不卡二| а√在线中文在线新版| 久久国产精品99国产| 久久永久免费| 国产模特精品视频久久久久| 国产精品久久久久久久久久白浆 | 国产aⅴ精品一区二区三区久久| 亚洲精品a级片| 国产精品久久久免费| 午夜免费一区| 国产极品嫩模在线观看91精品| 99久久www免费| 国产精品一级在线观看| 亚洲性图久久| 国产精品99精品一区二区三区∴| 狠狠干成人综合网| 国产精品777777在线播放| 亚洲激情二区| 色乱码一区二区三区网站| 在线一区电影| 国产伊人久久| 日韩精品社区| 婷婷色综合网| 精品日产乱码久久久久久仙踪林| 首页国产欧美日韩丝袜| 国产v日韩v欧美v| 91精品国产自产精品男人的天堂| 欧美日韩精品免费观看视欧美高清免费大片| 日本电影久久久| 免费观看不卡av| 国产精品久久久久久久免费观看 | 奇米狠狠一区二区三区| 亚洲精品一二三区区别| 久久av网址| 视频一区日韩| 女人av一区| 国产日韩电影| 中文字幕日韩欧美精品高清在线| 日韩一区亚洲二区| 国产精品va| 亚洲精品黄色| 亚洲成人精品| 久久免费精品| 欧美私人啪啪vps| 中文字幕av一区二区三区四区| 日韩伦理一区| 精品一区二区男人吃奶| 日韩高清国产一区在线|