我的目标是从运行在 Bare Kubernetes 上的 Java (Spring Boot) 应用程序收集日志。 然后将这些日志翻译成 ES 并在 Kibana 中可视化。
出于这些目的,我通过 Kubernetes 1.22 部署了 Fleunt Bit 1.8.9。由于我使用 Containerd 而不是 Docker,因此我的 Fluent Bit 配置如下(请注意我只指定了一个日志文件):
fluent-bit.conf: |
[SERVICE]
Flush 1
Log_Level info
Daemon off
Parsers_File parsers.conf
HTTP_Server On
HTTP_Listen 0.0.0.0
HTTP_Port 2020
@INCLUDE input-kubernetes.conf
@INCLUDE filter-kubernetes.conf
@INCLUDE output-elasticsearch.conf
input-kubernetes.conf: |
[INPUT]
Name tail
Tag kube.*
Path /var/log/containers/*.log
Read_from_head true
Parser cri
filter-kubernetes.conf: |
[FILTER]
Name kubernetes
Match kube.*
Kube_URL https://kubernetes.default.svc:443
Kube_CA_File /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
Kube_Token_File /var/run/secrets/kubernetes.io/serviceaccount/token
Kube_Tag_Prefix kube.var.log.containers.
Merge_Log On
Merge_Log_Key log_processed
K8S-Logging.Parser On
K8S-Logging.Exclude Off
output-elasticsearch.conf: |
[OUTPUT]
Name es
Match kube.*
Host ${FLUENT_ELASTICSEARCH_HOST}
Port ${FLUENT_ELASTICSEARCH_PORT}
Index kube-code_index
Type kube-code_type
parsers.conf: |
[PARSER]
Name cri
Format regex
Regex ^(?<time>[^ ]+) (?<stream>stdout|stderr) (?<logtag>[^ ]*) (?<message>.*)$
Time_Key time
Time_Format %Y-%m-%dT%H:%M:%S.%L%z
在 Kibana 中使用此配置,Java 堆栈跟踪消息将以非结构化方式显示:
我试过这样的配置:
input-kubernetes.conf: |
[INPUT]
Name tail
Tag kube.*
Path /var/log/containers/*.log
Read_from_head true
Multiline.parser cri, multiline-regex-cri
和:
parsers.conf: |
[PARSER]
# http://rubular.com/r/tjUt3Awgg4
Name cri
Format regex
Regex ^(?<time>[^ ]+) (?<stream>stdout|stderr) (?<logtag>[^ ]*) (?<message>.*)$
Time_Key time
Time_Format %Y-%m-%dT%H:%M:%S.%L%z
[MULTILINE_PARSER]
name multiline-regex-cri
type regex
flush_timeout 1000
#
# Regex rules for multiline parsing
# ---------------------------------
#
# configuration hints:
#
# - first state always has the name: start_state
# - every field in the rule must be inside double quotes
#
# rules | state name | regex pattern | next state
# ------|---------------|--------------------------------------------
rule "start_state" "/(\D+ \d+ \d+\:\d+\:\d+)(.*)/" "cont"
rule "cont" "/^\s+at.*/" "cont"
请帮我构建日志。
最佳答案
我也遇到过这个问题。如果您在输入上使用多个解析器,fluentbit 会尝试将它们中的每一个应用于相同的原始输入,而不是一个接一个地应用它们。
当你有多个多行解析器,并希望一个接一个地应用它们时,你应该使用过滤器,在你的情况下它会是这样的:
[INPUT]
Name tail
Tag kube.*
Path /var/log/containers/*.log
Read_from_head true
Multiline.parser cri
[FILTER]
Name multiline
Match kube.*
multiline.key_content log
multiline.parser java
我可以在你的屏幕截图中看到,你正在尝试解析 java stacttrace,为此你可以使用内置的 java
解析器,所以你不需要 multiline-regex-cri
。
关于fluentd - Fluent Bit 1.8+ 和 MULTILINE_PARSER,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69878876/