首页 > 作文

集成apollo动态日志取缔logback

更新时间:2023-04-05 20:16:02 阅读: 评论:0

前言

动态调整线上日志级别是一个非常常见的场景,借助apollo这种配置中心组件非常容易实现。作为apollo的官方技术支持,博主经常在技术群看到有使用者询问apollo是否可以托管logback的配置文件,毕竟有了配置中心后,消灭所有的本地配置全部交给apollo管理是我们的最终目标。可是,apollo不具备直接托管logback-spring.xml配置文件能力,但是,我们可以基于spring和logback的装载机制,完全取缔logback-spring.xml配置,以apollo中的配置驱动。而且,改造后,大大提高了日志系统的灵活性和可扩展性。

apollo动态日志

何为apollo动态日志?直接这样说可能会有歧义,以为是apollo里的日志,其实不然。举个简单的例子,比如,我们项目很多地方使用了log.debug()打印日志,为了方便通过日志信息排查问题,但是一般情况下,生产环境的日志级别会配置成info。只有遇到需要排查线上问题的时候才会临时打开debug级别日志。这个时候只能需改配置文件,将日志级别调整成debug,然后重新打包部署验证。不仅流程繁琐耗时,还会破坏当时的咸菜茨菇汤阅读答案”案发现场的环境”,导致判断不准确。如果应用具备了apollo动态日志这种能力,就只需在apollo修改下配置然后提交,就可以热更新日志级别,马上打印debug级别日志。这就是所谓的apollo动态日志。实现这个效果,需要具备两个能力,分别由spring和apollo提供

spring日志系统热更新日志级别

spring应用中,spring适配了主流的日志框架,如logback、log4j2等,在这些日志框架之上,又抽象了自己的日志系统服务,这里我们用到了spring的loggingsystem,用它来热更新日志级别,这个类在日志系统初始化时就添加到了spring的容器中,所以只要在spring的上下文管理范围内,就可以直接注入,以下为主要使用到的api描述:

apollo日志配置变更动态下发

apollo作为分布式配置中心,配置集中管理和配置热更新是其最核心的功能,此外,apollo还提供了配置变更下发监听的功能。基于这个配置监听的设计,实现动态日志就变得非常简单了。而且不仅可以实现日志动态热更,基于这个思路,连接池、数据源等都可以轻松实现。apollo实现监听配置变更有多种方式,可以通过config实例手动添加,如:

也可以通过注解直接驱动

实现日志调整热更新

有了上述能力,在结合spring支持的日志加载配置方式,如:
logturnsging.level.org.springframework.web=debug
logging.level.org.hibernate=error
可以实现如下代码完成功能,遇到需要调整日志级别时,修改apollo里的配置,即可实时生效

消灭logback-spring.xml配置

在”消灭”logback-xml配置之前,先看下这个配置文件有哪些配置信息,起到了哪些作用,下面贴出一个典型的配置文件内容:

一个典型的logback配置文件里包含了appender和日志级别设置的信息,appender可以理解为日志的输出源。如上贴出的这个配置,添加了两个appender信息,一个是spring中内置的,将紧急迫降 电影日志输出到控制台的appender。一个是将error日志信息发送到ntry应用监控平台的appender。其他的配置描述了每个包路径不同的日志级别信息。到这里,我们很容易想到,上文已经说过,spring已经支持以logging.level.包名=info这种配置来设置日志系统的日志级别。那么剩下的只要解决appender的配置就ok了。在这里,其实只需要解决ntryappender的加载就行,因为consoleappender spring自己会处理。有了目标和方向,就好办了。以logback-spring.xml配置的信息,最终都会加载成class对象。就和spring.xml配置一样。所以研究的方向就变成了logback的加载原理的问题。

logback加载原理

在java的日志生态里,除了响当当的logback、log4j2、apache common log外,还有一个日志框架不得不提,就是sl4j。正因为java生态强大,日志框架层出不穷,所以sl4j出来了,不干实事,归去来兮辞作者专门定义日志标准、规范定义接口。而且,在我们平时的编码过程中,也建议使用sl4j的api,这样,无论底层日志框架实现怎么切换,都不会影响。主流的日志框架都有实现sl4j的接口,spring中日志系统的加载也是面向的sl4j,而不是直接面向日志实现,加载过程是一个自动化的过程,系统会自动扫描实现了sl4j的接口实现,如:

每个日志框架都会实现这个接口,如logback中的loggercontext。logback所有的功能都集成在了这个context中,logback-spring.xml的配置也是为了配置loggercontext中的属性信息,所有我们只要拿到了loggercontext实例,问题就解决了一大半。这涉及到sl4j的另一个接口,获取iloggerfactory实例的接口:

logback的实现类为staticloggerbinder,也就是说,我们可以通过staticloggerbinder的getloggerfactory方法拿到loggercontext实例了。

javabean加载ntryappender

拿到logback的loggercontext后,就好办了,见代码:

看到这种代码就非常有感觉了,配置文件中的xml其实就是描述了日志组成对象以及对象的属性。在使用jav我的朋友作文a bean的方式配置时需要注意,logback的设计里,每个日志系统组成实例都有一个start状态属性,上面的start()方法其实不是动作,只是标记了这个属性为true。而在xml里这个属性只要配置了就自动激活为true了,这里必须显示的start()一下。解决了日志级别配置和appender配置后,logback-spring.xml文件就可以彻底的删除了

以上就是集成apollo动态日志取缔logback-spring.xml配置的详细内容,更多关于apollo动取缔logback-spring.xml配置的资料请关注www.887551.com其它相关文章!

本文发布于:2023-04-05 20:16:01,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/b8e53f12f3deaf62d54bb5431a16f038.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:集成apollo动态日志取缔logback.doc

本文 PDF 下载地址:集成apollo动态日志取缔logback.pdf

标签:日志   级别   配置文件   动态
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图