目录

1 集成日志框架,生成 traceId

2 启动 FileBeat 收集本地日志

3 Logstash 解析 Trace ID

4 在 kibana 中根据 trace_id 搜索对应的系统日志


SkyWalking + ELK 是微服务监控最经典的组合。SkyWalking 管链路、性能、调用;ELK 管日志全文检索、聚合、排查,两者互补,一起用才是完整可观测体系。

集成日志框架,生成 traceId

引入依赖
<!-- SkyWalking 集成 Logback 日志,自动注入追踪ID -->
<dependency>
    <groupId>org.apache.skywalking</groupId>
    <artifactId>apm-toolkit-logback-1.x</artifactId>
    <version>8.9.0</version>
</dependency>

在 logback-spring.xml 中配置 TraceId 输出格式

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
    <!-- 引入 SkyWalking 日志转换器 -->
    <conversionRule conversionWord="tid" converterClass="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternConverter"/>

    <!-- 控制台输出 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <!-- %tid 就是 SkyWalking 的 TraceId,核心字段 -->
            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%tid] [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!-- 根日志配置 -->
    <root level="INFO">
        <appender-ref ref="CONSOLE"/>
    </root>
</configuration>

启动 FileBeat 收集本地日志

修改 filebeat.yml 的配置,指定日志收集地址和 logstash 地址
filebeat.inputs:
  - type: log
    enabled: true
    paths:
      - f:\logs\cmmall\*.log
    # 多行日志合并(Java 异常栈专用)
    multiline.type: pattern
    multiline.pattern: '^\d{4}\-\d{2}\-\d{2}\s\d{2}\:\d{2}\:\d{2}\.\d{3}'
    multiline.negate: true
    multiline.match: after

# 输出到 Logstash
output.logstash:
  hosts: ["192.168.xx.xxx:xxxx"]
启动 FileBeats
#启动 FileBeats
filebeat.exe -e -c filebeat.yml

Logstash 解析 Trace ID

通过 grok 自定义正则表达式,可以从日志行中抽取出 trace id ,就可以在 es 中建立索引,方便日志检索。
input {
  beats {
    port => XXXX
    codec => "json"
  }
}

filter {
  # 解析带 SkyWalking TraceId 的 Java 日志
  grok {
    match => { "message" => '%{TIMESTAMP_ISO8601:log_time}\s+%{LOGLEVEL:level}\s+\[TID:%{DATA:trace_id}\]\s+\[%{DATA:thread}\]\s+%{DATA:class}\s+-\s+%{GREEDYDATA:content}' }
  }

  # 把 log_time 转成 ES 可识别的时间格式
  date {
    match => [ "log_time", "yyyy-MM-dd HH:mm:ss.SSS" ]
    target => "@timestamp"
  }

  # 删除无用字段,节省存储空间
  mutate {
    remove_field => [ "message", "tags", "host", "@version" ]
  }
}

output {
  elasticsearch {
    hosts => ["192.168.XX.XXX:XXXX"]
    index => "cmmall-log-%{+YYYY.MM.dd}"  # 按天分索引,更规范
  }
}

在 kibana 中根据 trace_id 搜索对应的系统日志

整合 Skywalking ELK 后,通过 trace id ,在 Skywaling 中快速看到链路中哪个环节出了问题,然后在 ELK 中按 trace id 搜索对应的系统日志,这样就可以很方便的定位出问题。

更多推荐