日志系统改造执行方案

日志系统完善方案

背景现状

当前业务环境没有统一的日志输出格式,日志文件只能通过HTTP下载,运维人员处理效率低,需要将服务接入日志系统规范及适配性改造等(约150个微服务);服务增加日志采集(约100个微服务)

目标

通过完善日志系统集中收集日志,升级日志链路ID规范,通过打通日志系统链路ID和听云系统链路ID;提高运维效率,缩短问题定位时间由原来的2天降低至1天内

技术栈选择

  • 采集层:Filebeat(轻量级日志采集)
  • 缓冲层:Kafka(高吞吐消息队列,削峰填谷)
  • 处理层:Logstash(日志解析、过滤、富化)
  • 存储层:Elasticsearch(分布式搜索与存储)
  • 展示层:Kibana(可视化分析与仪表盘)

现状与升级后对比总览

image-20250427101921424

系统设计

  1. 应用程序日志采集设计
    1. 业务集群变更:
      • 在启动命令中加入听云Agent,日志输出时调用链路ID。
      • 统一日志输出模板,升级服务接入日志规范。
      • 日志系统收集全部业务日志。
      • 修改本地存储日期策略,节省服务器磁盘空间。
      • 提供日志收集级别配置,根据实际情况调整日志收集级别。
    2. 日志滚动生成:定义并规范日志输出的统一格式,确保日志按一定规则滚动生成。
    3. Filebeat配置:开启Filebeat配置,用于收集服务日志,指定日志地址、Kafka的topic名字及服务名。Filebeat将采集到的日志文件发送到Kafka的指定topic中。
  2. 存储策略设计
    1. Kafka:作为日志的缓冲和分发层,接收来自Filebeat的日志数据。
    2. Logstash:
      • 根据Kafka的topic配置不同的输入、过滤器和输出规则。
      • 使用Logstash配置ES索引,并关联不同的索引生命周期,设置数据存储时间。在匹配过滤规则中,配置解析日志内容中的关键字段属性,用于在Kibana上独立展示。
    3. Elasticsearch:存储经过Logstash过滤和解析后的日志数据。针对协议报文数据量大和业务服务产生的日志,分别设置不同的过期时间(如7天和30天)。
  3. 可视化及监控设计
    1. Kibana:结合听云Agent输出的链路ID,进行日志查询,跟踪完整的链路过程。
    2. 异常监控:实时监控服务日志,提取异常信息(如404、500异常,OOM异常及业务定义的异常码),并通过邮件等方式推送异常、告警信息给运维人员。
    3. Kibana展示:按照Logstash解析出的关键字段属性(如服务名、服务IP地址、日志文件地址、时间戳、主机名等)进行展示和检索。

详细设计

定义并规范日志输出的统一格式

1)日志格式为

​ 业务日志:【时间+日志级别+线程ID+类名&方法名&行号+日志信息】

​ 协议日志:【TID+CMD(协议号)+时间戳+主机IP+原始报文】

2)协议日志按照协议日志格式,调整输出至ELK

3)业务日志使用 logback-spring.xml统一日志配置,针对非生产环境输出debug级别,生产环境输出info及以上级别

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">

<property name="log_type" value="slf4j" scope="context"/>
<!--
%d: 时间,按照yyyy-MM-dd HH:mm:ss.SSS输出
%-5p:日志级别,按左对齐
%thread:线程号
%C{1}:全类名,前面包名只显示首字母,最后的类显示完整的类名
%M:方法名
%L: 行号
%msg:日志内容
%n:换行
-->
<property name="log_pattern"
value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5p] [%thread] [%C{1}:%M:%L] %msg%n"/>

<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<!-- 设置字符集 -->
<charset>UTF-8</charset>
<pattern>${log_pattern}</pattern>
</encoder>
</appender>


<!-- 对于类路径以 com.example.logback 开头的Logger,输出级别设置为warn,并且只输出到控制台 -->
<!-- 这个logger没有指定appender,它会继承root节点中定义的那些appender -->
<!-- <logger name="com.example.logback" level="warn"/> -->

<!--通过 LoggerFactory.getLogger("myLog") 可以获取到这个logger-->
<!--由于这个logger自动继承了root的appender,root中已经有stdout的appender了,自己这边又引入了stdout的appender-->
<!--如果没有设置 additivity="false" ,就会导致一条日志在控制台输出两次的情况-->
<!--additivity表示要不要使用rootLogger配置的appender进行输出-->


<logger name="com.alibaba.nacos.client" level="ERROR"/>
<logger name="org.springframework.boot" level="INFO"/>
<logger name="org.mybatis.spring" level="INFO"/>

<!-- 日志输出级别及方式 -->
<root level="INFO">
<appender-ref ref="console"/>
</root>


</configuration>

微服务接入日志平台规范、接入听云SDK及适配性改造

  • 修改应用程序的启动命令,加入听云Agent。

    • 如 java -jar -javaagent:tingyun-agent.jar xxx.jar

    • $jdk -jar -Xms2g -Xmx2g $jvmops $jvmdump  $jarname --spring.config.location=$path/config/${modulename}.properties --logging.config=file:$apps_path/$modulename/config/logback-spring.xml  2>&1  | $cronologpath/cronolog ${logpath}/${logname}  >> /dev/null 2>&1 &
      
  • 更新logback-spring.xml文件,统一日志输出模板。

  • 配置Filebeat,指定日志采集路径、Kafka topic等信息。

    协议相关的服务日志写入到协议topic,业务服务和平台服务写入到业务topic

  • 配置Logstash,定义输入、过滤、输出规则,并关联ES索引生命周期。

  • 配置Elasticsearch,创建相应的索引模板和生命周期策略。

    根据logstash配置使用的es索引,关联不同的索引,不同索引设置不同数据存储时间

    协议索引过期时间设置为7天,业务索引则可以设置为30天