ale*_*all 4 java logging docker
假设我在 Docker 中部署了一个 Java Web 应用程序,其中有几个组件在容器内生成日志:
STDOUT和STDERRserver.loggc.log应用程序日志被路由到Splunk,但是我们应该如何检索其他组件的日志呢?
看来至少有两个选择:
STDOUT. 这并不理想,因为这会混合日志并产生更难以分离的输出,因为不同的组件会产生不同格式的日志。server.log对主进程以外的每个进程使用 sidecar 容器,并让这些 sidecar 从 eg和检索日志gc.log,并将它们通过管道传输到STDOUT。更好,但这会对磁盘使用产生重大影响。有更好的解决方案吗?
太长了;不要混合日志流,使用 sidecar 是更好的解决方案,并且不会对磁盘使用产生“重大影响”。使用 sidecar 将日志重定向到标准输出,并依靠容器生态系统的能力来读取单个容器的日志。
注意:具有日志重定向逻辑的 Sidecar 没有显着的开销。我引用Kubernetes 文档来支持这一点 - “重定向日志背后的逻辑很少,所以这几乎不是一个重大的开销”
关键是不要混淆日志流,因为以后将单个流与混合日志流分离可能会很乏味,即使不是不可能(日志事件如跨越多行的异常堆栈跟踪)。例如,如果您混合了日志流,为了分析 GC,您需要单独分离出 GC 日志事件,然后再将其输入您选择的工具。
解决方案是使用side-car 模式,详细示例见此处
遵循单一职责原则。让每个 sidecar 尾随一个日志文件并将其流式传输到标准输出。为了实现这一点,所有 sidecar 都应该能够访问 webapp 容器的日志卷挂载(例如 /var/log),并且 webapp 应该将其所有日志写入共享卷挂载。
Web 应用程序会将自己的日志写入 stdout(例如通过LogBack 或 Log4j 的ConsoleAppender)以及共享卷挂载下的任何其他附加日志文件(例如 /var/log)。例如,对于 GC 日志,设置 JVM 参数,以便在共享卷挂载下生成日志-Xloggc:/var/log/mywebapp/gc.log。
对于每个附加日志文件,您将需要一个 sidecar 尾随(重定向)日志到标准输出。因此,在您的情况下,您需要三个 sidecar,一个用于 gc.log,一个用于 server.log,另一个用于 /var/log/syslog
下面给出了 Sidecar 容器定义示例摘录。
- name: count-log-1
image: busybox
args: [/bin/sh, -c, 'tail -n+1 -f /var/log/mywebapp/gc.log']
volumeMounts:
- name: varlog
mountPath: /var/log
Run Code Online (Sandbox Code Playgroud)
上面的示例显示了单个 sidecar 定义将日志文件从 /var/log 共享卷挂载重定向/拖尾到 stdout。此示例是从Kubernetes 文档复制的。
| 归档时间: |
|
| 查看次数: |
2273 次 |
| 最近记录: |