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

您的位置:首頁技術(shù)文章
文章詳情頁

SpringBoot如何動(dòng)態(tài)改變?nèi)罩炯?jí)別

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

關(guān)于日志級(jí)別,大部分項(xiàng)目可能都設(shè)置為info級(jí)別,當(dāng)然也可能有一些追求性能或者說包含很多敏感信息的項(xiàng)目直接將級(jí)別設(shè)置為warn或者error;這時(shí)候如果項(xiàng)目中出現(xiàn)一些未知異常,需要用到很詳細(xì)的日志信息,此時(shí)如果項(xiàng)目中沒有動(dòng)態(tài)改變?nèi)罩炯?jí)別的機(jī)制,排查問題將很棘手。

日志系統(tǒng)

我們常用的一些日志系統(tǒng)包括:Log4j2、Logback、Java Util Logging;我們想動(dòng)態(tài)改變?nèi)罩镜募?jí)別,前提是這些日志系統(tǒng)都支持我們直接設(shè)置日志等級(jí),當(dāng)然這些系統(tǒng)提供了很簡(jiǎn)單的接口;

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);

當(dāng)然除了上面直接設(shè)置日志級(jí)別的方式,也有可以動(dòng)態(tài)加載配置文件的方式,同樣也可以在配置文件中動(dòng)態(tài)改變?nèi)罩炯?jí)別,以logback為例:

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

上面簡(jiǎn)單介紹了一下每種日志系統(tǒng)都是如何去設(shè)置日志級(jí)別的,最關(guān)鍵的是設(shè)置完之后,可以實(shí)時(shí)生效,立馬可以看到我們想要的日志;有了這些下面其實(shí)就是通過何種方式去改變?nèi)罩炯?jí)別的問題了;

如何動(dòng)態(tài)改變級(jí)別

如何去動(dòng)態(tài)改變級(jí)別,最簡(jiǎn)單的方式就是對(duì)外提供一個(gè)接口,給定一個(gè)日志級(jí)別作為參數(shù)實(shí)時(shí)變更;或者通過配置中心的方式;另外其實(shí)像SpringBoot這些主流的框架本身也提供了動(dòng)態(tài)修改的功能;下面可以具體看一下是如何實(shí)現(xiàn)的,以logback為例;

自定義接口

自定義一個(gè)給定日志級(jí)別的接口,外部直接通過調(diào)用接口來改變級(jí)別:

@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';}

想要改變?nèi)罩炯?jí)別直接請(qǐng)求如下地址即可,設(shè)置一個(gè)debug的級(jí)別:

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

這種方式雖然比較簡(jiǎn)單,但是如果節(jié)點(diǎn)很多的話,操作起來就很麻煩,當(dāng)然也可以匯總所有節(jié)點(diǎn)路徑,一次操作觸發(fā)所有節(jié)點(diǎn)的請(qǐng)求;其實(shí)最好的辦法應(yīng)該是類似發(fā)布訂閱的方式,發(fā)布者會(huì)給所有訂閱者都發(fā)送一個(gè)更改日志級(jí)別的通知,有新的節(jié)點(diǎn)只要成為訂閱者即可,這種方式其實(shí)就是現(xiàn)在主流的配置中心的方式。

配置中心

配置中心的目的其實(shí)就是把一些會(huì)經(jīng)常變動(dòng)的參數(shù)集中保存起來,某個(gè)系統(tǒng)啟動(dòng)時(shí)去配置中心獲取相關(guān)的參數(shù),同時(shí)會(huì)對(duì)這些參數(shù)進(jìn)行監(jiān)聽,后面在配置中心里面改變參數(shù)的值會(huì)實(shí)時(shí)推送給相關(guān)系統(tǒng);這樣系統(tǒng)就可以在不重啟的情況下就更新了配置;利用現(xiàn)有的一些中間件我們就能很快實(shí)現(xiàn)一個(gè)配置中心,比如Zookeeper提供了對(duì)某個(gè)Node進(jìn)行監(jiān)聽的功能,MQ和Redis都有發(fā)布訂閱的功能,所以用來實(shí)時(shí)推送變更再好不過了;

Zookeeper方式

可以直接使用PathChildrenCache用來監(jiān)聽子節(jié)點(diǎn)的CHILD_ADDED,CHILD_UPDATED,CHILD_REMOVED事件;這樣如果在Zookeeper服務(wù)端對(duì)節(jié)點(diǎn)的值就行更新,客戶端會(huì)觸發(fā)以上三個(gè)事件:

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()); //日志級(jí)別更新處理break; case CHILD_REMOVED:break; default:break; } } });} MQ方式

