日志ELK、ELFK、EFK

一.ELK架构

Elasticsearch + Logstash + Kibana

数据库+日志处理+日志显示

1.logstash的使用

(1)input:输入

(2)filter:处理

(3)output:输出

2.ELFK架构

Filebeat-->Elasticsearch-->Logstash-->Kibana

Filebeat 部署在节点上轻量采集日志,Logstash 集中处理。

ELK 的弊端:

  • NFS数据共享会成为流量瓶颈,不适合大规模集群

  • 是否可以在每台 Web 服务器上安装 Logstash

    • Logstash占用资源多,在节点部署会争抢应用的资源

ELFK 优势:

  • Filebeat占用资源非常小,可以在所有节点部署

  • 在每台Web服务器上安装客户端,通过网络发送日志,没有单点故障,没有流量瓶颈

filebeat的配置文件

test可以设置为业务名

filebeat直接区分不同服务的日志

示例filebeat:

复制代码
filebeat.inputs:
  - type: filestream
    id: oss-logs
    paths:
      - /var/oss/*.log
    fields:
      log_source: "oss"
    fields_under_root: true

  - type: filestream
    id: dps-logs
    paths:
      - /var/dps/*.log
    fields:
      log_source: "dps"
    fields_under_root: true

output.logstash: # 输出到 Logstash
  hosts: ["your-logstash-host:5044"] # 替换为 Logstash 地址



# 示例2
# ============================== Filebeat inputs ===============================
filebeat.inputs:

  # 收集 OSS 服务日志
  - type: filestream
    enabled: true
    id: oss-service
    paths:
      - /var/log/oss/*.log
      - /var/log/oss/*.log.gz
    fields:
      log_source: "oss"  # 关键字段,用于标识日志来源
      environment: "production" # 可选:添加环境标识
    fields_under_root: true # 将 fields 提升到事件顶级
    # 可选:为OSS日志添加特定标签
    tags: ["oss", "application"]

  # 收集 DPS 服务日志
  - type: filestream
    enabled: true
    id: dps-service
    paths:
      - /var/log/dps/*.log
      - /var/log/dps/*.log.gz
    fields:
      log_source: "dps"  # 关键字段,用于标识日志来源
      environment: "production"
    fields_under_root: true
    tags: ["dps", "application"]

# ======================== Filebeat 模块(禁用避免干扰) ========================
filebeat.config.modules:
  path: ${path.config}/modules.d/*.yml
  reload.enabled: false

# ================================= Outputs ====================================
output.logstash:
  hosts: ["logstash-server-ip:5044"]  # 替换为你的 Logstash 服务器 IP
  # 可选:开启负载均衡,如果有多个 Logstash 节点
  # loadbalance: true

# ================================== Logging ===================================
logging.level: info
logging.to_files: true
logging.files:
  path: /var/log/filebeat
  name: filebeat
  keepfiles: 7
  permissions: 0644

示例logstash:

复制代码
# 例如在 /etc/logstash/conf.d/ 下创建 log_processing.conf
input {
  beats {
    port => 5044
  }
}

# 这里也可以不过滤
filter {
  # 此处可添加任意过滤解析规则,如Grok解析消息体:cite[10]
  # 所有日志都会经过这里
}

output {
  # 根据 log_source 字段值判断输出到哪个索引
  if [log_source] == "oss" {
    elasticsearch {
      hosts => ["http://your-es-host:9200"] #Elasticsearch
      index => "oss-logs-%{+YYYY.MM.dd}" # 定义OSS索引格式
    }
  } else if [log_source] == "dps" {
    elasticsearch {
      hosts => ["http://your-es-host:9200"]
      index => "dps-logs-%{+YYYY.MM.dd}" # 定义DPS索引格式
    }
  }

  # 可选: stdout { codec => rubydebug } # 调试时可在终端输出结果
}




# 示例2
input {
  beats {
    port => 5044
    host => "0.0.0.0"
    # 可选:增加并发处理能力
    # threads => 4
  }
}

filter {
  # 通用处理:添加主机信息
  mutate {
    add_field => {
      "host_ip" => "%{[host][ip]}"
      "host_name" => "%{[host][name]}"
    }
  }
  
  # 根据 log_source 字段进行路由和特定处理,log_source是filebeat里面设置的
  if [log_source] == "oss" {
    # OSS 服务日志的特定处理
    grok {
      match => { "message" => "\[%{TIMESTAMP_ISO8601:timestamp}\] %{LOGLEVEL:loglevel} %{GREEDYDATA:message}" }
      overwrite => [ "message" ]
    }
    
    # 解析OSS特定字段(示例)
    grok {
      match => { "message" => "Bucket: %{NOTSPACE:bucket_name}, Object: %{NOTSPACE:object_key}, Action: %{WORD:action}" }
    }
    
    date {
      match => [ "timestamp", "ISO8601" ]
      remove_field => [ "timestamp" ]
    }
    
    # 为OSS日志添加特定标签
    mutate {
      add_tag => [ "processed_oss" ]
    }
    
  } else if [log_source] == "dps" {
    # DPS 服务日志的特定处理
    grok {
      match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:loglevel} \[%{NOTSPACE:thread}\] %{JAVACLASS:class} - %{GREEDYDATA:message}" }
      overwrite => [ "message" ]
    }
    
    # 解析DPS特定字段(示例)
    grok {
      match => { "message" => "TransactionID: %{NOTSPACE:transaction_id}, Duration: %{NUMBER:duration}ms" }
    }
    
    date {
      match => [ "timestamp", "ISO8601" ]
      remove_field => [ "timestamp" ]
    }
    
    # 转换持续时间字段为数字
    mutate {
      convert => { "duration" => "integer" }
      add_tag => [ "processed_dps" ]
    }
  }
  
  # 通用后处理:移除不必要的字段
  mutate {
    remove_field => [ "ecs", "agent", "input", "log" ]
  }
}

output {
  # 根据 log_source 路由到不同的 Elasticsearch 索引
  if [log_source] == "oss" {
    elasticsearch {
      hosts => ["http://elasticsearch-host:9200"]
      index => "oss-logs-%{+YYYY.MM.dd}"  # OSS 索引格式
      # 可选:为OSS索引指定不同的身份验证或配置
      # user => "oss_writer"
      # password => "${OSS_ES_PASSWORD}"
    }
  } else if [log_source] == "dps" {
    elasticsearch {
      hosts => ["http://elasticsearch-host:9200"]
      index => "dps-logs-%{+YYYY.MM.dd}"  # DPS 索引格式
      # 可选:为DPS索引指定不同的配置
      # document_type => "dps_log"
    }
  }
  
  # 调试输出(生产环境可注释掉)
  stdout {
    codec => rubydebug
    # 可选:只在调试时开启特定标签的日志
    # if "debug" in [tags]
  }
  
  # 可选:对于解析失败的日志,发送到死信队列
  if "_grokparsefailure" in [tags] or "_dateparsefailure" in [tags] {
    elasticsearch {
      hosts => ["http://elasticsearch-host:9200"]
      index => "failed-logs-%{+YYYY.MM.dd}"
    }
  }
}

kibana查看索引日志

(1)查看filebeat采集过来的日志

可以查看到索引日志说明成功采集过来了

(2)创建数据视图,查看日志

(3)选择创建了哪些数据视图(不同业务日志)

(4)日志检索

3.EFK架构

FluentdFluent-bit 替代 Logstash,资源占用极低(<10MB),支持插件扩展。

Fluent-bit 更适合容器环境,如 Kubernetes 中的 DaemonSet 部署

ELFK 的弊端:

  • ELFK 组件较多,需要配置 Logstash 处理数据

  • Logstash 体积大,占用资源多,不适用放在容器内运行

EFK 优势:

  • Fluent 整合了 Filebeat 和 Logstash 的功能

  • Fluent 组件更少,占用资源更小,非常适合容器部署

  • 容器部署的优选方案