我们有一个应用程序,它将三种类型的日志写入三个单独的文件中:访问日志,通用应用程序日志和系统日志。这些日志的格式(和用途)非常不同。我们有单独的日志转发器,可将它们分别发送到我们的集中式日志记录系统。
基于将日志视为事件流原则,我们正在考虑从使用文件转移到标准输出。虽然我们知道了这种方法的一些好处,但这也意味着我们将获得合并后的格式不同的日志流,在将它们发送到中央系统之前,我们需要再次拆分(Kibana / Splunk /等),或在里面。
我们想知道是否有任何工具或建议来应对这种情况。
我们有一个应用程序,它将三种类型的日志写入三个单独的文件中:访问日志,通用应用程序日志和系统日志。这些日志的格式(和用途)非常不同。我们有单独的日志转发器,可将它们分别发送到我们的集中式日志记录系统。
基于将日志视为事件流原则,我们正在考虑从使用文件转移到标准输出。虽然我们知道了这种方法的一些好处,但这也意味着我们将获得合并后的格式不同的日志流,在将它们发送到中央系统之前,我们需要再次拆分(Kibana / Splunk /等),或在里面。
我们想知道是否有任何工具或建议来应对这种情况。
Answers:
我仍在寻找一种合并/拆分方法,但是与此同时,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个字符。要覆盖此行为,请指定标签选项
将它们合并为一个流以便稍后进行拆分的想法听起来很痛苦。我自己没有理由这样做,但是这是我要开始的地方:
也必须在主机上进行一些设置,感觉有点不太优雅,但是如果您使用诸如ansible之类的东西可以在其中运行剧本并在部署到盒子的过程中进行设置,那也不太可能坏。