MQ一般都有Queue和Topic方式,Topic方式其實(shí)就是訂閱發(fā)布模式,所有的集群節(jié)點(diǎn)可以訂閱某個(gè)Topic,這樣發(fā)布端發(fā)送更新日志級(jí)別的消息,其他訂閱節(jié)點(diǎn)都能收到:

//日志等級(jí)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(); //日志級(jí)別更新處理 } });} Redis方式

Redis其實(shí)除了緩存的功能,也提供了類似MQ的發(fā)布訂閱的模式;集群節(jié)點(diǎn)通過訂閱一個(gè)channel,發(fā)布端通過此channel來發(fā)布消息:

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

SpringBoot2.0之后可以通過actuator動(dòng)態(tài)調(diào)整日志級(jí)別,主要是通過暴露loggers這個(gè)endpoint來實(shí)現(xiàn),具體步驟如下:

需要引入actuator

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

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

management.endpoints.web.exposure.include=loggers 查看日志級(jí)別

啟動(dòng)服務(wù)可以通過:

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

查看當(dāng)前項(xiàng)目每個(gè)包的日志級(jí)別:

{levels: [ 'OFF','ERROR','WARN','INFO','DEBUG','TRACE'],loggers: { ROOT: { configuredLevel: 'INFO', effectiveLevel: 'INFO' },...} 動(dòng)態(tài)修改日志級(jí)別

發(fā)送POST請(qǐng)求到:

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

需要在body中指定configuredLevel參數(shù);比如修改整個(gè)項(xiàng)目日志級(jí)別為error:

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

SpringBoot如何動(dòng)態(tài)改變?nèi)罩炯?jí)別

關(guān)于SpringBoot內(nèi)部是如何實(shí)現(xiàn)動(dòng)態(tài)改變?nèi)罩炯?jí)別的,可以查看其實(shí)現(xiàn)核心類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來對(duì)日志系統(tǒng)動(dòng)態(tài)改變級(jí)別,上面也介紹了主流使用的日志系統(tǒng),SpringBoot也都支持這些系統(tǒng),這是一個(gè)抽象類,具體實(shí)現(xiàn)類:

JavaLoggingSystem Log4J2LoggingSystem LogbackLoggingSystem NoOpLoggingSystem

分別對(duì)應(yīng)了幾種日志系統(tǒng),這幾個(gè)類內(nèi)部其實(shí)也是調(diào)用上面介紹的方法去改變?nèi)罩炯?jí)別,當(dāng)然SpringBoot自動(dòng)會(huì)識(shí)別出當(dāng)前使用的是哪個(gè)日志系統(tǒng),然后使用哪個(gè)LoggingSystem;

總結(jié)

大部分公司其實(shí)更多的還是使用配置中心的方式來動(dòng)態(tài)改變?nèi)罩炯?jí)別,這種方式更加靈活,而且配置中心已經(jīng)成為很多公司的標(biāo)配組件,不光用來改變?nèi)罩炯?jí)別,所有有可能改變的參數(shù)都可以使用。

