docker搭建logstash读取宿主机文件
1 docker安装logstash
网上有教程说搭建logstash要从官网下载, 要不然会莫名其妙的不工作了, 我没有验证这个问题, 直接从官网下载了
docker run --rm -it --restart always --name logstash docker.elastic.co/logstash/logstash:7.6.0
直接通过运行的方式, 拉取logstash, 启动之后会噼里啪啦的报错, 根本接不住啊, 简单说, 就是logstash默认配置elasticsearch的问题
2 logstash启动配置
进入到logstash容器中去修改一下启动配置
获取logstash容器id
docker ps
docker exec -it 8s9g73kmkga /bin/bash
这里的8s9g73kmkga
是容器id
2.1 修改配置文件
2.1.1 logstash.yml
注释掉第二行
http.host: "0.0.0.0"
# xpack.monitoring.elasticsearch.hosts: [ "http://elasticsearch:9200" ]
2.1.2 logstash-sample.conf
# Sample Logstash configuration for creating a simple
# Beats -> Logstash -> Elasticsearch pipeline.
input {
file{
#path => ["/home/newtranx/doc-soa/ukey.agent/nohup.out"]
path => ["/usr/share/logstash/listen_log/nohup.out"]
start_position => "beginning"
}
}
filter{
mutate{
remove_field => ["host","path","@timestamp","@version","log","ecs","tags","agent","input"]
rename => {"message" => "logInfo"}
gsub => ["logInfo","\r",""]
}
}
output {
stdout{
codec => rubydebug{}
}
http{
http_method => "post"
url => "http://192.168.1....:8080/logs/saveLogInfo"
mapping => {
"log_info" => "%{logInfo}"
}
format => "form"
}
}
这里input中配置的file路径是在容器中的路径, 在启动logstash时, 需要对这一路径进行关联, 否则docker中的容器是无法读取宿主机中的文件的, 这个问题确实花了很多时间解决
2.1.3 pipeline.yml
将path.config设置为自己配置的logstash-sample.conf
# This file is where you define your pipelines. You can define multiple.
# For more information on multiple pipelines, see the documentation:
# https://www.elastic.co/guide/en/logstash/current/multiple-pipelines.html
- pipeline.id: main
path.config: "/usr/share/logstash/config/logstash-sample.conf"
pipeline.workers: 3
2.2 生成镜像
将刚才修改的内容进行保存, 就需要重新生成一个镜像, 不然每次启动时, 都是从最初始的镜像启动的, 这样上面的配置就丢了
docker commit -a='a_info' -m='m_info' bf4e103f6448 idea_logstash
这里bf4e103f6448
是容器id, idea_logstash是给新镜像指定的名称
2.3 logstash启动
docker run --restart=always -it -v /home/newtranx/doc-soa/ukey.agent/nohup.out:/usr/share/logstash/listen_log/nohup.out idea_logstash
–restart=always 是用来配置开机随docker一起启动的
-v /home/newtranx/doc-soa/ukey.agent/nohup.out:/usr/share/logstash/listen_log/nohup.out
作用是将宿主机中的文件, 映射到logstash容器中, 二者的路径和文件名以冒号分割, 而logstash监听的文件, 就是容器中的文件, 宿主机中的文件和容器中的文件会响应式的关联, 也就是宿主机中文件发生改变, logstash容器中也可以检测到, 真正让logstash起到了监听的作用
至此, 问题完美解决 又是没有bug的一天 …下班…