【问题标题】:get docker log stream in correct order以正确的顺序获取 docker 日志流
【发布时间】:2015-08-07 16:21:53
【问题描述】:

我现在已经尝试了几个日志收集服务,例如 logspout/papertrail 和 fluentd/elasticsearch,但结果并不总是以正确的顺序显示,这可能会使调试变得困难。一个例子是 Node.js 应用程序,console.log 命令导致多行,或者堆栈跟踪出错。这些行都以相同的时间戳显示,我猜日志收集服务无法知道显示这些的顺序。有没有办法增加毫秒精度?或者以其他方式确保它们以与我执行docker logs 命令相同的顺序显示?

更新:我还没有研究过,但我看到了一些关于 fluent 或 elasticsearch 在较新版本中默认支持毫秒+精度

【问题讨论】:

    标签: elasticsearch docker fluentd


    【解决方案1】:

    据我了解,您有两种选择:

    • 提高时间戳精度(就像你做的那样);或
    • 使用可以维护数据顺序的日志存储。例如MongoDB。日志收集概念在another stackoverflow 帖子中进行了描述。

    【讨论】:

    • 这会涉及在某处手动检查日志文件吗?你有一个如何工作的例子吗?
    • 我认为的日志存储方法在另一个stackoverflow question 中有很好的描述。当您的容器化应用程序增长时,docker 日志收集的真正问题就出现了。在大规模部署中,您可能有负载均衡器和多个容器(具有扩展性的微服务架构)。因此,您需要将日志数据聚合到“服务”日志流中才有意义。此类日志收集示例:kontena
    【解决方案2】:

    我在this answer 中找到了 fluentd 的解决方法,但我仍然想要一个真正的解决方案

    这是我修改后的 td-agent.conf,用于fluentd-es-image。它添加了time_nano字段,可以对其进行排序

    <source>
      type tail
      format json
      time_key time
      path /varlog/containers/*.log
      pos_file /varlog/es-containers.log.pos
      time_format %Y-%m-%dT%H:%M:%S.%L%Z
      tag cleanup.reform.*
      read_from_head true
    </source>
    
    <match cleanup.**>
       type record_reformer
       time_nano ${t = Time.now; ((t.to_i * 1000000000) + t.nsec).to_s}
       tag ${tag_suffix[1]}
    </match>
    
    
    <match reform.**>
      type record_reformer
      enable_ruby true
      tag kubernetes.${tag_suffix[3].split('-')[0..-2].join('-')}
    </match>
    
    <match kubernetes.**>
       type elasticsearch
       log_level info
       include_tag_key true
       host elasticsearch-logging.default
       port 9200
       logstash_format true
       flush_interval 5s
       # Never wait longer than 5 minutes between retries.
       max_retry_wait 300
       # Disable the limit on the number of retries (retry forever).
       disable_retry_limit
    </match>
    
    <source>
      type tail
      format none
      path /varlog/kubelet.log
      pos_file /varlog/es-kubelet.log.pos
      tag kubelet
    </source>
    
    <match kubelet>
       type elasticsearch
       log_level info
       include_tag_key true
       host elasticsearch-logging.default
       port 9200
       logstash_format true
       flush_interval 5s
       # Never wait longer than 5 minutes between retries.
       max_retry_wait 300
       # Disable the limit on the number of retries (retry forever).
       disable_retry_limit
    </match>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-17
      • 2010-09-25
      • 1970-01-01
      • 2017-07-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多