如何将自定义摄取管道与坞站自动发现结合使用 [英] How to use custom ingest pipelines with docker autodiscover
问题描述
我很难将定制的Elasticearch接收管道与FileBeat的Docker自动发现结合使用。我从filebeat.yml
文件中的自定义处理器开始,但我更愿意将其转换为我创建的自定义接收管道。
文件节拍配置:
filebeat.config:
modules:
path: ${path.config}/modules.d/*.yml
reload.enabled: true
reload.period: 60s
filebeat.autodiscover:
providers:
- type: docker
hints.enabled: true
json.keys_under_root: true
processors:
- if:
equals:
docker.container.labels.co_elastic_logs/custom_processor: servarr
then:
- copy_fields:
fields:
- from: message
to: log.original
fail_on_error: false
ignore_missing: true
- dissect:
tokenizer: "[%{log.level}] %{log.logger}: %{message}"
field: message
target_prefix: ""
overwrite_keys: true
ignore_failure: true
- script:
lang: javascript
id: lowercase
source: >
function process(event) {
var level = event.Get("log.level");
if(level != null) {
event.Put("log.level", level.toString().toLowerCase());
}
}
output.elasticsearch:
hosts: 'elasticsearch:9200'
username: 'elastic'
password: '*************'
setup.kibana.host: 'kibana:5601'
logging.json: true
logging.metrics.enabled: false
摘录自docker-compose.yml文件...
lidarr:
image: ghcr.io/linuxserver/lidarr:latest
container_name: lidarr
labels:
co.elastic.logs/custom_processor: "servarr"
和一个示例日志行(以json为单位):
{"log":"[Info] DownloadDecisionMaker: Processing 100 releases
","stream":"stdout","time":"2021-08-07T10:10:49.125702754Z"}
这工作得很好,实现了我提取字段的目标,但理想情况下,我希望使用Elasticearch(更强大)的摄取管道,并与更干净的filebeat.yml
共存,所以我创建了一个工作的摄取管道";filebeat-7.13.4-servarr-stdout-pipeline";,如下所示(忽略这样一个事实,目前,这只做了摸索):
[
{
"grok": {
"field": "message",
"patterns": [
"\[%{LOGLEVEL:log.level}\] %{WORD:log.logger}: %{GREEDYDATA:message}"
],
"trace_match": true,
"ignore_missing": true
}
}
]
我针对现有文档(我应该注意的是,没有应用了我的定制处理的文档)测试了管道。管道与我在Kibana界面中测试过的所有文档都一致。
因此,现在我要转换我的Filebeat配置,以便将此管道用于带有CUSTOMPROCER标签的容器。这是我想出的filebeat.yml
,它显然是有效的,大部分都有效,但不适用于摸索:
filebeat.config:
modules:
path: ${path.config}/modules.d/*.yml
reload.enabled: true
reload.period: 60s
filebeat.autodiscover:
providers:
- type: docker
hints.enabled: true
json.keys_under_root: true
appenders:
- type: config
condition.equals:
docker.container.labels.co_elastic_logs/custom_processor: servarr
config:
pipeline: filebeat-7.13.4-servarr-stdout-pipeline
output.elasticsearch:
hosts: 'elasticsearch:9200'
username: 'elastic'
password: '*************'
setup.kibana.host: 'kibana:5601'
logging.json: true
logging.metrics.enabled: false
如果我将FileBeat的内置模块用于其他容器(如nginx),则通过使用如下示例中的标签,将使用内置模块管道:
nginx-repo:
image: nginx:latest
container_name: nginx-repo
mem_limit: 2048m
environment:
- VIRTUAL_HOST=repo.***.***.***,repo
- VIRTUAL_PORT=80
- HTTPS_METHOD=noredirect
networks:
- default
- proxy
labels:
co.elastic.logs/module: "nginx"
co.elastic.logs/fileset.stdout: "access"
co.elastic.logs/fileset.stderr: "error"
我在这里做错了什么?日志仍然在Elasticearch和Kibana结束,并被处理,但我的grok不会应用,不会创建新字段,‘Message’字段也不会改变。
编辑:为了回应弹性论坛上链接到一篇帖子的一条评论,该评论建议显式显示路径和管道,我尝试了以下filebeat.yml
自动发现摘录,它也无法工作(但显然是有效的配置):
filebeat.autodiscover:
providers:
- type: docker
hints.enabled: true
json.keys_under_root: true
appenders:
- type: config
condition:
equals:
docker.container.labels.co_elastic_logs/custom_processor: "servarr"
config:
- type: docker
containers:
ids:
- "${data.docker.container.id}"
stream: all
paths:
- /var/lib/docker/containers/${data.docker.container.id}/${data.docker.container.id}-json.log
pipeline: filebeat-7.13.4-servarr-stdout-pipeline
我尝试使用带引号和未带引号的docker.container.labels.co_elastic_logs/custom_processor
值。我的行为与日志最终到达Elasticearch/Kibana的行为相同,但它们被处理时就像跳过了我的接收管道一样。
推荐答案
我们使用的是Kubernetes而不是Docker with FileBeat,但我们的配置可能仍能帮助您解决问题。
我们启用了自动发现,并将所有Pod日志发送到一个公共接收管道,除外,对于来自任何使用Redis模块的Redis Pod的日志,并根据它们是普通Redis日志还是慢日志Redis日志,通过两个自定义接收管道之一将其日志发送到Elasticearch,这在以下块中配置:
检测到的所有其他Pod日志将使用输出部分中的以下全部捕获配置发送到公共接收管道:
我们要做的其他事情是使用";set";处理器将接收管道的名称添加到接收的文档:
在Kibana中查看事件文档时,在诊断管道是否实际执行时,这已被证明非常有用。
这篇关于如何将自定义摄取管道与坞站自动发现结合使用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!