Docker日志及配置

22 篇文章 0 订阅
11 篇文章 0 订阅

更多文章:WorkMap技术博客

查看容器日志

docker logs 命令显示运行容器的日志。

docker service logs 命令显示参与服务的所有容器的日志。

日志内容和格式取决于容器的内应用程序执行的命令。

默认情况下,docker logsdocker service logs 显示命令的输出,就像在终端交互式运行命令时一样。

UNIX 和 Linux 命令通常在运行时打开三个 I/O 流,称为 STDIN、STDOUT 和 STDERR。STDIN 是命令的输入流,可能包括来自键盘或另一个命令的输入。

STDOUT 通常是命令的正常输出,而 STDERR 通常用于输出错误消息。

默认情况下,docker logs 显示命令的 STDOUT 和 STDERR。

除此之外,也可以参考以下的日志方案:

  • 官方 nginx 镜像:

    官方 nginx 镜像创建了一个符号链接从 /var/log/nginx/access.log 到 /dev/stdout,并创建另一个符号链接从 /var/log/nginx/error.log 到 /dev/stderr,覆盖日志文件并导致日志被发送到相应的特殊设备。请参阅 Dockerfile

  • 官方 httpd 驱动程序:

    更改 httpd 应用程序的配置,直接将其正常输出写入 /proc/self/fd/1(即 STDOUT),将其错误写入 /proc/self/fd/2(即 STDERR)。请参阅 Dockerfile

管理容器日志

Docker 包含多个日志机制,从运行的容器和服务中获取日志信息。这些机制称为日志驱动程序。

默认情况下,Docker 使用 json-file 日志驱动程序,它在内部将容器日志缓存为 JSON。

提示:

  • 使用local日志驱动程序以防止磁盘耗尽

  • 默认的json-file 日志驱动,不执行日志轮换。因此,存储的日志文件可能会占用大量磁盘空间,导致磁盘空间耗尽。

  • Docker 保留了 json-file 日志驱动程序(没有日志轮换)作为默认设置,以保持与旧版本 Docker 的向后兼容性,并用于将 Docker 用作 Kubernetes 的运行时的情况。

  • 建议使用“local”日志驱动程序,它默认执行日志轮换,并使用更高效的文件格式。

修改默认日志驱动的参数

  • 修改daemon.json文件,如下所示:

    {
       “log-driver”:“json-file”,
       “log-opts”:{
           “max-size”:“10m”,
           “max-file”:“3”,
           “labels”:“production_status”,
           “env”:“os,customer”
          }
      }
    
  • 重新启动Docker以使更改对新创建的容器生效。

    注意:现有容器不会使用新的日志记录配置(需要重新创建容器才会生效)。

    daemon.json配置文件中的log-opts配置选项必须为字符串。

  • 查看日志驱动配置:

    docker info --format '.{{LoggingDriver}}'
    

配置容器的日志记录驱动程序

启动容器时,可以使用--log-driver标志将其配置为使用不同于Docker守护程序默认值的日志记录驱动程序。

如果日志记录驱动程序具有可配置选项,则可以使用一个或多个--log-opt <NAME>=<VALUE>标志设置。

即使容器使用默认的日志记录驱动程序,它也可以使用不同的可配置选项。

  • 使用none日志记录驱动程序启动Alpine容器。
    docker run -it --log-driver none alpine ash
    
  • 查看正在运行的容器的日志记录驱动程序
    docker inspect -f '.{{HostConfig.LogConfig.Type}}' <CONTAINER>
    

配置从容器到日志记录驱动程序的日志消息传递模式

Docker提供了两种从容器到日志记录驱动程序传递消息的模式:

  • 阻塞式:直接从容器到驱动程序的传递
  • 非阻塞式传递:将日志消息存储在每个容器的中间缓冲区中,以供驱动程序使用

非阻塞消息传递模式可防止应用由于日志反压而阻塞。当STDERR或STDOUT流阻塞时,应用很可能会以意外的方式失败。

警告:

当缓冲区已满时,新消息将不会排队。删除消息通常优于阻止应用程序的日志写入过程。

  • mode参数

    控制是否使用阻塞(默认)或非阻塞消息传递。

  • max-buffer-size参数

    控制在将模式设置为非阻塞时用于中间消息存储的缓冲区大小。默认为1兆字节。

使用示例

  • 非阻塞模式启动Alpine容器,并使用4兆字节缓冲区进行日志输出:
    docker run -it --log-opt mode = non-blocking --log-opt max-buffer-size = 4m alpine ping 127.0.0.1
    
  • 使用环境变量或标签与日志记录驱动程序
    docker run -dit --label production_status = testing -e os = ubuntu alpine sh
    

如果日志驱动程序支持,则会将附加字段添加到日志输出中,如下所示(json-file日志驱动)

“attrs”:{“production_status”:“testing”,“os”:“ubuntu”}

支持的日志驱动

  • none

    容器没有可用的日志,docker logs 命令也不返回任何输出。

  • local

    日志以设计为最小开销的自定义格式存储。

  • json-file

    日志格式为 JSON。Docker 的默认日志驱动程序。

  • syslog

    将日志消息写入 syslog 设施。主机必须运行 syslog 守护程序。

  • journald

    将日志消息写入 journald。主机必须运行 journald 守护程序。

  • gelf

    将日志消息写入 Graylog 扩展日志格式 (GELF) 端点,例如 Graylog 或 Logstash。

  • fluentd

    将日志消息写入 fluentd (forward input)。主机必须运行 fluentd 守护程序。

  • awslogs

    将日志消息写入 Amazon CloudWatch Logs。

  • splunk

    使用 HTTP 事件收集器将日志消息写入 splunk。

  • etwlogs

    将日志消息作为 Windows 平台的事件跟踪 (ETW) 事件写入。仅在 Windows 平台上可用。

  • gcplogs

    将日志消息写入 Google Cloud Platform (GCP) 日志记录。

  • logentries

    将日志消息写入 Rapid7 Logentries。

注意:

Docker Engine 19.03以及以前的版本,docker logs 命令仅适用于本地、json-file 和 journald 日志记录驱动程序。

Docker 20.10 及更高版本引入了“双重日志记录”,它使用本地缓冲区,可以对任何日志记录驱动程序使用 docker logs 命令。

日志记录驱动程序的限制

读取日志信息需要解压已轮换的日志文件,这会导致磁盘使用量暂时增加(直到读取轮换文件中的日志条目),并在解压时增加 CPU 使用率。
Docker 数据目录所在主机存储的容量决定了日志文件信息的最大大小。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值