直接记录到标准输出

时间:2018-02-05 17:30:04

标签: docker logging kubernetes

在我工作的地方,我们正在迁移我们的整个基础架构,这些基础架构直到现在基于直接在Windows / Linux VM上运行的单片服务,再到基于Docker的架构,将由Kubernetes协调。

我想到的一件事是我们如何处理这个新基础架构中的日志。 到目前为止,每个应用程序都有自己的处理日志的方式,有些使用log4net / log4j写入文件系统,有些是通过专用库写入GrayLog。

我遇到的主要问题是在Docker环境中编写微服务的核心思想之一是每个服务应该尽可能少地假设其他服务或平台。

所以基本上我正在研究如何从应用程序中抽象出日志记录过程,使其独立于其他基础架构。

我发现一件有趣的事情是您可以将日志写入标准输出(stdout),然后配置Kubernetes来提取这些日志并将它们引导到集中式存储或集中式日志记录服务器(如GrayLog){{3} }

我对这种方法有几个担忧,一次,我没有看到太多公司这样做,大多数流行的日志记录解决方案是使用专用库来登录文件系统。

我也担心它会如何影响性能,如果你写入stdout,某些语言会阻塞,而当你使用标准的日志记录库时,日志会排队。 那么输出大量用户相关日志的服务呢?

我对你的想法很感兴趣,我没有看到这种方法被广泛使用,也许有理由这样做。

1 个答案:

答案 0 :(得分:1)

记录到任何流(File,stdout,GrayLog ...)可以是同步(阻塞)或异步(非阻塞)。本质上,这与您登录的媒体无关。确实,在Java中使用System.out.println会导致严重的线程争用。

所有主要的日志记录框架(如log4j)为您提供了log in an asynchronous fashion到您喜欢的每种媒体的方法。

你认为没有多少公司这样做我认为是错误的。记录到stdout并配置底层架构以在某处转发日志是所有PaaS /容器化应用程序的事实标准。

所以我的建议是:使用良好的日志框架登录到stdout,确保流的异步使用。对于其他人来说,你可能会没事的。