regex - 如何使用 fluent-bit 解析 istio-proxy 日志
问题描述
需要帮助弄清楚如何使用 fluent-bit 解析 istio-logs 或如何使 fluentbit 解析更“可调试”(哪个“位”失败)
在下面找到我的 fluent-bit 配置
input-kubernetes.conf: |
[INPUT]
Name tail
Tag_Regex (?<pod_name>[a-z0-9](?:[-a-z0-9]*[a-z0-9])?(?:\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*)_(?<namespace_name>[^_]+)_(?<container_name>.+)-(?<docker_id>[a-z0-9]{64})\.log$
Tag k8s_containers.<namespace_name>.<container_name>.<pod_name>.<docker_id>-
Path /var/log/containers/*.log
Exclude_Path /var/log/containers/mailhog*
Parser docker
DB /var/log/flb_kube.db
Mem_Buf_Limit 5MB
Skip_Long_Lines On
Refresh_Interval 10
filter-kubernetes.conf: |
[FILTER]
Name kubernetes
Match k8s_containers.**
Kube_Tag_Prefix k8s_containers.
Kube_URL https://${KUBERNETES_SERVICE_HOST}:${KUBERNETES_SERVICE_PORT_HTTPS} tls.verify Off
K8S-Logging.Parser On
K8S-Logging.Exclude On
Merge_Log On
Merge_Log_Key log_processed
Regex_Parser k8s-custom-tag
[FILTER]
Name istioproxy
Match k8s_containers.*.istio-proxy
Key_Name log
Parser envoy
output-elasticsearch.conf: |
[OUTPUT]
Name es
Match *
Host ${FLUENT_ELASTICSEARCH_HOST}
Port ${FLUENT_ELASTICSEARCH_PORT}
Logstash_Format On
Replace_Dots On
Retry_Limit False
Time_Key timestamp-es
Include_Tag_Key On
tls On
tls.verify Off
tls.crt_file /fluent-bit/etc/certs/tls.crt
tls.key_file /fluent-bit/etc/certs/tls.key
HTTP_User elastic
HTTP_Passwd ${ELASTIC_PASSWORD}
<<snip>>
parsers.conf: |
[PARSER]
Name k8s-custom-tag
Format regex
Regex (?<namespace_name>[^_]+)\.(?<container_name>.+)\.(?<pod_name>[a-z0-9](?:[-a-z0-9]*[a-z0-9])?(?:\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*)\.(?<docker_id>[a-z0-9]{64})-$
[PARSER]
Name nginx-ingress
Format regex
Regex ^(?<host>[^ ]*) - \[(?<real_ip>[^ ]*)\] - (?<user>[^ ]*) \[(?<time>[^\]]*)\] "(?<method>\S+)(?: +(?<path>[^\"]*?)(?: +\S*)?)?" (?<code>[^ ]*) (?<size>[^ ]*) "(?<referer>[^\"]*)" "(?<agent>[^\"]*)" (?<request_length>[^ ]*) (?<request_time>[^ ]*) \[(?<proxy_upstream_name>[^ ]*)\] (?<upstream_addr>[^ ]*) (?<upstream_response_length>[^ ]*) (?<upstream_response_time>[^ ]*) (?<upstream_status>[^ ]*) (?<last>[^$]*)
Time_Key time
Time_Format %d/%b/%Y:%H:%M:%S %z
[PARSER]
Name envoy
Format regex
Regex \[(?<time>[^\]]*)\] "(?<method>\S+)(?: +(?<path>[^\"]*?)(?: +\S*)?)? (?<protocol>\S+)" (?<code>[^ ]*) (?<dunno1>[^ ]*) "(?<dunno2>\S+)" "(?<dunno3>\S+)" (?<maybe_bytes_sent>[^ ]*) (?<maybe_bytes_received>[^ ]*) (?<maybe_duration>[^ ]*) (?<maybe_duration2>[^ ]*) "(?<ips>[0-9\.\-,\s]*)" "(?<agent>[^\"]*)" "(?<request_id>[^\"]*)" "(?<url>[^\"]*)" "(?<destination_ip>[^\"]*)" (?<magic>[^ ]*) (?<dunno4>[^ ]*) (?<another_ip>[^ ]*) (?<another_ip2>[^ ]*) (?<magic2>[^ ]*)
#Time_Keep Off
Time_Key time
Time_Format %Y-%m-%dT%H:%M:%S.%L
我确实有一个其他可行的解决方案 - 正确解析了 nginx-ingress 日志。
使用 istio-proxy 注入的容器,我必须自己进行解析器匹配(这些没有注释)。
我的特使正则表达式似乎适用于通过https://regex101.com/或https://rubular.com/进行的所有随机 istio-proxy 日志检查
[2019-08-23T00:39:51.546Z] "GET /api/authenticate?login_challenge=30cd90e278ff4591a07e9bef80235a7b HTTP/1.1" 200 - "-" "-" 0 1284 25 25 "25.25.25.25" "Go-http-client/1.1" "57d14491b1441a5634f0354d6425b882" "login.example.com" "127.0.0.1:80" inbound|80|http|frontend.uat.svc.cluster.local - 10.233.120.18:80 25.25.25.25:0 outbound_.80_._.frontend.uat.svc.cluster.local
不幸的是,Istio-proxy 日志出现在 kibana 中,但以未解析的方式出现。
帮助表示赞赏!
解决方案
在我的 minikube 集群上测试 fluent-bit:v1.2.1 时,我发现了同样的问题。所以我四处挖掘并做了一些修改,envoy filter
但没有任何效果。
Match: kube.*.istio-proxy
是问题所在。路由似乎很模糊。所以我将匹配规则kube.istio-proxy.*
更改为并将输入部分中的标签定义更改为kube.<container_name>.<namespace_name>.xxxx
解析器部分。
它奏效了!
更新:阅读解析器文档后,我添加Reserve_Data
到我的 filter
[FILTER]
Name parser
Match kube.istio-proxy.*
Key_Name log
Reserve_Data On
Parser envoy
推荐阅读
- dotenv - 如何在 dotenv 8.2 中存储多行键?
- javascript - React 或 Next 如何使他们的标签不重新加载页面而是加载内容?
- windows-xp - WinXP VM 无法连接 DHCP 以获取 ipaddress
- string - 将连接文本字符串转换为日期
- c++ - C++ 中的二维动态分配使用带有空间局部性的 New
- javascript - 在单个函数中获取基于单元的 JS 代码
- html - 如何使导航栏居中?
- antlr - 没有可行的替代解析宏和覆盖
- javascript - 在输入字段中输入 3 个字符后如何显示 mat-menu?
- c++ - 当我们将基类复制构造函数设为私有时会发生什么?