按正确顺序获取docker日志流

0ve6wy6x  于 2021-06-14  发布在  ElasticSearch
关注(0)|答案(2)|浏览(592)

我现在尝试了一些日志收集服务,比如logspout/papertrail和fluentd/elasticsearch,但是结果并不总是以正确的顺序显示,这会使调试变得困难。一个例子是node.js应用程序 console.log 导致多行或堆栈跟踪出错的命令。所有行都显示了相同的时间戳,我猜日志收集服务无法知道显示这些行的顺序。有没有办法提高毫秒精度?或者其他方法来确保它们以相同的顺序显示,就像我做了一个 docker logs 命令?
更新:我还没有研究过它,但是我在更新的版本中看到了一些关于fluent或elasticsearch的东西,默认支持毫秒+精度

kxkpmulp

kxkpmulp1#

据我所知,你有两个选择:
提高时间戳精度(就像你做的那样);或
使用日志存储,可以维护数据的顺序。例如mongodb。日志收集的概念在另一篇stackoverflow文章中描述。

x759pob2

x759pob22#

我在这个答案中找到了一个fluentd的解决方案,尽管我仍然想要一个真正的解决方案
这是我修改的td-agent.conf,用于fluentd es图像。它增加了 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>

相关问题