当前位置: 首页 > news >正文

Docker引擎不同的日志驱动配置以及通过Filebeat采集容器日志的两种解决方案

Docker引擎不同的日志驱动配置以及通过Filebeat采集容器日志的两种解决方案

1、使用Docker容器日志

我们可以使用 docker logs 命令查看 Docker 容器内部应用程序运行时所产生的日志。

docker logs -f -t [容器id]

使用 docker logs 命令可以免除首先进入 Docker 容器,再打开应用程序的日志文件的过程。docker logs 会监控容器中操作系统的
标准输出设备(STDOUT),一旦 STDOUT 有数据产生,就会将这些数据传输到另一个“设备”中,该 Docker 的驱动被称为“日志驱动”(Logging Driver)

2、配置日志驱动

2.1、日志驱动

Docker 提供多种日志驱动程序,可以帮助你从正在运行的容器和服务中获取信息。
每个 Docker 守护进程都有一个默认的日志驱动程序,如果你没有将其配置为使用其他日志驱动程序,则每一个容器都会使用这个默认配置(默认的日志驱动程序 json-file)。
支持的日志驱动程序如下:

驱动程序描述
none容器没有日志可用,docker logs 什么都不返回
json-file日志格式化为 JSON。这是 Docker 默认的日志驱动程序。
syslog将日志消息写入 syslog 工具。syslog 守护程序必须在主机上运行。
journald将日志消息写入 journald。journald 守护程序必须在主机上运行。
gelf将日志消息写入 Graylog Extended Log Format (GELF) 终端,例如 Graylog 或 Logstash。
fluentd将日志消息写入 fluentd(forward input)。fluentd 守护程序必须在主机上运行。
awslogs将日志消息写入 Amazon CloudWatch Logs。
splunk将日志消息写入splunk使用HTTP事件收集器。
etwlogs将日志消息写为 Windows 的 Event Tracing 事件。仅在Windows平台上可用。
gcplogs将日志消息写入 Google Cloud Platform (GCP) Logging。
logentries将日志消息写入 Rapid7 Logentries。

2.2、配置默认的日志驱动程序

要配置 Docker 守护进程默认使用指定的日志驱动程序,我们需要将 daemon.json 文件(Linux 中一般位于 /etc/docker/,Windows 中一般位于 C:\ProgramData\docker\config\)中的 log-driver 值设为日志驱动程序的名字即可。默认的日志驱动程序 json-file。下面例子将其设置为 syslog:

{"log-driver": "syslog"
}

2.3、日志驱动的可配置选项(log-opts)

如果日志驱动程序有可配置的选项,可以在 daemon.json 文件的关键字 log-opts 中以 JSON 格式设置。下面示例为 json-file 日志驱动程序设置了几个可配置选项:

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

参数说明

参数描述
max-size容器日志文件上限大小
max-file容器日志文件上限个数
labels容器日志标签
env容器日志环境变量

2.4、默认的日志驱动程序

如果你没有指定日志驱动程序,默认就是 json-file。如果你想查看当前Dokcer守护进程的默认日志驱动程序,可以运行 docker info 命令并在输出中查找 Logging Driver。下面命令可以在 Linux、macOS 或 Windows 上使用:

$ docker info | grep 'Logging Driver'Logging Driver: json-file

2.5、为某一个容器配置日志驱动程序

在启动容器时,可以通过 --log-driver 标签将其配置为使用与 Docker 守护进程不同的日志驱动程序。如果日志驱动程序有可配置的选项,可以通过一个或多个 --log-opt = 来设置。即使容器使用的是默认的日志驱动程序,也可以使用不同的配置选项。
下面的例子启动了一个使用 none 日志驱动程序的 nginx 容器。

docker run -d --name nginx01 -p 3345:80 --log-driver none nginx

2.6、日志驱动程序的限制

在使用 json-file 和 journald 之外的日志驱动程序时 docker logs 命令不可用。
下面的例子查看了一个使用 none 日志驱动程序的 nginx 容器的日志,容器id是f3499b2ded4e

$ docker logs f3499b2ded4eError response from daemon: configured logging driver does not support reading

2.6(拓展)、日志驱动程序的限制

在使用 json-file 之外的日志驱动程序时,不会在/var/lib/docker/contailers/[容器id]/目录下生成:容器id-json.log 这个文件

2.7、查看运行中的容器当前使用的日志驱动程序

要找出一个运行中的容器当前使用的日志驱动程序,可以使用 docker inspect 命令查看。
下面的例子查看了一个使用 none 日志驱动程序的 nginx 容器,容器id是f3499b2ded4e

