千家信息网

如何理解集成apollo动态日志

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,本篇内容介绍了"如何理解集成apollo动态日志"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!前言动
千家信息网最后更新 2026年10月31日如何理解集成apollo动态日志

本篇内容介绍了"如何理解集成apollo动态日志"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

前言

动态调整线上日志级别是一个非常常见的场景,借助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描述:

/**     * 设置给定日志记录器的日志级别.     * @param loggerName 要设置的日志记录器的名称({@code null}可用于根日志记录器)。     * @param level 日志级别     */    public void setLogLevel(String loggerName, LogLevel level) {        throw new UnsupportedOperationException("Unable to set log level");    }
apollo日志配置变更动态下发

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

@ApolloConfig    public Config config;        public void addConfigChangeListener(){        config.addChangeListener(changeEvent->{            System.out.println("config change keys" + changeEvent.changedKeys());        });    }

也可以通过注解直接驱动

@ApolloConfigChangeListener    public void addConfigChangeListener(ConfigChangeEvent changeEvent){            System.out.println("config change keys" + changeEvent.changedKeys());    }
实现日志调整热更新

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

@Configurationpublic class LogbackConfiguration {    private static final Logger logger = LoggerFactory.getLogger(LoggerConfiguration.class);    private static final String LOGGER_TAG = "logging.level.";    private final LoggingSystem loggingSystem;    public LogbackConfiguration(LoggingSystem loggingSystem) {        this.loggingSystem = loggingSystem;    }    @ApolloConfigChangeListener    private void onChange(ConfigChangeEvent changeEvent) {        for (String key : changeEvent.changedKeys()) {            if (this.containsIgnoreCase(key, LOGGER_TAG)) {                String strLevel = changeEvent.getChange(key).getNewValue();                LogLevel level = LogLevel.valueOf(strLevel.toUpperCase());                loggingSystem.setLogLevel(key.replace(LOGGER_TAG, ""), level);                logger.info("logging changed: {},oldValue:{},newValue:{}", key, changeEvent.getChange(key).getOldValue(), strLevel);            }        }    }        private boolean containsIgnoreCase(String str, String searchStr) {        if (str == null || searchStr == null) {            return false;        }        int len = searchStr.length();        int max = str.length() - len;        for (int i = 0; i <= max; i++) {            if (str.regionMatches(true, i, searchStr, 0, len)) {                return true;            }        }        return false;    }}

消灭logback-spring.xml配置

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

                ERROR                                            

一个典型的logback配置文件里包含了Appender和日志级别设置的信息,Appender可以理解为日志的输出源。如上贴出的这个配置,添加了两个Appender信息,一个是spring中内置的,将日志输出到控制台的Appender。一个是将error日志信息发送到Sentry应用监控平台的Appender。其他的配置描述了每个包路径不同的日志级别信息。到这里,我们很容易想到,上文已经说过,spring已经支持以logging.level.包名=info这种配置来设置日志系统的日志级别。那么剩下的只要解决Appender的配置就ok了。在这里,其实只需要解决SentryAppender的加载就行,因为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的接口实现,如:

public interface ILoggerFactory {    public Logger getLogger(String name);}

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

public interface LoggerFactoryBinder {    public ILoggerFactory getLoggerFactory();    public String getLoggerFactoryClassStr();}

Logback的实现类为StaticLoggerBinder,也就是说,我们可以通过StaticLoggerBinder的getLoggerFactory方法拿到LoggerContext实例了。

javaBean加载SentryAppender

拿到Logback的LoggerContext后,就好办了,见代码:

@Configurationpublic class LogbackConfiguration {    private final LoggerContext ctx = (LoggerContext) StaticLoggerBinder.getSingleton().getLoggerFactory();    @Bean    @Profile(PROD_ENV)    public void initSenTry() {        SentryAppender sentryAppender = new SentryAppender();        sentryAppender.setContext(ctx);        ThresholdFilter filter = new ThresholdFilter();        filter.setLevel(Level.ERROR.levelStr);        filter.start();        sentryAppender.addFilter(filter);        sentryAppender.start();        ctx.addTurboFilter(new TurboFilter() {            @Override            public FilterReply decide(Marker marker, ch.qos.logback.classic.Logger logger, Level level, String format, Object[] params, Throwable t) {                logger.addAppender(sentryAppender);                return FilterReply.NEUTRAL;            }        });    }}

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

"如何理解集成apollo动态日志"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

日志 配置 级别 动态 信息 文件 系统 框架 接口 实例 属性 更新 功能 能力 过程 问题 调整 代码 内容 可以通过 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 高科技互联网 没上市的科技互联网公司 网络科技有限互联网 互联网科技汛 互联网科技有限公司 翻译 开启互联网科技时代小说 西藏七维空间互联网科技有限公司 恒银科技与互联网金融 阿里互联网科技公司 互联网公司科技股 中国互联网十大科技股排名 互联网金融科技名词解释 合肥互联网科技公司公章图片 宁波跨境商互联网科技有限公司 互联网科技接地气 互联网时代科技型公司的机会 上海万顺科技互联网有限公司招聘 广西泛欧互联网科技有限公司 安徽九吞吴互联网科技有限公司 六子台科技互联网展会 互联网科技英文 成都互联网科技公司 贷财互联网科技 壕鑫互联网络科技 老年人脱离互联网科技的作文 云创客互联网科技公司 用友工业互联网科技发展 下一代互联网重大应用科技园 新氧科技和美国互联网有关系吗 伍佰万互联网科技是干嘛的
0