文档章节

logback日志级别的动态修改

小舒舒_
 小舒舒_
发布于 2017/05/31 22:44
字数 685
阅读 741
收藏 0
点赞 1
评论 6

动态调整logback日志级别

在生产环境中,我们经常需要通过调整日志输出级别来提升系统性能,找出程序BUG等。我们不太可能每次调整程序日志级别都要重启服务,这样代价太高特别是生产环境。

讲道理,如果是我们自己写程序类似这样的需求我们肯定会提供接口来动态调整,相信logback也一定有这样的接口,以下在官方文档中找到的方案:

https://logback.qos.ch/manual/jmxConfig.html

 

通过该文章我们能看到logback提供的方式是JMX接口;

你可以通过jcontrol来动态控制MBean 远程的或者本地的,同时也可以通过第三方中间件来控制,通常是提供web的方式进行控制。

 

 

即使第三方插件(比如mx4j)也是在java 标准库中提供的相关MBean API进行的操作,如果你需要管理的东西并不复杂完全可以直接写个接口来实现,避免了配置和不同环境带来的麻烦。

由于我们的项目是Spring boot的同时服务器的管理tomcat权限我们都没有,而且我们只是想实现动态修改日志级别,所以这里选择了自己写接口。讲道理现在自己实现要动态修改对象状态也不一定要用JMX,方案多的去了!

JMX:

JMX(Java Management Extensions,即Java管理扩展)是一个为应用程序、设备、系统等植入管理功能的框架。JMX可以跨越一系列异构操作系统平台、系统体系结构和网络传输协议,灵活的开发无缝集成的系统、网络和服务管理应用。

以上是比较官方的解释,自己理解通俗的讲就是JVM提供了一个管理bean的办法,而这些被管理的bean叫做MBean,所以你要按照JVM提供的规则来写程序才能被jvm所管理,你才能程序或者人工的去维护这些bean。

 

 

以下是通过网络找的demo并做了修改,稍微读一读就能明白。

MBean的接口必须以MBean结尾

 

实现必须以Hello命名因为接口定义是HelloMBean

 

测试代码

很简单吧!

 

通过logback官方的文档以及对JMX的理解,现在我们来做动态修改日志级别代码就会很简单,你可以通过jconsole查看到logback的命名空间,这里我就直接贴出来

ch.qos.logback.classic:Name=default,Type=ch.qos.logback.classic.jmx.JMXConfigurator

下面是修改接口的demo:

 

OK!现在大功告成了~

© 著作权归作者所有

共有 人打赏支持
小舒舒_
粉丝 1
博文 12
码字总数 13303
作品 0
浦东
高级程序员
加载中

评论(6)

小舒舒_
小舒舒_

引用来自“lexus-yan”的评论

想请教下博主,如何通过http请求在controller中修改远程web应用的logback日志级别,不知如何调用....其他远程的web应用日志系统都是用logback且知道他们的ip地址和端口,谢谢!
如果你们系统只有一个的话很好办,直接掉restful接口就可以了,如果是分布式的,个人觉得可以用ZK、消息中间件(如果系统使用了的话,当然大多分布式系统多半是有的),以事件触发的方式修过所有节点,有的分布式系统还不会有单独的日志模块,通过消息队列发送,可以写到磁盘也可以写到HDFS这就要根据具体情况而定了
lexus-yan
lexus-yan
想请教下博主,如何通过http请求在controller中修改远程web应用的logback日志级别,不知如何调用....其他远程的web应用日志系统都是用logback且知道他们的ip地址和端口,谢谢!
dong4j
dong4j

引用来自“shushangjin”的评论

引用来自“dong4j”的评论

首先感谢博主的这篇博客,已经解决动态修改日志级别的问题.
这里对这篇博客提出几点问题:

