背景:服务通过容器化改造,通过 K8s 多实例部署,但是在日志收集上遇到了问题, 需求:要根据 PODid PODname 和 namespace 标记日志是来自与哪个实例? 各位屌大的,貴司都是怎麽解決的
1
devtiange 2019-08-19 09:48:26 +08:00
node 上部署 DaemonSet, 读 log, 往 ES 里写. 自己撸一个也不会太麻烦
|
2
SunnyFeng 2019-08-19 09:56:16 +08:00
阿里有开源的 log-pilot 可以满足你的需求。
|
3
Biebe 2019-08-19 10:28:38 +08:00
fluent
|
4
Nitroethane 2019-08-19 11:28:04 +08:00 via Android
@devtiange 赞同使用 es。最近又在研究 elk,感觉好多功能都可以上马 elk 全套
|
5
Cbdy 2019-08-19 11:29:34 +08:00 via Android
接管容器的标准输出,传给 ES,剩下的就是搜索引擎的事情了
|
6
annoymous 2019-08-19 11:42:36 +08:00
efk
|
7
Olsen OP @Biebe Fluentd 还是 Fluent-bit,你们有具体的实践?
Fluent-bit 怎么解决的 Java Exception Stack 多行日志的问题 |
11
monsterxx03 2019-08-19 12:25:33 +08:00
之前做的时候我用的 fluent-bit + fluentd: https://blog.monsterxx03.com/2019/05/26/centralized-logging-on-k8s/
fluent-bit 有 multi line mode, 但要自己写一个正则去 parser |
12
HuHui 2019-08-19 12:37:39 +08:00 via Android
elk,efk
|
13
Olsen OP @monsterxx03 自己写的 parser 老是报错,找不到具体原因,Regex 也检测过,没有什么问题啊
我给你贴一下 你看看能不能看出来什么原因 [PARSER] Name findfirstline Format regex Time_Key time Regex .(?<log>\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}|DEBUG|INFO|ERROR). Time_Format %Y-%m-%d %H:%M:%S.%L Time_Keep On Decode_Field_As escaped_utf8 log findfirstline 这个 parser 报错,错误如下,不知道为什么? [2019/08/15 09:29:24] [error] [in_tail] multiline: invalid parser 'findfirstline' [2019/08/15 09:29:24] [error] Failed initialize input tail.0 |
16
monsterxx03 2019-08-19 13:05:09 +08:00
@Olsen fluent-bit 的 Regex 都是匹配一行的, 内容需要包在 ^$ 里面吧, 但我也没试过,你试试
|
17
Olsen OP @monsterxx03 加了也不行,在 fluent-bit 的 github 的 issue 上别人写的能用的 Regex 我这也不能用,就是因为这个 Fluent-bit 走不下去了,才回头想其他方法的
|
18
rockyou12 2019-08-19 14:05:57 +08:00
lz 是 spring boot 的程序嘛?我们也是部署到 k8s 上,但收集日志是用的 logback -> logstatsh -> elasticsearch 来收集,好处是配置比 fluent 更简单,收集信息也更丰富,可以把无用的 stack 信息直接过滤。不过和应用有耦合,同时也没有通用性
|
19
JasonYo 2019-08-19 14:36:04 +08:00
容器化服务,部署时挂载日志目录(公有云 NAS),再走固定节点部署 ds-filebeat and -->kafka-->logstash-->es
that's it |
20
Olsen OP @rockyou12 有一个问题就是在进行集群部署的时候 可能一个服务部署了三个实例 A1 A2 A3 在进行日志收集的时候怎么区分日志来自于哪个实例?比如 Pod name,namespace,label 等
|
21
Olsen OP @JasonYo 有一个问题就是在进行集群部署的时候 可能一个服务部署了三个实例 A1 A2 A3 在进行日志收集的时候怎么区分日志来自于哪个实例?比如 Pod name,namespace,label 等
|
24
devtiange 2019-08-19 23:54:09 +08:00
@Olsen 没有发现特别好的开箱即用轮子, 我之前用的是基于 fluentd 的方案, 写一个 ruby 插件, 来读 docker/k8s 的特有信息. 然后发到 ES 或者 kafka.
|
26
rockyou12 2019-08-23 12:23:00 +08:00
|