V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
Olsen
V2EX  ›  问与答

关于容器化的日志统一收集有什么好的解决方案???

  •  
  •   Olsen · 2019-08-19 09:39:06 +08:00 · 4380 次点击
    这是一个创建于 1953 天前的主题,其中的信息可能已经有所发展或是发生改变。

    背景:服务通过容器化改造,通过 K8s 多实例部署,但是在日志收集上遇到了问题, 需求:要根据 PODid PODname 和 namespace 标记日志是来自与哪个实例? 各位屌大的,貴司都是怎麽解決的

    26 条回复    2019-08-23 12:23:01 +08:00
    devtiange
        1
    devtiange  
       2019-08-19 09:48:26 +08:00
    node 上部署 DaemonSet, 读 log, 往 ES 里写. 自己撸一个也不会太麻烦
    SunnyFeng
        2
    SunnyFeng  
       2019-08-19 09:56:16 +08:00
    阿里有开源的 log-pilot 可以满足你的需求。
    Biebe
        3
    Biebe  
       2019-08-19 10:28:38 +08:00
    fluent
    Nitroethane
        4
    Nitroethane  
       2019-08-19 11:28:04 +08:00 via Android
    @devtiange 赞同使用 es。最近又在研究 elk,感觉好多功能都可以上马 elk 全套
    Cbdy
        5
    Cbdy  
       2019-08-19 11:29:34 +08:00 via Android
    接管容器的标准输出,传给 ES,剩下的就是搜索引擎的事情了
    annoymous
        6
    annoymous  
       2019-08-19 11:42:36 +08:00
    efk
    Olsen
        7
    Olsen  
    OP
       2019-08-19 12:20:09 +08:00   ❤️ 1
    @Biebe Fluentd 还是 Fluent-bit,你们有具体的实践?
    Fluent-bit 怎么解决的 Java Exception Stack 多行日志的问题
    Olsen
        8
    Olsen  
    OP
       2019-08-19 12:20:57 +08:00
    @annoymous 日志收集用的什么? Fluent-bit 还是 Fluentd 还是 Filebeat ?
    Olsen
        9
    Olsen  
    OP
       2019-08-19 12:21:50 +08:00
    @Cbdy 用什么收集容器的标准输出啊?
    Olsen
        10
    Olsen  
    OP
       2019-08-19 12:23:43 +08:00
    @devtiange 这样子的容器化从 13 年到现在有没有比较成熟的日志收集方案?没必要重复造轮子吧?你用过吗?
    monsterxx03
        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
    HuHui
        12
    HuHui  
       2019-08-19 12:37:39 +08:00 via Android
    elk,efk
    Olsen
        13
    Olsen  
    OP
       2019-08-19 12:38:29 +08:00
    @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
    Olsen
        14
    Olsen  
    OP
       2019-08-19 12:42:17 +08:00
    @HuHui 能拿到日志所在 Pod 的 podname podid 和 namespace ?
    Olsen
        15
    Olsen  
    OP
       2019-08-19 12:43:06 +08:00
    @SunnyFeng 好的,一会去研究一下
    monsterxx03
        16
    monsterxx03  
       2019-08-19 13:05:09 +08:00
    @Olsen fluent-bit 的 Regex 都是匹配一行的, 内容需要包在 ^$ 里面吧, 但我也没试过,你试试
    Olsen
        17
    Olsen  
    OP
       2019-08-19 13:42:47 +08:00
    @monsterxx03 加了也不行,在 fluent-bit 的 github 的 issue 上别人写的能用的 Regex 我这也不能用,就是因为这个 Fluent-bit 走不下去了,才回头想其他方法的
    rockyou12
        18
    rockyou12  
       2019-08-19 14:05:57 +08:00
    lz 是 spring boot 的程序嘛?我们也是部署到 k8s 上,但收集日志是用的 logback -> logstatsh -> elasticsearch 来收集,好处是配置比 fluent 更简单,收集信息也更丰富,可以把无用的 stack 信息直接过滤。不过和应用有耦合,同时也没有通用性
    JasonYo
        19
    JasonYo  
       2019-08-19 14:36:04 +08:00
    容器化服务,部署时挂载日志目录(公有云 NAS),再走固定节点部署 ds-filebeat and -->kafka-->logstash-->es
    that's it
    Olsen
        20
    Olsen  
    OP
       2019-08-19 15:16:58 +08:00
    @rockyou12 有一个问题就是在进行集群部署的时候 可能一个服务部署了三个实例 A1 A2 A3 在进行日志收集的时候怎么区分日志来自于哪个实例?比如 Pod name,namespace,label 等
    Olsen
        21
    Olsen  
    OP
       2019-08-19 15:17:57 +08:00
    @JasonYo 有一个问题就是在进行集群部署的时候 可能一个服务部署了三个实例 A1 A2 A3 在进行日志收集的时候怎么区分日志来自于哪个实例?比如 Pod name,namespace,label 等
    JasonYo
        22
    JasonYo  
       2019-08-19 15:23:25 +08:00
    @Olsen #21 通过环境变量获取容器信息
    rockyou12
        23
    rockyou12  
       2019-08-19 17:18:05 +08:00
    @Olsen pod 的环境变量里有这些信息,直接拿就是
    devtiange
        24
    devtiange  
       2019-08-19 23:54:09 +08:00
    @Olsen 没有发现特别好的开箱即用轮子, 我之前用的是基于 fluentd 的方案, 写一个 ruby 插件, 来读 docker/k8s 的特有信息. 然后发到 ES 或者 kafka.
    Olsen
        25
    Olsen  
    OP
       2019-08-23 11:40:44 +08:00
    @rockyou12 具体的一个流程能简要的介绍一下?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5884 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 03:12 · PVG 11:12 · LAX 19:12 · JFK 22:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.