一、ELK日志系统概述与架构设计

1.1 为什么需要ELK集中化管理日志

随着企业信息化进程的加速,日志数据量急剧增加且来源多样、格式复杂,传统的日志管理方式已难以满足需求。ELK(Elasticsearch、Logstash、Kibana)的引入,正是为了应对这些挑战。

使用ELK的主要原因

  1. 集中化管理与高效检索日志

    • 在大型分布式系统中,ELK通过构建集中式日志系统,实现所有节点上日志的统一收集、管理和访问
    • Elasticsearch提供强大的检索特性,能够快速查询问题日志,显著提升运维人员的工作效率
  2. 全面的日志分析与系统监控

    • ELK能够管理和分析包括系统日志、应用程序日志和安全日志在内的多种日志
    • 帮助系统运维和开发人员了解服务器软硬件信息、检查配置错误及其原因
  3. 直观的数据可视化与理解

    • Kibana为Elasticsearch提供Web可视化界面,可以生成各种维度表格、图形
    • 使复杂的日志数据可视化,帮助用户更直观地理解和分析数据

1.2 ELK架构分析

ELK架构分为两种,一种是经典的ELK架构,另外一种是加上消息队列(Redis或Kafka或RabbitMQ)和Nginx结构。

1.2.1 经典的ELK架构

Filebeat → Logstash → Elasticsearch → Kibana

组成

  • Filebeat:轻量级日志收集代理
  • Logstash:数据处理管道
  • Elasticsearch:数据存储与搜索
  • Kibana:数据可视化

特点

  • 适用场景:数据量较小的开发环境
  • 优点:简单易用
  • 缺点:缺少消息队列的缓冲机制,当Logstash或Elasticsearch出现故障时,可能存在数据丢失的风险

1.2.2 整合消息队列+Nginx的ELK架构

Filebeat → (消息队列) → Logstash → Elasticsearch → Kibana
                      ↓
                   Nginx

组成

  • Filebeat:日志收集代理
  • 消息队列(Redis/Kafka/RabbitMQ):缓冲机制
  • Nginx:高性能Web和反向代理服务器
  • Logstash:数据处理管道
  • Elasticsearch:数据存储与搜索
  • Kibana:数据可视化

特点

  • 适用场景:生产环境,特别是需要处理大数据量的场景
  • 优点:确保数据的安全性和完整性,提供高性能的日志处理和可视化分析服务
  • 缺点:架构相对复杂

架构对比

特性 经典ELK架构 整合消息队列+Nginx的ELK架构
适用场景 开发环境,数据量小 生产环境,大数据量
数据可靠性 低(无缓冲) 高(消息队列缓冲)
系统扩展性
部署复杂度
数据丢失风险

二、Logstash数据处理管道详解

2.1 Logstash概述

Logstash是免费且开放的服务器端数据处理管道,能够从多个来源采集数据,转换数据,然后将数据发送到您最喜欢的存储库中。

Logstash工作原理

Input → Filter → Output

核心概念

  • Input:数据采集源
  • Filter:数据处理插件
  • Output:数据输出目标

2.2 Logstash数据处理流程

Logstash数据传输原理

  1. 数据采集与输入:Logstash支持各种输入选择,能够以连续的流式传输方式,从日志、指标、Web应用以及数据存储中采集数据。
  2. 实时解析和数据转换:通过Logstash过滤器解析各个事件,识别已命名的字段来构建结构,并将它们转换成通用格式。
  3. 存储与数据导出:Logstash提供多种输出选择,可以将数据发送到指定的地方。

2.3 Logstash配置详解

Logstash配置文件结构

input {
  # 输入插件配置
}

filter {
  # 过滤插件配置
}

output {
  # 输出插件配置
}

Logstash配置示例

input {
  stdin {}
}

filter {
  grok {
    match => { "message" => "%{COMBINEDAPACHELOG}" }
  }
  date {
    match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ]
  }
}

output {
  elasticsearch {
    index => "logstash-demo"
    hosts => ["localhost:9200"]
  }
  stdout {
    codec => rubydebug
  }
}

Logstash管道配置

  • 每种类型的插件都提供了一个单独的配置部分
  • 例如,指定多个filter插件,Logstash会按照它们在配置文件中出现的顺序进行处理

