返回zzhenglei的回答

zzhengleizzhenglei技术经理某保险

(1)由应用自己处理日志,而不需要容器引擎参与

比如一个使用Log4j2 日志组件的Java应用, 它通过日志组件将日志发往一个远端日志服务器。此时,不利用容器引擎的日志功能。

(2)使用数据卷(Data volume)

使用数据卷,容器内应用将日志写入数据卷中。此时,也不利用容器引擎的日志功能。

(3)使用 Docker 日志驱动(logging driver)

Docker 日志驱动会读取容器中主进程的 stdout(标准输出) 和 stderr(错误输出),然后将内容写入容器所在的宿主机上的文件中。

Docker 支持多种日志驱动。


几个比较常见的:

·       json-file: 这是默认驱动。容器主进程(PID 为1的进程)的 stdout 和 stderr 会被输出到宿主机上的 JSON 文件。该文件可以在 docker inspect 命令的"LogPath"输出中看到,比如 "LogPath": "/var/lib/docker/containers/a44b41506dc48a469fd69ddbdf84ad16d14f16191164361a69606c579c506a2c/a44b41506dc48a469fd69ddbdf84ad16d14f16191164361a69606c579c506a2c-json.log"。

·       syslog: 将日志信息发送到 syslog 服务器

·       journald: 将容器日志信息写入journald (journald 是 systemd 提供的一个日志服务)

·       gelf: 将日志消息写入一个 GELF 端点,比如 Logstash

·       fluentd: 将日志信息发送到 Fluentd 服务 

更多日志驱动,可以查看 https://docs.docker.com/config/containers/logging/configure/#supported-logging-drivers。 

Docker 还支持插件形式的更多日志驱动,具体请看 https://docs.docker.com/config/containers/logging/plugins/

(4)使用专门的日志容器

Docker 日志驱动这种实现方式有一些限制:

·       只支持日志转发,不会做日志解析和处理

·       只支持容器内应用发到 stdout 和 stderr 的日志,不支持其它日志,比如日志文件内的日志

对于这些不支持的场景,比如应用有将日志写到日志文件,此时可以利用在同一个Pod中的专门日志容器。它会以边车(sidecar)形式读取应用容器中的日志产生,然后做处理和转发,比如转发到 stdout 和 stderr。

另外,某些这种场景还有另外一种更简单的处理方式。以 Nginix 为例,它默认写入日志文件,然后通过下面的方式,将日志也输出到 stdout 和 stderr。这种方式有一些限制

保险 · 2020-02-10
浏览1447

回答者

zzhenglei
技术经理某保险
擅长领域: 云计算容器一体化运维

zzhenglei 最近回答过的问题

回答状态

  • 发布时间:2020-02-10
  • 关注会员:2 人
  • 回答浏览:1447
  • X社区推广