在AWS Fargate的Logstash Docker中,如何通过环境变量停止向stdout输出日志?
解决Logstash在Fargate中输出事件到stdout导致循环的问题
首先得明确:你看到的这些日志不是Logstash的系统运行日志,而是它处理的事件数据(这里是从CloudWatch读取的ECS监控指标),所以你设置的log_level: WARN根本管不到这部分——log_level只控制Logstash自身的启动、插件加载这类系统日志的级别,和pipeline处理的事件输出完全是两回事。
要解决这个循环问题,核心是阻止Logstash把处理的事件输出到stdout,用环境变量可以这么做:
方法1:直接通过环境变量覆盖输出配置
如果你的Logstash是用环境变量来配置pipeline的,可以直接设置LS_PIPELINE_OUTPUTS,只保留Elasticsearch的输出,删掉stdout:
LS_PIPELINE_OUTPUTS='{ "elasticsearch": { "hosts": ["你的Elasticsearch地址:9200"], "index": "目标索引名-%{+YYYY.MM.dd}" } }'
把这个环境变量加到Fargate的任务定义里,Logstash就只会把事件发送到ELK,不会再输出到stdout了。
方法2:用环境变量控制stdout输出开关(适合自定义配置文件的场景)
如果你是用自己的logstash.conf配置文件,可以在配置里加一个条件判断,通过环境变量来决定是否启用stdout输出:
input { # 你的CloudWatch输入配置 cloudwatch { # ... 你的配置项 } } filter { # 你的过滤规则 } output { # 保留ELK输出 elasticsearch { hosts => ["${ES_HOST}"] index => "${ES_INDEX}" } # 只有当环境变量ENABLE_STDOUT为true时,才启用stdout输出 if "${ENABLE_STDOUT}" == "true" { stdout { codec => rubydebug } } }
然后在Fargate任务定义里设置环境变量ENABLE_STDOUT=false,这样生产环境就不会输出事件到stdout,自然也就不会形成循环了。
额外排查:如果是Logstash内部监控指标
万一你看到的是Logstash自身的监控数据(比如JVM内存、CPU),可以通过以下环境变量禁用stdout输出:
LS_METRICS_STDOUT_ENABLED=false:禁用基础metrics的stdout输出LS_XPACK_MONITORING_ENABLED=false:如果启用了X-Pack监控,关闭它避免额外输出
内容的提问来源于stack exchange,提问作者CoyoteKG
相关产品推荐
相关产品推荐