server.invoke中
楼主直接传入path, 这个path应该是日志配置文件的路径, 我想这样做应该是修改配置文件,然后重新加载,从而达到修改日志级别的作用. 但是为什么不直接使用setLoggerLevel方法? 这样做的话我们就不用在生产环境中修改一次日志配置,然后在调用这个接口了
我这个只是一个demo程序,包括里面一些打印都是没有必要的,我只是想看看是啥,这个demo的目的是有一个修改日志级别的方法,当然还有其他API可以修改比如修改特定log的级别,或者说有的接口压力比较大可能需要单独对其做特殊降级都是可以的,但是黑心的东西都和这个demo类似~只是我们大多数时候都是修改配置文件所以用的这个方式,总结就是触类旁通,更具具体需求可以做特殊的写发~

@shushangjin 博主说的是 已经通过JMX结合zookeeper动态修改集群中某个应用的日志级别
b
blc1314
写得很好:smile:
小舒舒_
小舒舒_

引用来自“dong4j”的评论

首先感谢博主的这篇博客,已经解决动态修改日志级别的问题.
这里对这篇博客提出几点问题:

server.invoke中
楼主直接传入path, 这个path应该是日志配置文件的路径, 我想这样做应该是修改配置文件,然后重新加载,从而达到修改日志级别的作用. 但是为什么不直接使用setLoggerLevel方法? 这样做的话我们就不用在生产环境中修改一次日志配置,然后在调用这个接口了
我这个只是一个demo程序,包括里面一些打印都是没有必要的,我只是想看看是啥,这个demo的目的是有一个修改日志级别的方法,当然还有其他API可以修改比如修改特定log的级别,或者说有的接口压力比较大可能需要单独对其做特殊降级都是可以的,但是黑心的东西都和这个demo类似~只是我们大多数时候都是修改配置文件所以用的这个方式,总结就是触类旁通,更具具体需求可以做特殊的写发~
dong4j
dong4j
首先感谢博主的这篇博客,已经解决动态修改日志级别的问题.
这里对这篇博客提出几点问题:

server.invoke中
楼主直接传入path, 这个path应该是日志配置文件的路径, 我想这样做应该是修改配置文件,然后重新加载,从而达到修改日志级别的作用. 但是为什么不直接使用setLoggerLevel方法? 这样做的话我们就不用在生产环境中修改一次日志配置,然后在调用这个接口了
Spring Boot学习笔记—日志

开发应用时,日志框架的依赖是不可避免的。应用依赖的其他框架中,可能又依赖了其他不同的框架,例如你的应用使用的Logback,但Spring系列框架使用的Log4j,还有某某框架依赖的Commons Loggi...

chace0120 ⋅ 2015/12/23 ⋅ 0

Java日志系统研究

基本功能 1. 支持多个等级的日志打印:trace,debug,warning,error等等1. 支持按照不同的包名指定不同的等级1. 支持设置全局的默认日志等级1. 打印日志到单个或者多个文件,文件可以按指定...

landyking ⋅ 2016/07/18 ⋅ 0

Java日志框架-logback的介绍及配置使用方法(纯Java工程)(转)

说明:内容估计有些旧,2011年的,但是大体意思应该没多大变化,最新的配置可以参考官方文档。 一、logback的介绍 Logback是由log4j创始人设计的又一个开源日志组件。logback当前分成三个模块...

easonjim ⋅ 2017/11/07 ⋅ 0

logback 配置详解(一)

一:根节点<configuration>包含的属性: scan: 当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。 scanPeriod: 设置监测配置文件是否有修改的时间间隔,如果没有...

有资本再款 ⋅ 2015/12/06 ⋅ 0

LogBack入门实践

一、简介 LogBack是一个日志框架,它是Log4j作者Ceki的又一个日志组件。 LogBack,Slf4j,Log4j之间的关系 slf4j是The Simple Logging Facade for Java的简称,是一个简单日志门面抽象框架,它...

jiangmitiao ⋅ 2016/03/26 ⋅ 2

logback logback.xml 常用配置详解

阅读背景: 您可能需要对log4j,sl4j 有一些初步的了解。 阅读目的:深刻的理解logback的常用配置<Configuration> AND <logger> 1 : 根节点<Configuration>包含的属性 一:<Configuration ......

止静 ⋅ 2014/09/10 ⋅ 0

logback logback.xml 常用配置详解

一:根节点包含的属性: scan: 当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。 scanPeriod: 设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默...

