以正确的顺序获取docker日志stream

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

更新:我没有看到它,但我看到一些关于stream利或elasticsearch支持毫秒+准确性默认情况下在一个新的版本

根据我的理解,你有两个select:

  • 提高时间戳精度(像你一样); 要么
  • 使用可以维护数据顺序的日志存储。 例如MongoDB 。 日志收集的概念在另一个stackoverflow文章中描述。

我在这个答案中find了一个解决方法,尽pipe我仍然喜欢真正的解决scheme

这里是我修改的td-agent.conf,用于fluentd-es-image 。 它添加了可以sorting的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>