系列导读:本篇将深入讲解日志平台的架构设计与核心实现。
文章目录
-
- 目录
- 一、日志平台概述
-
- [1.1 日志类型](#1.1 日志类型)
- [1.2 日志平台功能](#1.2 日志平台功能)
- 二、架构设计
-
- [2.1 整体架构](#2.1 整体架构)
- [2.2 技术选型](#2.2 技术选型)
- [三、ELK 实战](#三、ELK 实战)
-
- [3.1 Filebeat 配置](#3.1 Filebeat 配置)
- [3.2 Logstash 配置](#3.2 Logstash 配置)
- [3.3 Docker Compose 部署](#3.3 Docker Compose 部署)
- 四、最佳实践
-
- [4.1 日志规范](#4.1 日志规范)
- [4.2 日志格式](#4.2 日志格式)
- [4.3 告警配置](#4.3 告警配置)
- 总结
目录
一、日志平台概述
1.1 日志类型
┌─────────────────────────────────────────────────────────────┐
│ 日志类型 │
├─────────────────────────────────────────────────────────────┤
│ 📝 应用日志:业务逻辑日志 │
│ 🔧 系统日志:操作系统日志 │
│ 🌐 访问日志:HTTP 请求日志 │
│ 🐛 错误日志:异常堆栈日志 │
│ 📊 审计日志:操作审计日志 │
└─────────────────────────────────────────────────────────────┘
1.2 日志平台功能
| 功能 | 说明 |
|---|---|
| 日志采集 | 收集各来源日志 |
| 日志存储 | 持久化存储 |
| 日志检索 | 快速查询 |
| 日志分析 | 统计分析 |
| 告警通知 | 异常告警 |
二、架构设计
2.1 整体架构
┌─────────────────────────────────────────────────────────────┐
│ 日志平台架构 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 应用服务 ──► Filebeat ──► Kafka ──► Logstash ──► ES │
│ │
│ │
│ Kibana ◄───────────────────────────────────────────────── │
│ │
└─────────────────────────────────────────────────────────────┘
2.2 技术选型
| 组件 | 说明 |
|---|---|
| Filebeat | 轻量级日志采集 |
| Kafka | 消息队列缓冲 |
| Logstash | 日志处理转换 |
| Elasticsearch | 日志存储检索 |
| Kibana | 可视化分析 |
三、ELK 实战
3.1 Filebeat 配置
yaml
# filebeat.yml
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/app/*.log
fields:
app: order-service
env: prod
fields_under_root: true
output.kafka:
hosts: ["kafka1:9092", "kafka2:9092"]
topic: "logs"
partition.round_robin:
reachable_only: true
required_acks: 1
3.2 Logstash 配置
ruby
# logstash.conf
input {
kafka {
bootstrap_servers => "kafka1:9092"
topics => ["logs"]
group_id => "logstash"
}
}
filter {
grok {
match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:level} %{GREEDYDATA:msg}" }
}
date {
match => ["timestamp", "ISO8601"]
}
if [level] == "ERROR" {
mutate {
add_tag => ["error"]
}
}
}
output {
elasticsearch {
hosts => ["es1:9200", "es2:9200"]
index => "logs-%{[app]}-%{+YYYY.MM.dd}"
}
}
3.3 Docker Compose 部署
yaml
version: '3'
services:
elasticsearch:
image: elasticsearch:8.10.0
environment:
- discovery.type=single-node
- xpack.security.enabled=false
ports:
- "9200:9200"
volumes:
- es-data:/usr/share/elasticsearch/data
kibana:
image: kibana:8.10.0
ports:
- "5601:5601"
environment:
- ELASTICSEARCH_HOSTS=http://elasticsearch:9200
depends_on:
- elasticsearch
logstash:
image: logstash:8.10.0
volumes:
- ./logstash.conf:/usr/share/logstash/pipeline/logstash.conf
depends_on:
- elasticsearch
volumes:
es-data:
四、最佳实践
4.1 日志规范
java
// 日志规范示例
@Slf4j
@Service
public class OrderService {
public Order createOrder(OrderDTO dto) {
// 入口日志
log.info("创建订单开始, userId={}, items={}", dto.getUserId(), dto.getItems());
try {
Order order = doCreate(dto);
// 成功日志
log.info("创建订单成功, orderId={}", order.getId());
return order;
} catch (Exception e) {
// 错误日志(包含关键参数)
log.error("创建订单失败, userId={}, error={}", dto.getUserId(), e.getMessage(), e);
throw e;
}
}
}
4.2 日志格式
json
{
"timestamp": "2024-01-01T10:00:00.000+08:00",
"level": "INFO",
"traceId": "abc123",
"spanId": "def456",
"app": "order-service",
"host": "192.168.1.100",
"thread": "http-nio-8080-exec-1",
"class": "com.example.OrderService",
"message": "创建订单成功",
"context": {
"userId": "1001",
"orderId": "2001"
}
}
4.3 告警配置
yaml
# Kibana 告警规则
rules:
- name: "错误日志告警"
type: "frequency"
index: "logs-*"
filter:
- term:
level: "ERROR"
timeframe:
minutes: 5
num_events: 10
alert:
- "email"
email:
- "ops@example.com"
总结
✅ 日志平台概述 :日志类型、核心功能
✅ 架构设计 :整体架构、技术选型
✅ ELK 实战 :Filebeat、Logstash、Docker 部署
✅ 最佳实践:日志规范、格式、告警
本系列完结
作者 :刘~浪地球
系列 :技术选型与实战(五)
更新时间:2026-04-25