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

日志配置热更新技术实践

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

 日志配置热更新技术实践

一 为什么需要服务日志热更新?

对于后端老鸟来说,一定遇到过这样的场景:

为了排查线上突发的问题,非常希望能够全面的看到请求在服务链路上的完整日志输出;

But,在生产环境中,为了避免日志打印过量造成磁盘空间浪费,通常会将日志级别设定在INFO,并关闭一般情况用不到的日志输出;

在不重启服务的情况下,开启本已经关闭的业务日志输出,能不能搞的定呢?答案是当然没问题。

二 需求分析

熟悉logback的同学此时肯定已经想到通过扫描监听logback.xml文件配置变化来实现日志级别的调整,像如下这种方式:

  1. <configuration debug="true" scan="true" scanPeriod="1 seconds"> 

但通常情况下,你的业务服务是分布式部署的,后端节点有多台,如果一台台的去改,且不说运维大哥未必就会同意给你生产机器文件的修改权限,即使可以,这么做未免有些过于“老实”了;有没有一种可以集中管理日志配置,修改文件后再逐个分发给各节点的解决方案呢?沿着这个思路,自然而然就会联想到配置中心,这里,我主要介绍携程开源的apollo,同类的配置中心产品还有百度Disconf、阿里ACM和Spring Cloud Config,感兴趣的自行研究。

三 做实验

熟悉apollo文件管理的同学都知道,apollo通过推拉结合的方式将服务端存储的应用配置文件缓存到本地是以properties的格式存储的,如下面所示:

demo+dev+logback.xml.properties

  1. content=<?xml version="1.0" encoding="UTF-8"?>n<configuration debug="true">nt<property name="encoding" value="UTF-8"/>nnt<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">ntt<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">nttt<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS}|%X{requestId}|[%t] %-5level %logger{50} %line - %m%n</pattern>ntt</encoder>nt</appender>nnt<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">ntt<file>logs/brm.log</file>ntt<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">nttt<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS}|%X{requestId}|%X{requestSeq}|[%t] %-5level %logger{50} %line - %m%n</pattern>ntt</encoder>ntt<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">nttt<fileNamePattern>logs/brm-%d{yyyy-MM-dd-HH}-%i.log</fileNamePattern>>nttt<!--单个文件切割阈值,超过生成新log文件-->nttt<maxFileSize>200MB</maxFileSize>nttt<!--最大保留天数-->nttt<maxHistory>336</maxHistory>ntt</rollingPolicy>nt</appender>nn    <!--log4jdbc -->n    <logger name="jdbc.sqltiming" level="INFO"/>n    <logger name="jdbc.sqlonly" level="OFF"/>n    <logger name="jdbc.audit" level="OFF"/>n    <logger name="jdbc.resultset" level="OFF"/>n    <logger name="jdbc.resultsettable" level="OFF"/>n    <logger name="jdbc.connection" level="OFF"/>n        nt<root level="INFO">ntt<appender-ref ref="STDOUT"/>ntt<appender-ref ref="FILE"/>nt</root>n</configuration> 

HH:mm:ss.SSS}|%X{requestId}|%X{requestSeq}|[%t] %-5level %logger{50} %line - %m%n nttnttntttlogs/brm-%d{yyyy-MM-dd-HH}-%i.log>nttt<!--单个文件切割阈值,超过生成新log文件-->nttt200MBnttt<!--最大保留天数-->nttt336nttntnn <!--log4jdbc -->n n n n n n n ntnttnttntn

而我们通常在配置logback的时候使用的是xml文件;

因此,我们要想办法让logback能够加载context的内存值信息。

阅读logback资料发现,JoranConfigurator支持我们以自定义的方式配置logback,

而springboot是通过LoggingSystem来加载管理日志系统的;如果我能在springboot启动的时候指定我自定义的日志加载类,问题便迎刃而解。

(编辑:辽源站长网)

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

推荐文章
    热点阅读