【问题标题】:How to output logs in a containerized application?如何在容器化应用程序中输出日志?
【发布时间】:2022-02-12 14:33:18
【问题描述】:

通常,在 docker/k8s 中,建议直接将日志输出到标准输出。
然后我们可以使用kubectl logsdocker logs 来查看日志。
喜欢:time=123 action=write msg=hello world,作为一个 tty,它可能是 colorized 为人类友好。

但是,如果我们想将日志导出到日志处理中心,例如 EFK (elasticsearch-fluentd-kibana),我们需要一个 json-format 日志文件。
喜欢:{"time"=123,"action"="write","msg"="hello world"}

我想要什么?

有没有可以同时兼顾human friendlinessjson format的日志方法?
我正在寻找一种方法,如果我使用docker logs,那么我可以得到human-readable logs,同时log collector仍然可以得到json-format中的日志

结论

感谢下面的回答。我有两种方法:

  1. 不同环境中的不同日志格式:
    1.1 在开发中使用文本格式:docker logs 将打印彩色和人类可读的日志。
    1.2 在生产中使用json-format:EFK可以很好地处理json-format。
  2. 日志采集器的格式转换 2.1 我们使用文本格式,但是在像fluentd这样的日志收集器中我们可以定义一些脚本来将文本格式的kv对转换为json格式的kv对。

【问题讨论】:

标签: go kubernetes containers fluentd


【解决方案1】:

Kubernetes 为其系统组件提供了这样的结构化日志记录选项。 Klog library 允许使用 --logging-format=json 标志,该标志可以将日志格式更改为 JSON 输出 - 有关它的更多信息 herehere

【讨论】:

  • 感谢您的帮助!但是我正在寻找一种方法,如果我使用docker logs,那么我可以获得人类可读的日志,同时日志收集器仍然可以获取json-format中的日志
  • 谢谢,也许我应该在开发中使用文本格式,在生产中使用 json 格式。添加标志--logging-format=json 很容易。
【解决方案2】:

是的,您可以使用 Flunetd 做到这一点,以下是完成此设置所需的基本操作项

  • 配置 docker 容器以记录到标准输出(你可以使用任何你喜欢的格式)
  • 配置 FluentD 以尾随 /var/lib/docker/containers/*/*-json.log 中的 docker 文件
  • 使用 Flunetd 解析日志并将格式更改为 JSON 日志
  • 将日志输出到 Elasticsearch。

这篇文章shows 究竟是如何进行这个设置的,这篇文章one 解释了如何解析键值日志

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-21
    • 2022-11-22
    • 1970-01-01
    相关资源
    最近更新 更多