docker inspect f3499b2ded4e

可以在容器的详细信息中找到如下信息,Type就是容器当前使用的日志驱动程序

        "HostConfig": {"Binds": null,"ContainerIDFile": "","LogConfig": {"Type": "none","Config": {}},

2.7(拓展)、查看运行中的容器当前使用的日志驱动程序

我们可以通过docker inspect的查找命令,精确的找到容器当前使用的日志驱动程序。
下面的例子查看了一个使用 none 日志驱动程序的 nginx 容器,容器id是f3499b2ded4e

$ docker inspect -f '{{.HostConfig.LogConfig.Type}}' f3499b2ded4enone

3、Filebeat采集容器日志的解决方案

解决方案一:容器数据卷同步日志到本地

3.1.1、容器数据卷

容器数据卷是容器之间的一个数据共享的技术。即可以把Docker容器中产生的数据,同步到本地。这种技术也可以称为目录的挂载。

3.1.2、使用数据卷

在启动容器时,可以通过 -v 标签将其配置为挂载容器内的某个地址到本地的某个地址上,我们可以把容器中应用产生的日志地址挂载到本地。
下面的例子启动了一个tomcat容器,把tomcat容器内的/usr/local/tomcat/logs挂载到本地的/home/tomcat/log下。

docker run -d -p 3355:8080 -v /home/tomcat/log:/usr/local/tomcat/logs --name tomcat01 tomcat

启动后,我们可以在本地的的/home/tomcat/log目录下看到tomcat的5个日志文件

$ ls /home/tomcat/log/catalina.2021-05-26.log  host-manager.2021-05-26.log  localhost.2021-05-26.log  localhost_access_log.2021-05-26.txt  manager.2021-05-26.log
3.1.3、查看日志
cat /home/tomcat/log/catalina.2021-05-26.log

解决方案二:获取json-file日志驱动的日志文件

3.2.1、json-file日志驱动的日志文件

Docker 提供多种日志驱动程序,其默认的日志驱动程序是 json-file。
在使用 json-file 的日志驱动程序时,会在/var/lib/docker/contailers/[容器id]/目录下生成:容器id-json.log 这个文件。

3.2.3、查看日志

下面的例子查看了一个tomcat容器的json-file日志文件,容器id为819c7f41b067

cd /var/lib/docker/containers/819c7f41b067a44cc268bdb752a22632a5c0af905e2b5bef288daf229f27cfe7/
cat 819c7f41b067a44cc268bdb752a22632a5c0af905e2b5bef288daf229f27cfe7-json.log
3.2.4、采集json-file日志驱动的日志文件的局限性

下面的例子对比了两种日志驱动文件
方案一中挂载出来的日志catalina.2021-05-26.log :

26-May-2021 06:40:40.459 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version name:   Apache Tomcat/9.0.46
26-May-2021 06:40:40.461 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server built:          May 8 2021 17:35:52 UTC
26-May-2021 06:40:40.461 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version number: 9.0.46.0
26-May-2021 06:40:40.461 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Name:               Linux
26-May-2021 06:40:40.461 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Version:            3.10.0-1062.el7.x86_64
26-May-2021 06:40:40.461 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Architecture:          amd64
26-May-2021 06:40:40.461 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Java Home:             /usr/local/openjdk-11
26-May-2021 06:40:40.462 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Version:           11.0.11+9
26-May-2021 06:40:40.462 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Vendor:            Oracle Corporation
26-May-2021 06:40:40.462 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_BASE:         /usr/local/tomcat
26-May-2021 06:40:40.462 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_HOME:         /usr/local/tomcat
26-May-2021 06:40:40.470 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.base/java.lang=ALL-UNNAMED
26-May-2021 06:40:40.470 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.base/java.io=ALL-UNNAMED

方案二中819c7f41b067a44cc268bdb752a22632a5c0af905e2b5bef288daf229f27cfe7-json.log :

{"log":"NOTE: Picked up JDK_JAVA_OPTIONS:  --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED\n","stream":"stderr","time":"2021-05-26T06:40:40.202770445Z"}
{"log":"26-May-2021 06:40:40.459 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version name:   Apache Tomcat/9.0.46\n","stream":"stderr","time":"2021-05-26T06:40:40.461584112Z"}
{"log":"26-May-2021 06:40:40.461 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server built:          May 8 2021 17:35:52 UTC\n","stream":"stderr","time":"2021-05-26T06:40:40.46164358Z"}
{"log":"26-May-2021 06:40:40.461 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version number: 9.0.46.0\n","stream":"stderr","time":"2021-05-26T06:40:40.461738479Z"}
{"log":"26-May-2021 06:40:40.461 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Name:               Linux\n","stream":"stderr","time":"2021-05-26T06:40:40.461829336Z"}
{"log":"26-May-2021 06:40:40.461 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Version:            3.10.0-1062.el7.x86_64\n","stream":"stderr","time":"2021-05-26T06:40:40.46189656Z"}
{"log":"26-May-2021 06:40:40.461 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Architecture:          amd64\n","stream":"stderr","time":"2021-05-26T06:40:40.46197324Z"}
{"log":"26-May-2021 06:40:40.461 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Java Home:             /usr/local/openjdk-11\n","stream":"stderr","time":"2021-05-26T06:40:40.462042184Z"}
{"log":"26-May-2021 06:40:40.462 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Version:           11.0.11+9\n","stream":"stderr","time":"2021-05-26T06:40:40.462138695Z"}
{"log":"26-May-2021 06:40:40.462 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Vendor:            Oracle Corporation\n","stream":"stderr","time":"2021-05-26T06:40:40.462233917Z"}
{"log":"26-May-2021 06:40:40.462 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_BASE:         /usr/local/tomcat\n","stream":"stderr","time":"2021-05-26T06:40:40.462266616Z"}
{"log":"26-May-2021 06:40:40.462 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_HOME:         /usr/local/tomcat\n","stream":"stderr","time":"2021-05-26T06:40:40.462343751Z"}
{"log":"26-May-2021 06:40:40.470 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.base/java.lang=ALL-UNNAMED\n","stream":"stderr","time":"2021-05-26T06:40:40.470945176Z"}
{"log":"26-May-2021 06:40:40.470 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.base/java.io=ALL-UNNAMED\n","stream":"stderr","time":"2021-05-26T06:40:40.470987618Z"}

可以看到通过方案二采集到的容器日志,是被json-file日志驱动做了一层json包装的日志文件。
所以如果我们使用方案二来采集容器日志,只能使用json_log的解析规则解析日志文件。

相关文章:

  • Vue + Element UI el-table + sortablejs 行、列拖拽排序
  • SQL世界之命令语句Ⅲ
  • C语言--------指针(1)
  • [技术杂谈]如何下载vscode历史版本
  • 使用Pillow来生成简单的红包封面
  • freertos 源码分析五 任务调度一
  • 时光峰峦文物璀璨,预防性保护筑安全
  • 鸿蒙4.0.0 安装minitouch
  • 优雅的从HuggingFace下载模型
  • 【算法与数据结构】583、72、LeetCode两个字符串的删除操作+编辑距离
  • Python HTTP隧道在远程通信中的应用:穿越网络的“魔法门”
  • VRRP协议详解
  • Rust开发WASM,浏览器运行WASM
  • CSS:三列布局
  • C++设计模式-简单工厂模式,工厂方法模式,抽象工厂模式
  • 《剑指offer》分解让复杂问题更简单
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • Android优雅地处理按钮重复点击
  • Apache的基本使用
  • CentOS 7 修改主机名
  • GraphQL学习过程应该是这样的
  • HTML-表单
  • Rancher-k8s加速安装文档
  • Redis的resp协议
  • Redux系列x:源码分析
  • socket.io+express实现聊天室的思考(三)
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • 少走弯路,给Java 1~5 年程序员的建议
  • 用Python写一份独特的元宵节祝福
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • # include “ “ 和 # include < >两者的区别
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • #if #elif #endif
  • #pragma multi_compile #pragma shader_feature
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (C语言)fgets与fputs函数详解
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (附源码)ssm跨平台教学系统 毕业设计 280843
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (三)elasticsearch 源码之启动流程分析
  • (幽默漫画)有个程序员老公,是怎样的体验?
  • (转)nsfocus-绿盟科技笔试题目
  • ./configure,make,make install的作用(转)
  • .360、.halo勒索病毒的最新威胁:如何恢复您的数据?
  • .equal()和==的区别 怎样判断字符串为空问题: Illegal invoke-super to void nio.file.AccessDeniedException
  • .net 生成二级域名
  • .NET 依赖注入和配置系统
  • .NetCore实践篇:分布式监控Zipkin持久化之殇
  • .NET单元测试
  • .w文件怎么转成html文件,使用pandoc进行Word与Markdown文件转化
  • //解决validator验证插件多个name相同只验证第一的问题
  • @Documented注解的作用