kubernetes 上的日志收集方案很多,有从容器主动发送到日志中心的,有和 OpenTelemetry 配合 LoKi 中心化的,最近发现 fluentbit 这个轻量的方案很 nice。
fluentbit 用 c 写的,内存占用极小,是 fluentd 的替代方案,配置能力很强,可以用 regex 写 log parser,支持 multiline parser,能很方便把日志(包括异常堆栈)给结构化成 json,自动发送到日志中心,比如 aws cloudwatch,效果像这样:
{
"level": "INFO",
"application": "hackertalk-monster",
"traceId": "65521cff9b7428726e36bb4568ac24d8",
"spanId": "b285f431045afe34",
"thread": "http-nio-8080-exec-9",
"class": "a.p.hackertalk.controller.TestController",
"message": "Hello World!",
"kubernetes": {
"pod_name": "app-deployment-777cc12778-l6bcd",
"namespace_name": "hackertalk",
"container_name": "monster",
"container_image": "hackertalk/monster:2023-11-13-12-18-11"
}
}
单行日志解析为 json,配合 aws x-ray 可以方便实现分布式链路跟踪。
Note:fluentbit 默认会收集全部容器日志,需要配置 INPUT 避免 nginx 等无用日志收集。