小李同学 keep digging deeper
ELK

ELK日志分析搭建(二),Logstash + Golang

3 阅读 — 字

每个 Golang 容器实例里跑一个 Logstash,读本机的日志文件再推到 ES。为了省事,提前做了一份带 Logstash 的镜像,直接用就行:

docker pull jasonleemz/golang:231219

镜像标签页:https://hub.docker.com/r/jasonleemz/golang/tags

logstash-config.conf

关键在于把两个目录的日志分开索引:用 tags 区分来源,再在 filter 里给每条记录打上目标索引名,output 里用变量引用。

input {
  file {
      path => "/home/app/logs/log1/*.log"  # 监听 log1 目录下的日志文件
      start_position => "beginning"
      sincedb_path => "/dev/null"
      ignore_older => 0
      tags => ["log1"]  # 使用标签区分不同的日志文件
    }
    file {
      path => "/home/app/logs/log2/*.log"  # 监听 log2 目录下的日志文件
      start_position => "beginning"
      sincedb_path => "/dev/null"
      ignore_older => 0
      tags => ["log2"]  # 使用标签区分不同的日志文件
    }
}

filter {
  if "log1" in [tags] {
    mutate {
      add_field => { "es_index" => "index_for_log1" }  # 设置 log1 对应的 Elasticsearch 索引名
    }
  }
  if "log2" in [tags] {
    mutate {
      add_field => { "es_index" => "index_for_log2" }  # 设置 log2 对应的 Elasticsearch 索引名
    }
  }
}

output {
  elasticsearch {
    hosts => ["elasticsearch:9200"]  # 这里修改成真实的ES地址
    index => "%{es_index}"  # 使用动态设置的索引名
  }
}

sincedb_path => "/dev/null" 加 ignore_older => 0 的组合,意思是每次重启都从头重读,不会因为记录过读取位置而漏掉旧文件。容器场景下日志目录是重建的,这个选择比较省心。

改配置并重启

镜像里的服务由 supervisor 托管,把示例配置改成自己的日志路径,再重载:

 cd /etc/supervisor/conf.d/
 mv logstash.ini.example logstash.ini
 supervisorctl reload

在 Kibana 建索引模式

进 Kibana → Management → Stack Management → Index patterns:

回到 Analytics → Discover,能看到日志已经采集上来了:

本文作者 小李同学,转载请注明出处。

评论

还没有人留言。

写一条

提交后会先进站主的待审列表,通过之后才公开。

搜索文章

输入关键词搜索文章。