云原生架构与 GitOps 实战
王炜
前腾讯云 CODING 架构师
6217 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 44 讲
云原生架构与 GitOps 实战
15
15
1.0x
00:00/00:00
登录|注册

31|日志:如何搭建轻量云原生业务日志系统?

你好,我是王炜。
上一节课,我们学习了如何迅速判断业务可用性以及当故障出现时应该如何排查问题。其中,在可观测性的日志方面,我提到了使用 kubectl 来查看 Pod 日志的方法。不过,在生产环境下,我们面临的情况会更加复杂。
比如,对于同一个工作负载,它可能有几十上百个 Pod 实例,当我们需要定位具体某一个请求的日志时,它可能出现在任何一个 Pod 里。很显然,查看每一个 Pod 的日志是不切实际的。其次,即便我们能找到对应的 Pod,在查询日志时也很难进行条件搜索。最后,Kubernetes 并不能持久化存储 Pod 日志,这意味着一段时间后我们将无法查询到以前的日志信息。
此外,有时候我们还希望通过日志进一步了解系统的性能表现。例如:出现频率最高的错误是什么?错误日志的增长情况是怎么样的?
日志系统作为应用可观测性的三大支柱之一,能够为我们提供软件全生命周期的事件和错误记录。因此,建立中心化的日志存储和查询系统能够很好地帮助我们解决这些问题。
所以,这节课,我将带你学习如何构建可观测性的日志体系,并通过 Grafana Loki 来搭建轻量的日志系统。在使用方面,我还会简单介绍 Loki 查询日志的 LogQL 语法,带你从零上手 Loki。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文介绍了如何搭建轻量云原生业务日志系统,并使用Grafana Loki构建可观测性的日志体系。作者详细讲解了在生产环境下日志查询的复杂性和挑战,以及如何安装Loki组件并通过Helm一次性安装所有组件。读者可以学习如何访问Grafana界面,部署示例应用以产生日志,并使用Loki进行日志查询,包括通过表单构造查询语句和通过关键字搜索日志。文章还提供了常用LogQL例子,帮助读者更好地使用Loki。此外,文章简要介绍了Loki的工作原理,包括核心组件Promtail和Loki。整体而言,本文通过实际操作和示例,帮助读者快速了解了搭建轻量云原生业务日志系统的方法和Loki的使用技巧。文章还提供了生产建议,包括配置持久化、使用合适的部署方式以及使用云厂商托管服务存储日志。这些建议有助于读者在实际应用中更好地使用Loki。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《云原生架构与 GitOps 实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(13)

  • 最新
  • 精选
  • 争光 Alan
    针对elk,splunk,loki能谈一下优缺点吗?都适合什么场景

    作者回复: 小规模场景用 Loki,大规模场景下 ELK 查询的性能比较好,但索引文件占用的空间会比较大。Splunk 采集数据比较快,但查询比较慢。Loki 相对来说性能比较均衡。

    2023-03-14归属地:上海
    2
    2
  • Geek_28f561
    每天上T级别的日志,如果使用阿里云,Loki的存储用什么服务。开源的JuiceFS+阿里的OSS怎么样?

    作者回复: 是一个不错的方案,OSS 可以实现接近无限存储的方案,JuiceFS 提供文件系统。不过需要注意两个问题,一个是存储卷的挂载问题,第二个是读取和写入速度的问题。

    2023-02-21归属地:北京
    2
  • 邵涵
    文中收集的pod的日志是pod中进程打印到标准输出的,如果pod中部署的应用是打印日志到日志文件中,要如何收集日志?或者,在将应用部署到k8s中时,是建议都将日志打印到标准输出?

    作者回复: 一般建议把日志打印到标准输出中,如果是输出文件的话可能 EFK 技术栈更适合。

    2023-04-01归属地:北京
    1
  • 黑鹰
    配置持久化 和 日志持久化配置 这两个有什么区别呢? loki: persistence: enabled: true size: 500Gi 与 loki: config: schema_config: configs: - from: 2020-05-15 store: aws object_store: s3 schema: v11 index: prefix: loki_ storage_config: aws: s3: s3://access_key:secret_access_key@region/bucket_name dynamodb: dynamodb_url: dynamodb://access_key:secret_access_key@region

    作者回复: 一种是通过 K8s 的 PVC 来提供持久化存储,一种是使用外部 S3 来存储镜像。生产环境推荐用外部存储系统。

    2023-03-15归属地:北京
    2
    1
  • 又双叒叕是一年啊
    loki如果配置关键字告警,有对接的开源方案吗

    作者回复: Grafana alert 应该就可以满足

    2023-08-08归属地:北京
  • Geek_d312b7
    请问: {app="log-example"} |= `` 查询显示的日志都是带反斜线(转义符号)是怎么回事?比如类似下面这样, { "log": "{\"duration\":2935,\"level\":\"info\",\"method\":\"GET\",\"msg\":\"request completed\",\"size\":4,\"status\":200,\"time\":\"2023-06-24T01:27:05Z\",\"uri\":\"/ping\"}\n", "stream": "stderr", "time": "2023-06-24T01:27:05.513473746Z" } 另外,code模式使用下面的查询语句,一条日志也都没有查询出来。 {app="log-example"} | logfmt | status = `200` {app="log-example"} | log | status = `200` 是什么原因?是不是跟上面 {app="log-example"} |= `` 查出来显示都带有转义符号有关?

    作者回复: 因为实际应用输出了两种格式的日志,查询 json 的日志可以用 {app="log-example"} | json | status = `200` 查询 logfmt 格式的日志可以用 {app="log-example"} | logfmt | status = `200`

    2023-06-24归属地:广东
  • 黑鹰
    思考题1: sum by(status) ( rate({app="log-example"} |= `status=` | logfmt | status != 200 [1h]) ) 思考题2: topk(3, sum( rate({ app != "" } [10m]) ) by(app) )

    作者回复: 👍🏻

    2023-03-18归属地:北京
  • 黑鹰
    {app="log-example"} | logfmt | status = `200` code模式使用上面的查询语句,一条日志也没有查询出来。 用 {app="log-example"} |= `status=` 这条语句,可以查询到很多 status=200的日志。 请问下是我哪里操作不对吗?

    作者回复: 用 {app="log-example"} |= `status=` 这条语句能查到 logfmt 格式输出的日志吗?示例应用输出了 logfmt 和 json 两种格式的日志,也可以尝试用 {app="log-example"} | json | status = `200` 语句来查询。

    2023-03-06归属地:北京
    2
  • 旋风
    log-example镜像只支持arm?

    作者回复: 感谢指正,已经同时上传了 amd64 版本了。

    2023-02-18归属地:北京
  • 林龍
    想问一下,项目中已经有了链路的功能,还需要日志吗? 链路记录了请求值,响应值,只能执行的sql,es、redis的语句等。

    作者回复: 链路追踪主要用来查看服务的请求链路情况,日志主要用来排查服务输出的错误日志。

    2023-02-18归属地:广东
    2
收起评论
显示
设置
留言
13
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部