将 nginx access log 接入到 ELK(ES、Kibana)系统的过程中,我经历了一系列的挑战。原本以为只需部署 logstash 容器并挂载日志文件即可完成,但实际操作中遇到了许多细节问题,这主要由于我作为研发人员在运维领域经验不足。在寻找解决方案的过程中,我发现网络上虽有许多文章,但未能找到一次性解决所有问题的教程。以下是我部署过程中的经验分享,希望能对有需要的同学有所帮助。容器部署方面,使用了 logstash:8.12.2 官方镜像。由于容器分布在不同节点上,为确保数据一致性与可靠性,我选择了 StatefulSet 而非 DaemonSet。StatefulSet 通过 volumeClaimTemplates 功能动态创建了 PVC(Persistent Volume Claim),以支持 logstash 配置文件、插件等数据的持久化存储。在配置方面,logstash 容器默认使用 9600 端口提供 HTTP 访问,主要用于监控相关操作。因此,我声明了一个 service 作为备用,以确保日志收集的稳定性。部署 YAML 文件如下,包括了 StatefulSet 的配置、service 的定义以及容器所需的配置文件。配置文件的构建包括了以下几个部分:logstash.yml(主程序配置文件)、jvm.options(主程序 JVM 运行环境配置文件)以及多个 logstash-xxx.conf 文件(用于收集任务的配置文件,建议统一挂载到容器的 /usr/share/logstash/pipeline 目录下)。在 logstash.yml 和 jvm.options 配置中,特别注意了 config.reload.interval 和 pipeline.batch.delay 的单位设置,确保它们以秒为单位。忽略这一细节可能导致 CPU 资源的过度消耗。对于 logstash-nginx-log.conf 文件,关键配置包括自动加载 /usr/share/logstash/pipeline 下的任务配置文件,并不断扫描以解析新数据并提交至 ES(Elasticsearch)。建议将任务按照类别统一配置到同一配置文件中,以提高管理和维护的效率。部署并启动容器后,logstash 将自动加载配置文件并开始收集 nginx log 数据。通过配置中的 stdout { codec => rubydebug },可以实时查看解析过程和结果,有助于调试和优化。在分享经验的同时,也欢迎关注或点赞以支持,如有其他技术需求,如可行性分析、上云咨询、架构设计、疑难问题解决、团队建设等,本人提供相关技术支持。