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,也可以映射正确,如果是集群,更能实现分片均匀分布,保证高可用

posted on 2023-03-17 18:22  进击的davis  阅读(785)  评论(0)    收藏  举报

导航