网易开源的云原生日志收集工具 - Loggie

共 1560字,需浏览 4分钟

 ·

2022-03-16 11:58


Loggie 是网易和中国工商银行联合发起的一个基于 Golang 的轻量级、高性能、云原生日志采集 Agent和中转处理 Aggregator 开源项目,支持多 Pipeline 和组件热插拔,提供了:


  • 🔨 一栈式日志解决方案:同时支持日志中转、过滤、解析、切分、日志报警等

  • 云原生的日志形态:快速便捷的容器日志采集方式,原生的 Kubernetes动态配置下发

  • 🔑 生产级的特性:Loggie 吸收了我们长期的大规模运维经验,形成了全方位的可观测性、快速排障、异常预警、自动化运维能力



结合网易数帆长期的业务实践,Loggie形成了如下几大特点:


  • 可扩展、热插拔:配置不同的 Source/Interceptor/Sink,拥有中转、过滤、解析、切分、日志报警等能力,可使用 Golang 快速自研插件

  • 强隔离:多 Pipeline 设计,减少互相干扰,可同时发送多个不同数据源

  • 轻量级、高性能:基于 Golang,极少的资源占用,强大的吞吐性能

  • 可靠性保障:完善的日志可观测性,原生 Prometheus metrics 支持,还有限流等 Interceptor

  • 云原生:配置中心集成 Kubernetes,创建 CRD 实例即可采集容器日志


同时,基于Loggie的流式数据传输设计,我们可以灵活使用 Loggie 的Pipeline。


从使用形态上可划分为:


  • Agent 形态:每个节点一个或者每个Pod一个,用于采集日志或者其他数据

  • Aggregator 形态:用于中转、转发和处理,可独立部署成集群


可以应用在:


  • 数据采集:采集容器日志、节点日志,采集Prometheus metrics、Kubernetes Events 等

  • 数据中转:作为中转机去做数据的聚合、转发、分流

  • 数据处理:进行流式数据的切分、转换、处理

  • 日志报警:进行异常日志的检测与报警

  • ......


此外,利用 Loggie 的设计,用户也可以快速开发一个 Source、Sink 或Interceptor 组件,复用Loggie的能力,避免大量重复的开发工作。

下图是 Loggie 和其他日志采集工具的功能对比:


下面我们演示在一个 Kubernetes 集群中,通过创建 LogConfig CRD 快速采集 Pod 的日志。


首先部署 Loggie DaemonSet,可以选择使用 Helm Chart 进行安装。

helm pull https://github.com/loggie-io/installation/releases/download/v1.0.0/loggie-v1.0.0.tgz && tar xvzf loggie-v1.0.0.tgzhelm install loggie ./loggie -nloggie --create-namespace


也可以直接部署:

helm install loggie -n loggie --create-namespace https://github.com/loggie-io/installation/releases/download/v1.0.0/loggie-v1.0.0.tgz

接下来就可以采集日志了,Loggie 定义了 Kubernetes CRD LogConfig,一个 LogConfig 表示采集一类 Pods 的日志采集任务。比如现在我们有一个 nginx 应用需要被采集日志:

kubectl create deploy nginx --image=nginx


先要定义输出源 Sink,使用 Loggie 定义的 Sink CRD 来定义,表明日志发送的后端。为了方便演示,这里我们将日志发送至 Loggie Agent 自身的日志中并打印。

cat << EOF | kubectl apply -f -apiVersion: loggie.io/v1beta1kind: Sinkmetadata:  name: defaultspec:  sink: |    type: dev    printEvents: trueEOF


可以通过 kubectl get sink 查看到已创建的 Sink。接下来就需要定义采集任务了,使用 Loggie 定义的 LogConfig 这个 CRD,表示一个日志采集任务,我们创建一个 LogConfig 示例如下所示:

cat << EOF | kubectl apply -f -apiVersion: loggie.io/v1beta1kind: LogConfigmetadata:  name: nginx  namespace: defaultspec:  selector:    type: pod    labelSelector:      app: nginx  pipeline:    sources: |      - type: file        name: mylog        paths:        - stdout    sinkRef: defaultEOF


创建完之后,我们可以使用 kubectl get lgc 查看到创建的 CRD 实例。同时,我们还可以通过 kubectl describe lgc nginx 查看 LogConfig 的事件,以获取最新的状态。

Events:  Type    Reason       Age   From                       Message  ----    ------       ----  ----                       -------  Normal  syncSuccess  52s   loggie/kind-control-plane  Sync type pod [nginx-6799fc88d8-5cb67] success


上面的 nginx LogConfig 通过其中的 spec.selector 来匹配采集哪些 Pod 的日志,这里我们使用 app: nginx 选择了刚才创建的 nginx Pod。spec.pipeline 则表示 Loggie 的 Pipeline 配置,我们只采集容器标准输出的日志,所以在 paths 中填写 stdout 即可。


现在我们就可以来查看日志了,首先找到所在的nginx pod节点:

kubectl get po -owide -l app=nginx


然后我们找到该节点的 Loggie:

kubectl -nloggie get po -owide |grep ${node}


可以通过:

kubectl -nloggie logs -f ${logge-pod}

然后就可以查看 Loggie 打印出的日志,正常里面展示了采集到的 nginx 标准输出日志。


关于 Loggie 的更多使用可以查看官方文档了解更多 https://loggie-io.github.io/docs/


仓库地址:https://github.com/loggie-io/loggie


浏览 60
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报