加入收藏 | 设为首页 | 会员中心 | 我要投稿 辽源站长网 (https://www.0437zz.com/)- 云专线、云连接、智能数据、边缘计算、数据安全!
当前位置: 首页 > 运营中心 > 网站设计 > 教程 > 正文

日志配置热更新技术实践

发布时间:2019-11-12 09:59:39 所属栏目:教程 来源:舟谱数据
导读:一 为什么需要服务日志热更新? 对于后端老鸟来说,一定遇到过这样的场景: 为了排查线上突发的问题,非常希望能够全面的看到请求在服务链路上的完整日志输出; But,在生产环境中,为了避免日志打印过量造成磁盘空间浪费,通常会将日志级别设定在INFO,并关

这里我们定义一个LoggerRefresher,该类重写loadDefaults和loadConfiguration方法,通过JoranConfigurator加载logback配置,并在configureByApollo中添加一个apollo事件监听器,当发现logback.xml文件有变化时,重新执行configureByApollo方法刷新日志配置。

核心代码部分如下:

  1. package com.zhoupu.zplog.refresher; 
  2.  
  3. import ch.qos.logback.classic.LoggerContext; 
  4. import ch.qos.logback.classic.joran.JoranConfigurator; 
  5. import ch.qos.logback.core.joran.spi.JoranException; 
  6. import com.ctrip.framework.apollo.Config; 
  7. import com.ctrip.framework.apollo.ConfigChangeListener; 
  8. import com.ctrip.framework.apollo.ConfigService; 
  9. import com.ctrip.framework.apollo.model.ConfigChangeEvent; 
  10. import com.ctrip.framework.apollo.spring.config.PropertySourcesConstants; 
  11. import org.slf4j.ILoggerFactory; 
  12. import org.slf4j.Logger; 
  13. import org.slf4j.LoggerFactory; 
  14. import org.springframework.boot.SpringApplication; 
  15. import org.springframework.boot.env.EnvironmentPostProcessor; 
  16. import org.springframework.context.ApplicationContextInitializer; 
  17. import org.springframework.context.ConfigurableApplicationContext; 
  18. import org.springframework.core.Ordered; 
  19. import org.springframework.core.env.ConfigurableEnvironment; 
  20. import org.springframework.util.StringUtils; 
  21.  
  22. import javax.xml.parsers.DocumentBuilder; 
  23. import javax.xml.parsers.DocumentBuilderFactory; 
  24. import java.io.ByteArrayInputStream; 
  25. import java.io.UnsupportedEncodingException; 
  26.  
  27. /** 
  28.  * 
  29.  * @author vigor 
  30.  * @date 2019/6/14 上午11:27 
  31.  */ 
  32.  
  33. public class LoggerRefresher implements ApplicationContextInitializer<ConfigurableApplicationContext>, EnvironmentPostProcessor, Ordered { 
  34.     private static final Logger log = LoggerFactory.getLogger(LoggerRefresher.class); 
  35.  
  36.     private boolean loadFlag = false; 
  37.  
  38.     @Override 
  39.     public void initialize(ConfigurableApplicationContext context) { 
  40.         ConfigurableEnvironment environment = context.getEnvironment(); 
  41.         load(environment); 
  42.  
  43.     } 
  44.  
  45.     @Override 
  46.     public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) { 
  47.         load(environment); 
  48.     } 
  49.  
  50.     @Override 
  51.     public int getOrder() { 
  52.         return 1; 
  53.     } 
  54.  
  55.     private void load(ConfigurableEnvironment environment) { 
  56.         if (!loadFlag) { 
  57.             environment.getPropertySources().forEach(ps -> { 
  58.                 if (PropertySourcesConstants.APOLLO_BOOTSTRAP_PROPERTY_SOURCE_NAME.equals(ps.getName())) { 
  59.                     configureByApollo(); 
  60.                     loadFlag = true; 
  61.                 } 
  62.             }); 
  63.         } 
  64.     } 
  65.  
  66.     private void configureByApollo() { 
  67.         Config config = ConfigService.getConfig("logback.xml"); 
  68.  
  69.         String content = config.getProperty("content", ""); 
  70.         if (StringUtils.isEmpty(content) || !validateXML(content)) { 
  71.             return; 
  72.         } 
  73.  
  74.         config.addChangeListener(new ConfigChangeListener() { 
  75.             @Override 
  76.             public void onChange(ConfigChangeEvent changeEvent) { 
  77.                 configureByApollo(); 
  78.             } 
  79.  
  80.             @Override 
  81.             public boolean equals(Object obj) { 
  82.                 if (this == obj) { 
  83.                     return true; 
  84.                 } 
  85.                 if (this.getClass().equals(obj.getClass())) { 
  86.                     return true; 
  87.                 } 
  88.                 return false; 
  89.             } 
  90.  
  91.             @Override 
  92.             public int hashCode() { 
  93.                 return 1; 
  94.             } 
  95.         }); 
  96.  
  97.         ILoggerFactory loggerFactory = LoggerFactory.getILoggerFactory(); 
  98.         LoggerContext loggerContext = (LoggerContext) loggerFactory; 
  99.         loggerContext.reset(); 
  100.         JoranConfigurator configurator = new JoranConfigurator(); 
  101.         configurator.setContext(loggerContext); 
  102.         try { 
  103.             configurator.doConfigure(new ByteArrayInputStream(content.getBytes("utf-8"))); 
  104.             log.warn("*****************************logback configureByApollo success!********************************"); 
  105.         } catch (JoranException e) { 
  106.             e.printStackTrace(); 
  107.         } catch (UnsupportedEncodingException e) { 
  108.             e.printStackTrace(); 
  109.         } 
  110.     } 
  111.  
  112.     private boolean validateXML(String xml){ 
  113.         boolean isValidated = true; 
  114.         try { 
  115.             DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); 
  116.             DocumentBuilder builder = documentBuilderFactory.newDocumentBuilder(); 
  117.             builder.parse(new ByteArrayInputStream(xml.getBytes("utf-8"))); 
  118.         } catch (Exception e) { 
  119.             log.error("apollo logback config error = {}", e); 
  120.             isValidated = false; 
  121.         } 
  122.         return isValidated; 
  123.     } 
  124.  

(编辑:辽源站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读