Tomcat/TomEE 在 Google KubernetesEngine 上创建了大量 DEBUG 日志,但在普通 Docker 上却没有

Tomcat/TomEE 在 Google KubernetesEngine 上创建了大量 DEBUG 日志,但在普通 Docker 上却没有

我们在 TomEE 7.0.3(Tomcat 8.5.11)的 Docker 镜像中部署了我们的应用程序。生产平台在 Google Kubernetes Engine 集群上运行,而开发、登台等则作为普通的 Docker 容器在 Linux 服务器上运行。

在生产环境中,我们发现 TomEE 每月向 Stackdriver 记录数百 GB 的 DEBUG 日志。我们无法在任何其他系统上重现此情况。生产环境中的容器和其他容器的配置完全相同,但 Java Keystore 和数据库连接除外。当然,所有 logsing.properties 和 logback.xml 文件都是相同的。

似乎 DEBUG 日志仅来自某些组件。例如,我们可以识别 org.apache.cxf 和 net.sf.ehcache。我们尝试对 JULI 和 slf4j 配置文件进行多种不同的调整,以降低生产中这些组件的日志级别,或增加其他系统上的日志级别以在本地重现问题。但奇怪的是,对任何 logsing.properties 或 logback.xml 文件的修改似乎都没有任何效果。

我不是 100% 确定,但在我看来,这些日志是在 stdout 上,因为在 Stackdriver 中它们的级别为“INFO”;根据文档

TomEE 在容器中的启动是通过包装器 BASH 脚本进行的,该脚本最后调用bin/catalina.sh run。但是,我们也尝试过省略包装器脚本,并使用 从 Dockerfile 启动 TomEE CMD ["catalina.sh", "run"]。这没有什么区别。

这些日志的示例:

14:56:17.316 [https-jsse-nio-8443-exec-4] DEBUG o.a.cxf.phase.PhaseInterceptorChain - Invoking handleMessage on interceptor org.apache.cxf.jaxrs.interceptor.JAXRSOutInterceptor@21657494
14:56:17.316 [https-jsse-nio-8443-exec-4] DEBUG o.a.c.j.i.JAXRSOutInterceptor - Response content type is: application/json
14:56:17.316 [https-jsse-nio-8443-exec-4] DEBUG o.a.cxf.ws.addressing.ContextUtils - retrieving MAPs from context property javax.xml.ws.addressing.context.inbound
14:56:17.317 [https-jsse-nio-8443-exec-4] DEBUG o.a.cxf.ws.addressing.ContextUtils - WS-Addressing - failed to retrieve Message Addressing Properties from context
14:56:17.317 [https-jsse-nio-8443-exec-4] DEBUG o.a.cxf.phase.PhaseInterceptorChain - Invoking handleMessage on interceptor org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor@5ff7053d
14:56:17.317 [https-jsse-nio-8443-exec-4] DEBUG o.a.c.t.http.AbstractHTTPDestination - Finished servicing http request on thread: Thread[https-jsse-nio-8443-exec-4,5,main]

15:07:14.805 [https-jsse-nio-8443-exec-4] DEBUG o.a.c.i.OutgoingChainInterceptor - Interceptors contributed by bus: []
15:07:14.805 [https-jsse-nio-8443-exec-4] DEBUG o.a.c.i.OutgoingChainInterceptor - Interceptors contributed by service: []
15:07:14.805 [https-jsse-nio-8443-exec-4] DEBUG o.a.c.i.OutgoingChainInterceptor - Interceptors contributed by endpoint: [org.apache.cxf.interceptor.MessageSenderInterceptor
@461a6713]
15:07:14.805 [https-jsse-nio-8443-exec-4] DEBUG o.a.c.i.OutgoingChainInterceptor - Interceptors contributed by binding: [org.apache.cxf.jaxrs.interceptor.JAXRSOutInterceptor
@21657494]
15:07:14.805 [https-jsse-nio-8443-exec-4] DEBUG o.a.cxf.phase.PhaseInterceptorChain - Chain org.apache.cxf.phase.PhaseInterceptorChain@7780f3e8 was created. Current flow:
  prepare-send [MessageSenderInterceptor]
  marshal [JAXRSOutInterceptor]

TomEE 启动后出现的第一个实例似乎是这些行,我可以在生产中看到,但在任何其他容器上都看不到:

12:28:33.575 [main] DEBUG o.apache.cxf.common.logging.LogUtils - Using org.apache.cxf.common.logging.Slf4jLogger for logging.
12:28:33.681 [main] INFO  o.a.c.m.j.InstrumentationManagerImpl - registering MBean org.apache.cxf:bus.id=openejb.cxf.bus,type=Bus,instance.id=996125997: org.apache.cxf.bus.ManagedBus@5e17553a
12:28:33.696 [main] INFO  o.a.c.m.j.InstrumentationManagerImpl - registering MBean org.apache.cxf:bus.id=openejb.cxf.bus,type=Bus,instance.id=996125997: javax.management.modelmbean.RequiredModelMBean@189cbd7c
12:28:33.696 [main] INFO  o.a.c.m.j.InstrumentationManagerImpl - registered org.apache.cxf:bus.id=openejb.cxf.bus,type=Bus,instance.id=996125997

我很高兴得到任何提示

  • 为什么 TomEE 在 Google Kubernetes Engine 上生成 DEBUG 日志,而这些日志在任何纯 Docker 系统上都是不可见的,
  • 为什么我们似乎无法使用任何logging.properties和logback.xml文件来调整这些组件的日志记录。

答案1

Stackdriver Logging 使用 Fluentd 作为其日志代理。在 GKE 中,Fluentd 由主节点控制。通常,您必须配置 Fluentd 以自定义 Stackdriver 中记录的内容;但是,由于 Fluentd 由主节点配置,因此对其所做的任何更改都将恢复为其原始配置。它还配置为“全部捕获”,将记录每个操作。

如果你想调整 Stackdriver 中记录的内容,那么我建议使用日志排除

编辑:我还可以推荐另外两个选项。第一个是禁用日志记录完全恢复。您仍然可以查看集群内的 Kubernetes 日志,例如 pod 和容器日志;但是,您必须使用 kubectl。您将无法再看到 Stackdriver Logging 中的日志。

另一个选择是创建自己的从头开始定制 kubernetes 集群在 GCE 中。尽管设置起来会更加繁重,但您将可以控制主节点,并能够根据自己的喜好配置日志记录。

相关内容