2.4 Logstash插件详解

Input Plugins

  • stdin:从标准输入读取数据
  • file:从文件读取数据
  • beats:接收Filebeat发送的数据
  • jdbc:从数据库读取数据

Filter Plugins

  • grok:正则匹配解析
  • date:日期解析
  • mutate:字段操作
  • disect:分割符解析

Output Plugins

  • elasticsearch:发送到Elasticsearch
  • stdout:输出到标准输出
  • email:发送邮件
  • http:发送HTTP请求

Codec Plugins

  • line:单行解析
  • multiline:多行解析
  • json:JSON解析

Multiline配置示例(处理Java异常堆栈):

input {
  stdin {
    codec => multiline {
      pattern => "^\s"
      what => "previous"
    }
  }
}

异常示例

Exception in thread "main" java.lang.NullPointerException
    at com.example.myproject.Book.getTitle(Book.java:16)
    at com.example.myproject.Author.getBookTitles(Author.java:25)
    at com.example.myproject.Bootstrap.main(Bootstrap.java:14)

三、Filebeat轻量级日志采集器实战

3.1 Filebeat概述

Filebeat专门用于转发和收集日志数据的轻量级采集工具。它可以作为代理安装在服务器上,Filebeat监视指定路径的日志文件,收集日志数据,并将收集到的日志转发到Elasticsearch或者Logstash。

Filebeat工作原理

Filebeat → Harvesters → libbeat → Output
  • Harvester:每个文件启动一个Harvester,读取文件日志
  • libbeat:将数据收集到一起,发送给输出

3.2 Filebeat vs Logstash

特性 Filebeat Logstash
资源消耗 低(Go语言编写) 高(JVM运行)
功能 仅采集日志 日志采集+过滤处理
适用场景 日志采集 日志采集+处理
配置复杂度 简单 复杂

为什么使用Filebeat+Logstash组合

  • Filebeat更轻量,占用资源少
  • Logstash具有Filter功能,能过滤分析日志
  • 一般结构:Filebeat采集日志 → 消息队列 → Logstash处理 → Elasticsearch存储

3.3 Filebeat配置与实战

Filebeat安装与配置

# Linux安装
curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-8.14.3-linux-x86_64.tar.gz
tar xzvf filebeat-8.14.3-linux-x86_64.tar.gz

Filebeat配置示例(filebeat.yml):

output.elasticsearch:
  hosts: ["192.168.65.174:9200","192.168.65.192:9200","192.168.65.204:9200"]
  username: "elastic"
  password: "123456"

setup.kibana:
  host: "192.168.65.174:5601"

启用Nginx日志模块

./filebeat modules enable nginx

配置Nginx日志路径(modules.d/nginx.yml):

- module: nginx
  access:
    enabled: true
    var.paths: ["/var/log/nginx/access.log*"]
  error:
    enabled: true
    var.paths: ["/var/log/nginx/error.log*"]

3.4 Tomcat日志采集实战

Filebeat配置Tomcat日志(filebeat-tomcat.yml):

filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /home/fox/apache-tomcat-9.0.93/logs/*access*
  multiline.pattern: '^\d+\.\d+\.\d+\.\d+'
  multiline.negate: true
  multiline.match: after

output.logstash:
  enabled: true
  hosts: ["localhost:5044"]

Logstash接收Filebeat配置(logstash-tomcat.conf):

input {
  beats {
    port => 5044
  }
}

output {
  elasticsearch {
    hosts => ["http://localhost:9200"]
    index => "tomcat-logs"
    user => "elastic"
    password => "123456"
  }
  stdout {
    codec => rubydebug
  }
}

常见异常处理

  1. 权限问题

    Exiting: error loading config file: config file("filebeat-tomcat.yml") can only be writable by the owner
    

    解决chmod 644 filebeat-tomcat.yml

  2. 连接拒绝

    Failed to connect to backoff(async(tcp://192.168.65.204:5044)): dial tcp 192.168.65.204:5044: connect: connection refused
    

    解决:确保Logstash已启动并监听5044端口

四、微服务整合ELK实现日志采集与分析实战

4.1 Spring Boot整合Logstash实现日志采集

实现思路

  1. Spring Boot应用使用Logback日志框架记录日志
  2. Logstash作为日志收集器,接收Spring Boot应用发送的日志数据
  3. Logstash解析和过滤日志数据
  4. 处理后的日志数据被发送到Elasticsearch
  5. Kibana连接到Elasticsearch,查看存储在Elasticsearch中的日志数据

4.2 Spring Boot应用配置

1. 添加Logstash依赖

<dependency>
  <groupId>net.logstash.logback</groupId>
  <artifactId>logstash-logback-encoder</artifactId>
  <version>6.3</version>
</dependency>

2. logback-spring.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
  <property name="LOG_HOME" value="logs/elk-demo.log"/>
  
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
      <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS}[%thread]%-5level%logger{50}-%msg%n</pattern>
    </encoder>
  </appender>
  
  <appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
    <destination>192.168.65.211:4560</destination>
    <encoder class="net.logstash.logback.encoder.LogstashEncoder">
      <customFields>{"appname":"elk-demo"}</customFields>
    </encoder>
  </appender>
  
  <!-- 日志输出级别 -->
  <root level="INFO">
    <appender-ref ref="STDOUT"/>
    <appender-ref ref="logstash"/>
  </root>
</configuration>

4.3 Logstash配置

1. 创建elk-demo.conf

input {
  tcp {
    host => "0.0.0.0"
    port => "4560"
    mode => "server"
    codec => json_lines
  }
}

filter {
}

output {
  stdout {
    codec => rubydebug
  }
  elasticsearch {
    hosts => ["127.0.0.1:9200"]
    index => "%{[appname]}-%{+YYYY.MM.dd}"
  }
}

2. 启动Logstash

bin/logstash -f config/elk-demo.conf

4.4 日志解析与处理

1. Grok插件解析Tomcat日志

filter {
  grok {
    match => {
      "message" => "%{IP:ip}--\[%{HTTPDATE:date}\]\"%{WORD:method}%{PATH:uri}%{DATA:protocol}\"%{INT:status:int}%{INT:length:int}"
    }
  }
}

2. Date插件转换日期格式

filter {
  date {
    match => ["date", "dd/MMM/yyyy:HH:mm:ss Z", "yyyy-MM-dd HH:mm:ss"]
    target => "date"
  }
}

3. Mutate插件移除不需要的字段

filter {
  mutate {
    remove_field => ["message", "log", "tags", "input", "agent", "host", "ecs", "@version"]
  }
}

4. 完整配置示例(logstash-tomcat-es.conf):

input {
  beats {
    port => 5044
  }
}

filter {
  grok {
    match => {
      "message" => "%{IP:ip}--\[%{HTTPDATE:date}\]\"%{WORD:method}%{PATH:uri}%{DATA:protocol}\"%{INT:status:int}%{INT:length:int}"
    }
  }
  mutate {
    remove_field => ["message", "log", "tags", "input", "agent", "host", "ecs", "@version"]
  }
  date {
    match => ["date", "dd/MMM/yyyy:HH:mm:ss Z", "yyyy-MM-dd HH:mm:ss"]
    target => "date"
  }
}

output {
  stdout {
    codec => rubydebug
  }
  elasticsearch {
    index => "tomcat_web_log_%{+YYYY-MM}"
    hosts => ["http://localhost:9200"]
    user => "elastic"
    password => "123456"
  }
}

五、Kibana可视化分析与问题排查

5.1 Kibana数据视图配置

1. 创建数据视图

  • 打开Kibana → Management → Kibana → Index Patterns
  • 点击"Create index pattern"
  • 输入索引模式(如:tomcat_web_log_*)
  • 选择时间字段(如:date)

2. 创建索引模式

  • 在Kibana中,创建索引模式"tomcat_web_log_*"
  • 选择"date"作为时间字段

5.2 日志分析实战

1. 查看日志数据

  • 打开Kibana → Discover
  • 选择创建好的索引模式(如:tomcat_web_log_*)
  • 可以看到Tomcat日志的详细内容

2. 筛选特定日志

  • 在Discover界面,可以按条件筛选日志
  • 例如:筛选status为403的日志
    status: 403
    

3. 创建可视化图表

  • 打开Kibana → Visualize Library
  • 创建新的可视化(如:折线图、柱状图、饼图等)
  • 选择索引模式,配置X轴、Y轴、分组等

4. 创建仪表盘

  • 打开Kibana → Dashboard
  • 点击"Create dashboard"
  • 添加之前创建的可视化图表
  • 可以调整布局、添加过滤条件

5.3 通过Alias实现数据过滤

1. 创建索引别名(只显示未被标记为删除的用户):

POST /_aliases
{
  "actions": [
    {
      "add": {
        "index": "users",
        "alias": "view_users",
        "filter": { "term": { "is_deleted": 0 } }
      }
    }
  ]
}

2. 通过Alias查询

POST view_users/_search
{
  "query": {
    "term": {
      "name.keyword": {
        "value": "张三"
      }
    }
  }
}

六、实战经验总结与最佳实践

6.1 微服务日志采集常见问题与解决方案

问题 原因 解决方案
Filebeat无法连接Logstash Logstash未启动或端口配置错误 启动Logstash,检查端口配置
日志解析不正确 Grok模式不匹配 调整Grok模式,使用Kibana的Grok调试器
日志数据丢失 消息队列未配置或配置错误 添加消息队列(如Kafka)作为缓冲
Kibana无法显示数据 索引未创建或配置错误 检查Logstash输出配置,确认索引创建
日志数据过大 未进行分片或索引管理 使用基于时间的索引,定期清理

6.2 最佳实践建议

  1. 日志格式标准化

    • 统一微服务日志格式,便于后续解析
    • 建议使用JSON格式输出日志
  2. 合理设置分片

    • 根据日志量,设置合理的分片数量
    • 日志类应用:单个分片不超过50GB
  3. 数据保留策略

    • 根据业务需求,设置日志保留时间
    • 使用索引生命周期管理(ILM)自动删除旧日志
  4. 安全配置

    • 启用ES安全认证
    • 限制Kibana和Logstash的访问权限
  5. 性能优化

    • 适当调整Logstash的队列大小
    • 使用Filebeat的背压机制,避免数据丢失

6.3 微服务日志采集架构图

+----------------+     +------------------+     +-----------------+     +-----------------+
|                |     |                  |     |                 |     |                 |
|  Microservices |     |      Filebeat    |     |     Logstash    |     |   Elasticsearch |
|                |     |                  |     |                 |     |                 |
+--------+-------+     +--------+---------+     +--------+--------+     +--------+--------+
         |                     |                     |                     |
         |                     |                     |                     |
         v                     v                     v                     v
+--------+-------+     +--------+---------+     +--------+--------+     +--------+--------+
|                |     |                  |     |                 |     |                 |
|  Application   |     |   Nginx/Logstash |     |     Kafka/Redis |     |      Kibana     |
|  Logs (JSON)   |     |    (5044 port)   |     |    (Buffer)     |     |                 |
+----------------+     +------------------+     +-----------------+     +-----------------+

七、结语

通过本文的详细分析与实战案例,我们可以看到,基于ELK的微服务日志采集与分析系统是一个强大且灵活的解决方案。它能够帮助我们解决分布式系统中日志管理的挑战,提供高效、实时、可扩展且易用的日志管理能力。

关键要点总结

  1. ELK架构选择:根据业务需求选择经典ELK架构或整合消息队列+Nginx的ELK架构
  2. 日志采集:使用Filebeat作为轻量级采集器,高效收集日志数据
  3. 日志处理:使用Logstash进行数据过滤、解析和转换
  4. 数据存储:Elasticsearch提供强大的搜索和分析能力
  5. 可视化分析:Kibana提供直观的数据可视化界面

在实际项目中,建议先进行日志格式标准化,然后根据业务需求设计合理的索引策略和数据保留策略。同时,持续监控和优化日志系统,确保其能够满足业务发展的需求。

重要提示:在微服务架构下,日志是排查问题的关键。一个设计良好的日志系统不仅能提高开发效率,还能在生产环境中快速定位和解决问题,是构建稳定可靠系统的重要基础。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