如何在Docker中拥有多个日志流


21

我们有一个应用程序,它将三种类型的日志写入三个单独的文件中:访问日志,通用应用程序日志和系统日志。这些日志的格式(和用途)非常不同。我们有单独的日志转发器,可将它们分别发送到我们的集中式日志记录系统。

基于将日志视为事件流原则,我们正在考虑从使用文件转移到标准输出。虽然我们知道了这种方法的一些好处,但这也意味着我们将获得合并后的格式不同的日志流,在将它们发送到中央系统之前,我们需要再次拆分(Kibana / Splunk /等),或在里面。

我们想知道是否有任何工具或建议来应对这种情况。


4
我认为这不值得。为什么仅出于某些“原则”而​​努力工作以合并然后拆分日志流?文件很好。文件工作。听起来工程过度。我会说也许将所有日志(带有不同标签等)通过管道传输到syslog中,但是我必须说,如果我的团队中有人建议这样做。
阿萨夫·拉维

因为使用文件还有其他一些管理方面的噩梦,特别是如果它们是从docker容器内部生成的。目前看来,从切换到标准输出的弊端超过了用例的好处,但是基于文件的方法已经遇到了麻烦
SztupY

3
我不知道“噩梦”。我知道这是他们已经完成一段时间的方式,并且有很多软件可以帮助您实现这一目标。日志文件被轮换,并带有检查点读取-文件对此非常抽象。由于害怕旧的,熟悉的模式,我不会接受给我带来新噩梦的原则。您的日志记录将被写入文件或在内存中处理(至少要在容器中移动它们)。祝您好运,并通过内存中的流分割器和合并实现了日志文件的可靠性。
阿萨夫·拉维

@AssafLavie您应该在一个可能被投票的答案中写它。恕我直言,这是一个完全正确的观点。
Dan Cornilescu

2
我来到这里是同样的问题。一个简单的事实是,Docker的内置日志记录功能取决于将要输出到stdout / stderr的所有内容,因此日志记录驱动程序和围绕它构建的第三方工具生态系统也是如此。我也很想将所有日志都转储到主机卷中,但是我知道当我的容器移动到k8s或openshift或gke或其他东西时,我将不得不继续回去并对其进行管理,而如果我遵循docker stdout方法将更加流畅。同时,我将继续寻找这个合法问题的答案
大黄

Answers:


13

我仍在寻找一种合并/拆分方法,但是与此同时,Kubernetes文档推荐的这种方法似乎是一个不错的解决方案:对每个单独的日志使用sidecar容器

“ sidecar”是您与另一个docker容器一起使用以某种方式使用的任何docker容器。在这种情况下,对于三个日志中的每个日志,您将有一个单独的容器来扫描或拖尾日志并将其输出到stdout。

这样,您的每个log-sidecar-containers都有来自其自己的stdout的自己的docker-log。像这样分开,您可以使用标准的docker(和kubernetes等)实践进行分离或聚合。这是Kubernetes页面必须说的:

这种方法允许您将几个日志流与应用程序的不同部分分开,其中某些日志流可能缺少对写入stdout或stderr的支持。重定向日志的逻辑很小,因此几乎没有什么大的开销。此外,由于stdout和stderr由kubelet处理,因此您可以使用诸如kubectl日志之类的内置工具。

“单独的日志流”源自docker应用于来自不同容器的日志的内置标记,如docker文档中所述

标签日志选项指定如何格式化用于标识容器的日志消息的标签。默认情况下,系统使用容器ID的前12个字符。要覆盖此行为,请指定标签选项


值得一提的是这种log-sidecar-containers方法的缺点,引用:“请注意,尽管CPU和内存使用率较低,但将日志写入文件然后将其流式传输到stdout可能会使磁盘使用率翻倍。” 我想知道是否有人在实践中尝试这种方法。
yusong

8

将它们合并为一个流以便稍后进行拆分的想法听起来很痛苦。我自己没有理由这样做,但是这是我要开始的地方:

  • 运行Docker容器时,请创建一个卷,以便可以轻松从主机查​​看/运送日志。
  • 使用remote_syslog2之类的东西将日志发送到日志收集器

也必须在主机上进行一些设置,感觉有点不太优雅,但是如果您使用诸如ansible之类的东西可以在其中运行剧本并在部署到盒子的过程中进行设置,那也不太可能坏。


该解决方案可以与命名管道结合使用,命名管道的唯一问题是它们现在不能在所有系统上正常工作。它们在Mac上
Jens
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.