以上就是SpringBoot如何動(dòng)態(tài)改變?nèi)罩炯?jí)別的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot 動(dòng)態(tài)改變?nèi)罩炯?jí)別的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Spring
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产精品99在线观看| 综合色一区二区| 国产欧美一区二区三区米奇| 日韩午夜视频在线| 国产一区91| 性色av一区二区怡红| 性一交一乱一区二区洋洋av| 视频一区二区三区中文字幕| 热久久国产精品| 视频一区二区不卡| 蜜桃视频在线观看一区二区| 亚洲精品黄色| 日韩精品高清不卡| 国产精品高清一区二区| 国产精品香蕉| 国产激情精品一区二区三区| 国产一区二区三区国产精品| 日韩国产激情| 婷婷丁香综合| 亚洲深夜影院| 日韩中文字幕av电影| 日韩黄色在线观看| 另类欧美日韩国产在线| 桃色av一区二区| av亚洲在线观看| 中文字幕成人| 美女av一区| 色婷婷精品视频| 麻豆亚洲精品| 国产精品亚洲人成在99www| 国产aⅴ精品一区二区四区| 久久精品青草| 中文字幕日韩高清在线| 欧美激情日韩| 播放一区二区| 亚洲一区国产| 国产精品白丝久久av网站| 亚洲精品.com| 综合亚洲色图| 高清一区二区| 老色鬼久久亚洲一区二区| 欧美激情在线精品一区二区三区| 中文在线资源| 久久一二三区| 美女高潮久久久| 欧美日韩三区| 国产精品白丝一区二区三区| 亚洲成人国产| 日韩va亚洲va欧美va久久| 欧美日韩国产观看视频| 影音国产精品| 欧美激情福利| 91精品一区二区三区综合在线爱| 午夜电影一区| а√天堂8资源中文在线| 国产精品婷婷| 麻豆91精品91久久久的内涵| 妖精视频成人观看www| 国产精品久久久网站| 国产精品97| 精品美女视频| 亚洲最新av| 亚洲黄色免费av| 色狠狠一区二区三区| 欧美成人a交片免费看| 午夜久久美女| 精品国产乱码久久久久久1区2匹| 丝袜美腿亚洲一区二区图片| 久久久久久夜| 欧美一级二区| 亚洲国产专区校园欧美| 国产精品麻豆成人av电影艾秋| 日韩视频二区| 97精品国产| 91成人精品在线| 亚洲精品中文字幕乱码| 久久精品国产免费| 亚洲精品九九| 亚州av乱码久久精品蜜桃| 精品一区二区三区的国产在线观看| 午夜精品一区二区三区国产| 精品视频一区二区三区在线观看 | 亚洲一区二区三区中文字幕在线观看| 国产一区二区久久久久| 日韩成人一级| 99国产精品99久久久久久粉嫩| 美女久久99| 欧美亚洲一级| 日本一区二区三区视频在线看| 亚洲激情不卡| 久久久天天操| 国产成年精品| 麻豆精品在线观看| 91亚洲精品视频在线观看 | 最新国产精品| 视频精品一区二区| 在线精品视频在线观看高清| 日韩黄色大片网站| 久久这里只有| 亚洲我射av| 亚洲免费影院| 激情婷婷久久| 91精品一区二区三区综合| 日韩影院二区| 日韩伦理福利| 国产精品久久久久久久久妇女| 国产精品久久国产愉拍| 欧美亚洲tv| 欧美日韩亚洲国产精品| 日本精品国产| 日韩国产欧美在线播放| 无码日韩精品一区二区免费| 亚洲狼人精品一区二区三区| 天堂成人国产精品一区| 欧美中文字幕一区二区| 久久国产中文字幕| 亚洲婷婷免费| 欧美+日本+国产+在线a∨观看| 亚洲a在线视频| 欧美日韩精品一区二区视频| 亚洲午夜黄色| 欧美日韩精品一本二本三本| 黄色亚洲在线| 日韩中文字幕一区二区三区| 蜜臀国产一区二区三区在线播放| 亚洲作爱视频| 蜜桃av一区二区三区电影| 伊人久久一区| 日本在线不卡视频| 天堂av一区| 国产日韩视频在线| 免费亚洲婷婷| 国产在线观看www| 天堂√中文最新版在线| 性欧美xxxx免费岛国不卡电影| 亚洲精品电影| 亚洲精品极品| 欧美日韩一视频区二区| 久久精品国产999大香线蕉| 久久久久久婷| 日韩精品一卡| 免费精品视频最新在线| 日本强好片久久久久久aaa| 国产日产一区| 国产精品任我爽爆在线播放| 国产成人黄色| 国产精品91一区二区三区| 最新亚洲国产| 国产精品www994| 欧美少妇精品| 国产精品日本欧美一区二区三区| 亚洲aa在线| 麻豆精品国产91久久久久久| 性欧美videohd高精| 9久re热视频在线精品| 日韩国产欧美三级| 丰满少妇一区| 亚洲综合不卡| 欧美黑人巨大videos精品| 成人在线超碰| 久久亚洲专区| 日韩在线观看中文字幕| 欧美交a欧美精品喷水| 青青青免费在线视频| 国产精品老牛| 久久av中文| 99久久久久久中文字幕一区| 亚洲视频国产精品| 精品91福利视频| 不卡一区2区| 国产丝袜一区| 欧美综合另类| 欧美一级二级视频| 丝袜美腿一区| 在线观看一区| 精品一区二区三区免费看 | 国产精品成久久久久| 欧美特黄一级| 嫩草伊人久久精品少妇av杨幂| 日韩欧美国产精品综合嫩v| 蜜桃视频一区二区| 成人在线免费观看网站| 蜜臀久久久99精品久久久久久| 麻豆国产精品| 国产精品普通话对白| 欧美精品不卡| 亚洲二区免费| 国产欧美在线| 欧美日韩国产高清| 老牛国内精品亚洲成av人片 | 色爱av综合网| 日韩不卡在线观看日韩不卡视频 | 精品亚洲自拍| 另类国产ts人妖高潮视频| 久久av日韩| 亚洲综合图色| 美女一区网站| 青草综合视频| 91久久黄色| 免费观看亚洲|