国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

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

SpringBoot如何動態(tài)改變日志級別

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

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

日志系統

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

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

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

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

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

如何動態(tài)改變級別

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

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

配置中心

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

Zookeeper方式

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

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方式其實就是訂閱發(fā)布模式,所有的集群節(jié)點可以訂閱某個Topic,這樣發(fā)布端發(fā)送更新日志級別的消息,其他訂閱節(jié)點都能收到:

//日志等級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的發(fā)布訂閱的模式;集群節(jié)點通過訂閱一個channel,發(fā)布端通過此channel來發(fā)布消息:

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動態(tài)調整日志級別,主要是通過暴露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' },...} 動態(tài)修改日志級別

發(fā)送POST請求到:

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

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

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

SpringBoot如何動態(tài)改變日志級別

關于SpringBoot內部是如何實現動態(tài)改變日志級別的,可以查看其實現核心類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來對日志系統動態(tài)改變級別,上面也介紹了主流使用的日志系統,SpringBoot也都支持這些系統,這是一個抽象類,具體實現類:

JavaLoggingSystem Log4J2LoggingSystem LogbackLoggingSystem NoOpLoggingSystem

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

總結

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

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

標簽: Spring
相關文章:
主站蜘蛛池模板: 日日摸天天摸狠狠摸视频 | 久久性久久性久久久爽 | 日韩av线上| 美女黄色一级毛片 | 欧美变态一级毛片 | 亚洲国产精品91 | 性欧美巨大的视频 | 黄色三级免费 | 欧美一级毛片怡红院 | 亚洲精品一区二区三区在 | 国产精品一区伦免视频播放 | 九九精品免视频国产成人 | 新婚第一次一级毛片 | 青青草色久综合网 | 亚洲第一网色综合久久 | 日本 欧美 国产 | 一本色道久久88 | 韩国免费网站成人 | 亚洲日本一区二区三区在线 | 在线日本视频 | 全国最大色成免费网站 | 国内精品国语自产拍在线观看55 | 手机免费毛片 | 亚洲黄色免费网址 | 精品久久久日韩精品成人 | 亚洲视频在线精品 | 国产精品久久久久久一区二区三区 | 日韩欧美视频在线一区二区 | 加勒比在线免费视频 | 成人欧美日韩视频一区 | 欧美一级高清免费播放 | 日韩理论在线 | 精品综合 | 美国一级毛片免费看 | 国产成人精品免费 | 九九re6精品视频在线观看 | 日韩在线一区二区三区 | 婷婷尹人香蕉久久天堂 | 欧美极度另类 | 国产精品夜色视频一级区 | 免费一级视频在线播放 |