路小磊 ⋅ 2014/08/06 ⋅ 7

logback与Log4J的区别

Logback和log4j是非常相似的,如果你对log4j很熟悉,那对logback很快就会得心应手。下面列了logback相对于log4j的一些优点: 更快的实现 Logback的内核重写了,在一些关键执行路径上性能提升...

凯文加内特 ⋅ 2015/05/08 ⋅ 0

Spring Boot Logging 配置

Spring Boot 能够使用Logback, Log4J2 , java util logging 作为日志记录工具。Spring Boot 默认使用Logback作为日志记录工具。日志默认输出到控制台但也能输出到文件中。我们通过spring-bo...

墨明棋妙麟 ⋅ 2017/09/10 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

从 Confluence 5.3 及其早期版本中恢复空间

如果你需要从 Confluence 5.3 及其早期版本中的导出文件恢复到晚于 Confluence 5.3 的 Confluence 中的话。你可以使用临时的 Confluence 空间安装,然后将这个 Confluence 安装实例升级到你现...

honeymose ⋅ 今天 ⋅ 0

用ZBLOG2.3博客写读书笔记网站能创造今日头条的辉煌吗?

最近两年,著名的自媒体网站今日头条可以说是火得一塌糊涂,虽然从目前来看也遇到了一点瓶颈,毕竟发展到了一定的规模,继续增长就更加难了,但如今的今日头条规模和流量已经非常大了。 我们...

原创小博客 ⋅ 今天 ⋅ 0

MyBatis四大核心概念

本文讲解 MyBatis 四大核心概念(SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession、Mapper)。 MyBatis 作为互联网数据库映射工具界的“上古神器”,训有四大“神兽”,谓之:Sql...

waylau ⋅ 今天 ⋅ 0

以太坊java开发包web3j简介

web3j(org.web3j)是Java版本的以太坊JSON RPC接口协议封装实现,如果需要将你的Java应用或安卓应用接入以太坊,或者希望用java开发一个钱包应用,那么用web3j就对了。 web3j的功能相当完整...

汇智网教程 ⋅ 今天 ⋅ 0

2个线程交替打印100以内的数字

重点提示: 线程的本质上只是一个壳子,真正的逻辑其实在“竞态条件”中。 举个例子,比如本题中的打印,那么在竞态条件中,我只需要一个方法即可; 假如我的需求是2个线程,一个+1,一个-1,...

Germmy ⋅ 今天 ⋅ 0

Springboot2 之 Spring Data Redis 实现消息队列——发布/订阅模式

一般来说,消息队列有两种场景,一种是发布者订阅者模式,一种是生产者消费者模式,这里利用redis消息“发布/订阅”来简单实现订阅者模式。 实现之前先过过 redis 发布订阅的一些基础概念和操...

Simonton ⋅ 今天 ⋅ 0

error:Could not find gradle

一.更新Android Studio后打开Project,报如下错误: Error: Could not find com.android.tools.build:gradle:2.2.1. Searched in the following locations: file:/D:/software/android/andro......

Yao--靠自己 ⋅ 昨天 ⋅ 0

Spring boot 项目打包及引入本地jar包

Spring Boot 项目打包以及引入本地Jar包 [TOC] 上篇文章提到 Maven 项目添加本地jar包的三种方式 ,本篇文章记录下在实际项目中的应用。 spring boot 打包方式 我们知道,传统应用可以将程序...

Os_yxguang ⋅ 昨天 ⋅ 0

常见数据结构(二)-树(二叉树,红黑树,B树)

本文介绍数据结构中几种常见的树:二分查找树,2-3树,红黑树,B树 写在前面 本文所有图片均截图自coursera上普林斯顿的课程《Algorithms, Part I》中的Slides 相关命题的证明可参考《算法(第...

浮躁的码农 ⋅ 昨天 ⋅ 0

android -------- 混淆打包报错 (warning - InnerClass ...)

最近做Android混淆打包遇到一些问题,Android Sdutio 3.1 版本打包的 错误如下: Android studio warning - InnerClass annotations are missing corresponding EnclosingMember annotation......

切切歆语 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部