电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

SpringBoot如何動態改變日志級別

瀏覽:105日期: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
相關文章:
主站蜘蛛池模板: 轴流风机-鼓风机-离心风机-散热风扇-罩极电机,生产厂家-首肯电子 | 工业车间焊接-整体|集中除尘设备-激光|等离子切割机配套除尘-粉尘烟尘净化治理厂家-山东美蓝环保科技有限公司 | 东风体检车厂家_公共卫生体检车_医院体检车_移动体检车-锦沅科贸 | 电机铸铝配件_汽车压铸铝合金件_发动机压铸件_青岛颖圣赫机械有限公司 | 高效节能电机_伺服主轴电机_铜转子电机_交流感应伺服电机_图片_型号_江苏智马科技有限公司 | 斗式提升机_链式斗提机_带式斗提机厂家无锡市鸿诚输送机械有限公司 | 应急灯_消防应急灯_应急照明灯_应急灯厂家-大成智慧官网 | 心得体会网_心得体会格式范文模板 | 涡轮流量计_LWGY智能气体液体电池供电计量表-金湖凯铭仪表有限公司 | 圣才学习网-考研考证学习平台,提供万种考研考证电子书、题库、视频课程等考试资料 | 早报网| 海鲜池-专注海鲜鱼缸、移动海鲜缸、饭店鱼缸设计定做-日晟水族厂家 | 陶瓷加热器,履带式加热器-吴江市兴达电热设备厂 | 办公室家具_板式办公家具定制厂家-FMARTS福玛仕办公家具 | 压缩空气检测_气体_水质找上海京工-服务专业、价格合理 | 全国国际学校排名_国际学校招生入学及学费-学校大全网 | 热缩管切管机-超声波切带机-织带切带机-无纺布切布机-深圳市宸兴业科技有限公司 | 别墅图纸超市|别墅设计图纸|农村房屋设计图|农村自建房|别墅设计图纸及效果图大全 | 耐驰泵阀管件制造-耐驰泵阀科技(天津)有限公司 | 全自动真空上料机_粉末真空上料机_气动真空上料机-南京奥威环保科技设备有限公司 | Q361F全焊接球阀,200X减压稳压阀,ZJHP气动单座调节阀-上海戎钛 | 全自动包装秤_全自动上袋机_全自动套袋机_高位码垛机_全自动包装码垛系统生产线-三维汉界机器(山东)股份有限公司 | 专业生产动态配料系统_饲料配料系统_化肥配料系统等配料系统-郑州鑫晟重工机械有限公司 | 沈阳建筑设计公司_加固改造设计_厂房设计_设计资质加盟【金辉设计】 | 学生作文网_中小学生作文大全与写作指导 | 游泳池设备安装工程_恒温泳池设备_儿童游泳池设备厂家_游泳池水处理设备-东莞市君达泳池设备有限公司 | 超声波清洗机-超声波清洗设备定制生产厂家 - 深圳市冠博科技实业有限公司 | 注塑_注塑加工_注塑模具_塑胶模具_注塑加工厂家_深圳环科 | 上海办公室设计_办公楼,写字楼装修_办公室装修公司-匠御设计 | 作文导航网_作文之家_满分作文_优秀作文_作文大全_作文素材_最新作文分享发布平台 | 色油机-色母机-失重|称重式混料机-称重机-米重机-拌料机-[东莞同锐机械]精密计量科技制造商 | 铝合金线槽_铝型材加工_空调挡水板厂家-江阴炜福金属制品有限公司 | 上海公司注册-代理记账-招投标审计-上海昆仑扇财税咨询有限公司 上海冠顶工业设备有限公司-隧道炉,烘箱,UV固化机,涂装设备,高温炉,工业机器人生产厂家 | 卡诺亚轻高定官网_卧室系统_整家定制_定制家居_高端定制_全屋定制加盟_定制家具加盟_定制衣柜加盟 | ET3000双钳形接地电阻测试仪_ZSR10A直流_SXJS-IV智能_SX-9000全自动油介质损耗测试仪-上海康登 | 板框压滤机-隔膜压滤机-厢式压滤机生产厂家-禹州市君工机械设备有限公司 | 衬四氟_衬氟储罐_四氟储罐-无锡市氟瑞特防腐科技有限公司 | 小型气象站_车载气象站_便携气象站-山东风途物联网 | 北京模型公司-工业模型-地产模型-施工模型-北京渝峰时代沙盘模型制作公司 | 论文查重_免费论文查重_知网学术不端论文查重检测系统入口_论文查重软件 | 法兰连接型电磁流量计-蒸汽孔板节流装置流量计-北京凯安达仪器仪表有限公司 |