我已经在我的 Kubernetes 集群上使用 Fluent-bit 配置了 EFK 堆栈。我可以在 Kibana 中看到日志。
我也部署了 nginx pod,我也可以在 Kibana 中看到这个 nginx pod 的日志。但是所有日志数据都发送到单个字段“日志”,如下所示。
如何将每个字段提取到一个单独的字段中。在这个问题中已经有一个针对 fluentd 的解决方案。Kibana - 如何从现有 Kubernetes 日志中提取字段
但是我怎样才能用 fluent-bit 达到同样的效果呢?
我已经通过在 Kubernetes 的默认 FILTER 部分下再添加一个 FILTER 部分来尝试以下方法,但没有奏效。
Run Code Online (Sandbox Code Playgroud)[FILTER] Name parser Match kube.* Key_name log Parser nginx
从这个(https://github.com/fluent/fluent-bit/issues/723),我可以看到 fluent-bit 没有 grok 支持。
我正在尝试将日志从 Kubernetes 集群写入 Elasticsearch 索引。Fluent-bit 用于读取标准输出,并使用包括 Pod 标签在内的元数据来丰富日志。一个简化的日志对象示例是
{
"log": "This is a log message.",
"kubernetes": {
"labels": {
"app": "application-1"
}
}
}
Run Code Online (Sandbox Code Playgroud)
问题是部署到集群的一些其他应用程序具有以下格式的标签:
{
"log": "This is another log message.",
"kubernetes": {
"labels": {
"app.kubernetes.io/name": "application-2"
}
}
}
Run Code Online (Sandbox Code Playgroud)
这些应用程序是通过 Helm 图表安装的,较新的应用程序遵循此处列出的标签和选择器约定。标签和选择器的命名约定于 2018 年 12 月更新,请参见此处,但并非所有图表都已更新以反映这一点。
最终结果是,根据哪种类型的标签格式首先将其纳入弹性索引,尝试发送其他类型将引发映射异常。如果我创建一个新的空索引并首先发送命名空间标签,则尝试记录简单app标签将引发此异常:
object mapping for [kubernetes.labels.app] tried to parse field [kubernetes.labels.app] as object, but found a concrete value
Run Code Online (Sandbox Code Playgroud)
相反的情况,第二个发布命名空间标签,会导致此异常:
Could not dynamically add mapping for field [kubernetes.labels.app.kubernetes.io/name]. …Run Code Online (Sandbox Code Playgroud) elasticsearch logstash kubernetes kubernetes-helm fluent-bit
任何帮助是极大的赞赏。
我在 kubernetes 上运行 fluidd。我有来自java应用程序的日志。堆栈跟踪是多行的,问题是多行日志的每一行都被报告为新的日志事件。
下面是我的配置。有人可以建议配置有什么问题吗?另外,我使用containerd而不是docker来运行容器。
input-kubernetes.conf: |
[INPUT]
Name tail
Tag kube.*
Path /var/log/containers/*.log
DB /var/log/flb_kube.db
Mem_Buf_Limit 5MB
Skip_Long_Lines On
Refresh_Interval 10
Multiline On
Parser_Firstline multiline
Parser_1 cri
filter-kubernetes.conf: |
[FILTER]
Name kubernetes
Match kube.*
Kube_URL https://k3s-master.test.com:6443
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.
K8S-Logging.Parser On
K8S-Logging.Exclude Off
[FILTER]
Name parser
Match kube.*
Key_Name log
Parser cri
Reserve_Data On
[FILTER]
Name parser
Match kube.*
Key_Name message
Parser json
Reserve_Data On
Preserve_Key On
output-elasticsearch.conf: |
[OUTPUT]
Name es
Match *
Host …Run Code Online (Sandbox Code Playgroud) 我已按照本指南在我的 EKS 集群上配置 Fluent Bit 和 Cloudwatch,但目前所有日志都转到一个日志组。我尝试遵循一个单独的教程,该教程使用 Fluent Bit 的 kubernetes 插件在到达 [OUTPUT] 配置之前标记服务。这导致了问题,因为 Fargate EKS 目前不按照本文档底部处理 Fluent Bit [INPUT] 配置。
以前有人遇到过这种情况吗?我想将日志分成单独的服务。
这是我当前的 YAML 文件。我添加了解析器和过滤器,以查看是否可以获得任何其他信息以在 Cloudwatch 上使用。
kind: Namespace
apiVersion: v1
metadata:
name: aws-observability
labels:
aws-observability: enabled
---
kind: ConfigMap
apiVersion: v1
metadata:
name: aws-logging
namespace: aws-observability
data:
parsers.conf: |
[PARSER]
Name docker
Format json
Time_Key time
Time_Format %Y-%m-%dT%H:%M:%S.%L
Time_Keep On
filters.conf: |
[FILTER]
Name kubernetes
Match kube.*
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.
Kube_URL …Run Code Online (Sandbox Code Playgroud) amazon-cloudwatch kubernetes aws-fargate amazon-eks fluent-bit
我的目标是从 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 …Run Code Online (Sandbox Code Playgroud) 我有以下日志
{
"log": {
"header": {
"key": "value",
"nested": "{\"key1\":\"value\",\"key2\":\"value\"}",
"dateTime": "2019-05-08T20:58:06+00:00"
},
"body": {
"path": "/request/path/",
"method": "POST",
"ua": "curl/7.54.0",
"resp": 200
}
}
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用 Fluentbit 聚合日志,并且希望整个记录为 JSON。具体问题是“log.header.nested”字段,它是一个 JSON 字符串。如何解析该字符串并将其替换为其内容?
我尝试使用Fluentbit的解析器过滤器。但我有一个问题,key_name它不能很好地处理嵌套的 json 值。我尝试使用非嵌套字段在本地测试它,并且以下配置有效:
[INPUT]
name tail
path nst.log
read_from_head true
Parser json
[FILTER]
name parser
Match *
Parser json
key_name log
Reserve_Data On
[FILTER]
name parser
Match *
Parser json
key_name nested
Reserve_Data On
[OUTPUT]
name stdout
match *
Run Code Online (Sandbox Code Playgroud)
但是当我尝试使用此过滤器来过滤嵌套值时:
[FILTER]
name parser
Match * …Run Code Online (Sandbox Code Playgroud) 我正在使用 fluidd 将日志发送到 ES。应用程序日志采用 JSON 格式。这是其中之一
{"@timestamp":"2022-05-06T06:02:10.669Z", "log.level": "INFO", "message":"INFO Health check ok", "ecs.version": "1.2.0","service.name":"spring-boot-application","event.dataset":"spring-boot-application","process.thread.name":"http-nio-9001-exec-7","log.logger":"com.app.designer.rules.controller.RulesController","transaction.id":"15e36b5ef6cc69dd","trace.id":"fd275718e25c061d309954773985b101"}
Run Code Online (Sandbox Code Playgroud)
JSON日志是一个key的值log。但是,我们需要 JSON 日志键值,正如Field and Value
请建议的那样。流畅的位配置图是:
apiVersion: v1
kind: ConfigMap
metadata:
name: fluent-bit-designer
data:
fluent-bit-service.conf: |
[SERVICE]
Flush 1
Daemon Off
Log_Level error
Parsers_File parsers.conf
fluent-bit-input.conf: |
[INPUT]
Name tail
Path /app/logs/designer-logs.log.json
Multiline On
Parser_Firstline multiline_pattern
Refresh_Interval 5
Mem_Buf_Limit 5MB
Skip_Long_Lines On
Path_key FileName
fluent-bit-filter.conf: |
[FILTER]
Name modify
Match *
Add PodName ${POD_NAME}
Add Namespace ${NAMESPACE_NAME}
fluent-bit-output.conf: | …Run Code Online (Sandbox Code Playgroud) 我在 Kubernetes 中使用 fluent-bit 将日志转发到 Splunk。我们将为多个 Kubernetes 集群使用相同的 Splunk 索引,所以我想用它来自的集群标记从 fluent-bit 转发的每个事件。
我尝试使用修改功能在事件中“添加”或“设置”一个新字段。
fluent-bit-filter.conf: |-
[FILTER]
Name kubernetes
Match kube.*
Kube_Tag_Prefix kube.var.log.containers.
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
K8S-Logging.Parser On
K8S-Logging.Exclude On
Add cluster devcluster
Run Code Online (Sandbox Code Playgroud)
我实际收到的示例日志(缺少新添加的字段“集群”)
[305] kube.var.log.containers.calico-node-xzwnv_kube-system_calico-node-a4a6a2261a76ec419e9cf13ae39732b3e918726573cf1a0dece648e679011578.log: [1565578883.799679612, {"log"=>"2019-08-12 03:01:23.799 [INFO][68] int_dataplane.go 830: Received interface update msg=&intdataplane.ifaceUpdate{Name:"cali5d1a7318787", State:"up"}
Run Code Online (Sandbox Code Playgroud) 我正在使用 docker-compose.yml 来启动我的服务。所有服务看起来都是这样的:
A-service:
image: A-service
restart: always
network_mode: host
logging:
driver: journald
options:
tag: "{{.ImageName}}/{{.Name}}/{{.ID}}"
fluent-bit:
image: 'bitnami/fluent-bit:latest'
restart: always
network_mode: host
command: /fluent-bit/bin/fluent-bit -c /fluent-bit/etc/fluent-bit.conf
volumes:
- ./service/config/fluent-bit.conf:/fluent-bit/etc/fluent-bit.conf
- type: bind
source: /run/log
target: /run/log
Run Code Online (Sandbox Code Playgroud)
当我运行时journalctl -e -f -u docker,我看到所有日志都被记录得很好。我遇到的问题是我的 fluid-bit 容器在从 systemd 收集时似乎无法获取任何数据:
fluent-bit.conf:
[SERVICE]
Flush 5
Daemon Off
Log_Level debug
[INPUT]
Name systemd
Tag *
[OUTPUT]
Name stdout
Match *
Run Code Online (Sandbox Code Playgroud)
我认为这可能是因为它位于容器中并且无法到达日志位置,但绑定目录/run/log:/run/log没有效果。
所以我的问题是:当日志位于容器内时,Fluent-bit 可以到达 systemd 并读取日志吗?如果是 - 我怎样才能实现这一目标?
我正在尝试将日志从基本的 java maven 项目发送到远程计算机上配置的 Fluent-bit。Fluent-bit 然后会将它们写入文件。这是我的基本java配置。
爪哇
private final static Logger logger = LoggerFactory.getLogger(App.class);
public static void main(String[] args) {
for (int i = 0; ; i++) {
logger.debug("Warn msg");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// do nothing now
}
}
}
Run Code Online (Sandbox Code Playgroud)
和 logback.xml
<appender name="fluentd" class="ch.qos.logback.more.appenders.DataFluentAppender">
<remoteHost>xx.xxx.xxx.xxx</remoteHost>
<port>7777</port>
<encoder>
<pattern>%message%n</pattern>
</encoder>
</appender>
<root level="DEBUG">
<appender-ref ref="fluentd" />
</root>
Run Code Online (Sandbox Code Playgroud)
Fluent位配置:
td-agent-bit.conf
[INPUT]
Name tcp
Listen xx.xxx.xxx.xxx
Port 7777
Parsers_File /etc/td-agent-bit/parsers.conf
Parser custom_parser
[OUTPUT]
Name file
Match * …Run Code Online (Sandbox Code Playgroud) fluent-bit ×10
kubernetes ×5
logging ×3
java ×2
json ×2
kibana ×2
parsing ×2
amazon-eks ×1
aws-fargate ×1
docker ×1
efk ×1
fluentd ×1
logback ×1
logstash ×1
multiline ×1
photon-os ×1
splunk ×1
systemd ×1