日志数据就像企业的"黑匣子",记录了系统运行的每一个关键时刻。我在金融行业做运维的这些年,见过太多因为日志管理不善导致的"事故现场":凌晨三点被告警电话叫醒,却找不到关键错误日志;安全审计时发现日志留存周期不足;新来的开发同事在定位问题时,面对分散在各处的日志文件束手无策...
一个设计良好的日志管理系统需要解决三个核心问题:
我们采用的方案包含三个核心组件:
code复制[Agent] -> [Collector] -> [Storage+Visualization]
日志采集层(Agent):
yaml复制filebeat.inputs:
- type: log
paths: [/var/log/app/*.log]
fields: {env: "production", app: "payment"}
日志处理层(Collector):
ruby复制filter {
grok {
match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:level} %{GREEDYDATA:msg}" }
}
date {
match => ["timestamp", "ISO8601"]
}
}
存储与展示层:
在日均TB级日志量的电商系统中,我们通过以下手段提升性能:
压缩传输:
yaml复制# Filebeat配置
output.logstash:
compression_level: 6
批量写入:
yaml复制# Logstash输出配置
output {
elasticsearch {
flush_size => 5000
idle_flush_time => 5
}
}
字段裁剪(减少30%存储):
ruby复制filter {
prune {
whitelist_names => ["timestamp", "level", "trace_id", "user_id"]
}
}
现象:Kibana中查不到最新日志
排查路径:
bash复制curl -XGET 'http://localhost:5066/stats' | jq '.filebeat.events'
bash复制curl localhost:9600/_node/stats | jq '.pipelines.main.queue'
bash复制curl -XGET "localhost:9200/_cat/indices?v&health=yellow"
典型场景:高峰期日志延迟超过5分钟
优化方案:
bash复制bin/logstash -w 8
conf复制LS_JAVA_OPTS="-Xms4g -Xmx4g -XX:+UseG1GC"
yaml复制output {
kafka {
topic_id => "log_buffer"
bootstrap_servers => "kafka1:9092"
}
}
信用卡号脱敏规则:
ruby复制filter {
mutate {
gsub => [
"message", "\b(?:\d[ -]*?){13,16}\b", "[REDACTED]"
]
}
}
| 角色 | 权限范围 | 典型操作 |
|---|---|---|
| 运维工程师 | prod-*索引 | 搜索/创建告警 |
| 开发人员 | dev-*索引 | 关键词查询 |
| 安全审计员 | 所有索引(只读) | 导出报表/异常检测 |
冷热数据分层:
json复制PUT _ilm/policy/logs_policy
{
"hot": {
"actions": {
"rollover": { "max_size": "50GB" }
}
},
"cold": {
"min_age": "7d",
"actions": { "allocate": { "number_of_replicas": 1 } }
}
}
日志采样策略:
ruby复制filter {
if [level] == "DEBUG" {
drop { probability => 0.7 }
}
}
| 日志量级 | 推荐配置 | 预估成本 |
|---|---|---|
| <50GB/天 | 3节点(16C32G+2TB SSD) | $3k/月 |
| 50-200GB/天 | 5节点(32C64G+4TB SSD) | $8k/月 |
| >200GB/天 | 专用日志集群+对象存储 | 定制报价 |
json复制PUT _watcher/watch/error_alert
{
"trigger": { "schedule": { "interval": "5m" } },
"input": {
"search": {
"request": {
"indices": ["logs-*"],
"body": {
"query": {
"bool": {
"filter": [
{ "range": { "@timestamp": { "gte": "now-5m/m" } } },
{ "terms": { "level": ["ERROR", "FATAL"] } }
]
}
}
}
}
}
}
}
分级通知机制:
防抖动规则:
python复制def should_alert(errors):
return errors.last_hour > 50 and errors.current_hour > 20
推荐采用JSON格式,包含以下必填字段:
json复制{
"timestamp": "ISO8601格式",
"level": "DEBUG/INFO/WARN/ERROR",
"trace_id": "请求链路ID",
"span_id": "当前跨度ID",
"service": "服务名称",
"message": "可读的描述信息"
}
| 等级 | 使用场景 | 示例 |
|---|---|---|
| DEBUG | 开发环境详细诊断 | SQL语句打印 |
| INFO | 业务关键节点记录 | "用户1234下单成功,订单ID:5678" |
| WARN | 异常但可自动恢复的情况 | "Redis连接超时,已自动重连" |
| ERROR | 需要人工干预的故障 | "支付回调验签失败,订单可能被篡改" |
在K8s环境中,还需要特别注意容器日志的采集策略:
yaml复制# DaemonSet配置示例
containers:
- name: filebeat
volumeMounts:
- mountPath: /var/log/containers
name: varlog
- mountPath: /var/lib/docker/containers
name: varlibdockercontainers