Docker日志驱动简介

1、简介

通常,我们可以使用docker logs来查看容器的日志信息,这是因为docker帮我们将容器内主进行打印到标准输出到信息记录了下来,以便于在需要时获取容器的运行信息。

Docker提供多种容器日志记录机制,这种日志机制称之为:logging drivers。docker默认的logging driver为json-file,将日志信息以json格式记录到文件中。除非在启动容器时单独指定,否则,所有的container都将使用默认的日志记录机制。

除了使用docker提供的logging driver,你还可以实现和使用logging driver plugins

2、配置默认的logging driver

Docker可以通过设置daemon.json文件中log-driver的值来设置默认的logging driver。daemon.json的存放路径为:/etc/docker/daemon.json。例如下面的配置,将默认的logging drive设置为syslog:

{
  "log-driver": "syslog"
}

如果对应logging driver具有配置项,可以通过log-opts进行配置:

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3",
    "labels": "production_status",
    "env": "os,customer"
  }
}

注意:log-opts中的配置项仅接受字符串类型的值,对应数字或者布尔类型必须使用双引号

如果你没有设置log-driver,默认值为json-file,因此,诸如docker inspect之类的命令的输出将是json格式。

查看docker当前默认的logging driver:

chenleis-MacBook-Pro:~ chenlei$ docker info --format '{{.LoggingDriver}}'
json-file

3、为容器指定logging driver

当启动一个容器时,可以使用–log-driver指定当前容器的logging driver,并且可以使用–log-opt选择为其指定配置项。即使容器使用默认的logging driver,依然可以使用–log-opt进行配置覆盖。

例如,下面的例子讲使用none作为logging driver,即不做任何日志记录:

chenleis-MacBook-Pro:~ chenlei$ docker run -it --log-driver none busybox sh

查看指定容器的logging driver:

chenleis-MacBook-Pro:~ chenlei$ docker inspect -f '{{.HostConfig.LogConfig.Type}}' ceab39dd4b57
none

4、日志内容传输模式

Docker提供两种模式讲日志从容器传输到log-driver:

  • blocking:默认传输模式,日志信息直接从容器传递给log-driver。
  • non-blocking:为每个容器分配一个缓冲队列,日志信息首先放入缓冲队列,log-driver消费队列中的日志。

non-blocking避免了因为日志压力导致的应用程序阻塞,当STDOUT或者STDERR阻塞时,应用程序可能会出现异常。

注意,当缓冲队列满时,为了保证新的日志消息继续加入队列,队列中最老的日志将会被删除。

可以通过–log-opt中的mode选项来决定使用blocking模式或者non-blocking模式。

当使用non-blocking模式时,可以使用max-buffer-size选项来设置缓冲队列的大小,默认大小为1MB。

下面的例子将容器的日志传输模式设置为non-blocking模式,且缓冲队列大小为4MB:

chenleis-MacBook-Pro:~ chenlei$ docker run -it --rm --log-opt mode=non-blocking --log-opt max-buffer-size=4m busybox sh

查看容器日志配置信息如下:

chenleis-MacBook-Pro:~ chenlei$ docker inspect -f '{{.HostConfig.LogConfig}}' c98987df1428
{json-file map[max-buffer-size:4m mode:non-blocking]}

5、目前docker支持的logging driver

DriverDescription
noneNo logs are available for the container and docker logs does not return any output.
json-fileThe logs are formatted as JSON. The default logging driver for Docker.
localWrites logs messages to local filesystem in binary files using Protobuf.
syslogWrites logging messages to the syslog facility. The syslog daemon must be running on the host machine.
journaldWrites log messages to journald. The journald daemon must be running on the host machine.
gelfWrites log messages to a Graylog Extended Log Format (GELF) endpoint such as Graylog or Logstash.
fluentdWrites log messages to fluentd (forward input). The fluentd daemon must be running on the host machine.
awslogsWrites log messages to Amazon CloudWatch Logs.
splunkWrites log messages to splunk using the HTTP Event Collector.
etwlogsWrites log messages as Event Tracing for Windows (ETW) events. Only available on Windows platforms.
gcplogsWrites log messages to Google Cloud Platform (GCP) Logging.
logentriesWrites log messages to Rapid7 Logentries.

6、注意事项

docker logs命令仅支持json-file和journald两种类型,其他driver无法使用该命令。

7、参考资料

https://docs.docker.com/config/containers/logging/configure/

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