linux通过docker实现文件日志输送到logstash中
本文主要分享通过logstash进行日志的收集,传输到es的实操。
logstash作为ELK stack中的一员,凭借其强大的插件实现过滤功能,这是Filebeat组件没法比的,但logstash运行起来相对也更重,更吃内存和CPU。
下面我将从logstash的部署到运行,最后在kibana上查看到收集的日志,这样一套流程下来,基本掌握logstash的日志收集。
1.部署logstash
镜像准备
docker pull elastic/logstash:6.8.23
# 创建相关挂载目录
pwd
# /data/elk6.8/logstash
touch jvm.options logstash.yml
mkdir conf.d config
touch conf.d/logserver.conf
2.logstash的配置说明
配置
jvm.options-限定logstash运行的堆大小
-Xmx512m
-Xms512m
logstash.yml
node.name: logstash-240
# 日志文件目录配置
path.logs: /usr/share/logstash/logs
# 验证配置文件及存在性
config.test_and_exit: false
# 配置文件改变时是否自动加载
config.reload.automatic: false
# 重新加载配置文件间隔
config.reload.interval: 60s
# debug模式 开启后会打印解析后的配置文件 包括密码等信息 慎用
# 需要同时配置日志等级为debug
config.debug: true
log.level: debug
# The bind address for the metrics REST endpoint.
http.host: 0.0.0.0
conf.d/logserver.conf-logstash输入输出规则
input {
file { # 以宿主机文件为输入源
path => "/var/log/nginx/access.log"
start_position => "beginning"
type => "nginx_access"
codec => "json" # 需要提前设置nginx的日志格式,自行搜索
}
}
filter {
mutate { # 删除多余字段
remove_field => ["@version", "_@timestamp", "tags"]
}
}
output {
if [type] == "nginx_access" { # 注意remove字段时,不能删除type字段,否则output时没法匹配
elasticsearch {
hosts => "172.30.1.1:9200" # 输出到es的地址,根据自己情况设置
index => "nginx-access-log-%{+YYYY.MM.dd}"
document_type => "_doc"
}
}
stdout { codec => rubydebug}
}
考虑到每次自己手输docker run的命令太土,脚本化吧:
# /data/elk6.8/logstash/docker_run.sh
#!/bin/bash
docker run -d --name logstash \
-p 5044:5044 \
-v /data/elk6.8/logstash/conf.d/logserver.conf:/etc/logstash/conf.d/logserver.conf \
-v /data/elk6.8/logstash/jvm.options:/usr/share/logstash/config/jvm.options \
-v /data/elk6.8/logstash/logstash.yml:/usr/share/logstash/config/logstash.yml \
-v /etc/localtime:/etc/localtime:ro \
-v /var/log/nginx/access.log:/var/log/nginx/access.log \
elastic/logstash:6.8.23 \
sh -c "logstash -f /etc/logstash/conf.d/logserver.conf" # 更改输入输出后,需要启动容器的入口处执行命令,载入配置,否则只是关联也不生效
然后就是简单执行脚本了:sh docker_run.sh
提前启动nginx,浏览器刷新几次nginx,查看kibana的日志情况:

可以看到日志正常:
- 1.日志存储到了es中
- 2.logstash对filter规则删除的字段生效了
上面的分享仅是logstash的一小部分功能,更多:
- 1.不同的日志源输入,如filbeat、kafka、redis、rsyslog这些可以继续学习,本文中的不涉及到网络传过来的日志源
- 2.logstash的filter规则,其实就是各种正则匹配规则,另外相关的output到elasticsearch中的相关template、index lifecycle manager等的配置也可以完善
- 3....
实现以上的功能后,这样的logstash才算是真正的做到:
- 输入:输入源多样,解决本机及其他机器的日志源问题,同时抗住一定的流量,通过kafka等的缓冲
- 过滤:实现字段的增减及替换,各种字段格式
- 输出:存入es时不用再另外设置,即可实现日志的自动管理,对应settings/mapping/ilm,日志既能自动rotate,也可以映射正确,如果是集群,更能实现分片均匀分布,保证高可用
浙公网安备 33010602011771号