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的解析规则解析日志文件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/674714.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python 视频转场特效处理笔记

本文参考Python-OpenCV 实现美图秀秀视频剪辑效果【特效】_opencv 多张图片 视频 特效-CSDN博客 最近研究了点python处理视频相关的东西,本文展示特效包括,竖向开幕/横向开幕,渐隐/渐显,推近/拉远,方形开幕&#xff0…

Excel——有效性、二级菜单联动

一、录入规范数据 1.手动输入序列录入有效性信息 选择需要录入有效性的所有单元格 选择【数据】——【有效性】——【有效性】 在【允许】输入的值之间选择【序列】 在【序列】输入框中输入想要选择的值,中间用逗号(必须是英文逗号)隔开 。…

Spring Authorization Server Spring Security密码加密

文章目录 一、修改密码编码器二、效果三、注意点1. RegisteredClient2. UserDetailsService 一、修改密码编码器 以BCryptPasswordEncoder举例。 直接将其注册成PasswordEncoder 的Bean即可。 Beanpublic PasswordEncoder passwordEncoder() {// 密码为明文方式 // ret…

【Qt学习笔记】Qt Creator环境下 信号与槽 详解(自定义信号槽、断连、lambda表达式等)

文章目录 1. 信号槽概念1.1 信号的本质1.2 槽的本质1.3 标准信号槽1.4 信号槽 实例 2. 自定义信号槽2.1 自定义槽函数2.2 自定义信号2.3 带参 信号槽 3. 信号槽的意义 与 作用4. 信号槽断连 (了解)5. lamda表达式的使用5.1 基本用法5.2 捕获局部变量5.3 …

JavaScript相关(一)——作用域

本篇将从JS的执行上下文开始,去理解:变量提升、 栈式调用、作用域和闭包。 参考: 浏览器工作原理与实践 JS执行上下文 执行上下文是 JavaScript 执行一段代码时的运行环境,比如调用一个函数,就会生成这个函数的执行…

『运维备忘录』之 Ansible 自动化运维工具

一、简介 Ansible是基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能的自动化运维工具,广泛用于配置管理、应用部署以及任务协…

ES节点故障的容错方案

ES节点故障的容错方案 1. es启动加载逻辑1.1 segment和translg组成和分析1.2 es节点启动流程1.3 es集群的初始化和启动过程 2. master高可用2.1 选主逻辑2.1.1 过滤选主的节点列表2.1.2 Bully算法2.1.2 类Raft协议2.1.3 元数据合并 2.2 HA切换 3. 分片高可用3.1 集群分片汇报3.…

不同进制之间的转换

目录 前言进制转换10进制转2进制方法1方法2 2进制转10进制10进制转n进制n进制转10进制2进制与8进制和16进制之间的快速转换 代码实现10进制转n进制CPython n进制转10进制CPython 结尾 本文由Jzwalliser原创,发布在CSDN平台上,遵循CC 4.0 BY-SA协议。 因此…

DoWhy:Python 中的因果推断库

DoWhy:Python 中的因果推断库 DoWhy 是一个强大的 Python 库,用于因果推断和因果推断分析。本文将介绍 DoWhy 的基本概念、主要功能和使用方法,帮助读者了解如何利用该库进行因果推断,并解决因果关系的相关问题。 什么是DoWhy&…

MySQL-管理

一、系统数据库 MySQL数据库安装完成后,自带了一下四个数据库,具体作用如下: 数据库含义mysql存储MySQL服务器正常运行所需要的各种信息(时区、主从、用户、权限等)information_schema提供了访问数据库元数据的各种表…

containerd中文翻译系列(十三)流处理器

处理器 API 处理器是一种二进制 API,可通过内容流工作。 传入的内容流将通过 STDIN 理程序,而流处理程序将在 STDOUT "上输出处理后的数据流。 如果遇到错误,必须通过 STDERR 返回错误信息,同时返回非零退出状态。 可以通…

备战蓝桥杯---动态规划(理论基础)

目录 动态规划的概念: 解决多阶段决策过程最优化的一种方法 阶段: 状态: 决策: 策略: 状态转移方程: 适用的基本条件 1.具有相同的子问题 2.满足最优子结构 3.满足无后效性 动态规划的实现方式…

2024年【R2移动式压力容器充装】考试内容及R2移动式压力容器充装免费试题

题库来源:安全生产模拟考试一点通公众号小程序 R2移动式压力容器充装考试内容参考答案及R2移动式压力容器充装考试试题解析是安全生产模拟考试一点通题库老师及R2移动式压力容器充装操作证已考过的学员汇总,相对有效帮助R2移动式压力容器充装免费试题学…

【Java八股面试系列】JVM-内存区域

目录 Java内存区域 运行时数据区域 线程独享区域 程序计数器 Java 虚拟机栈 StackFlowError&OOM 本地方法栈 线程共享区域 堆 GCR-分代回收算法 字符串常量池 方法区 运行时常量池 HotSpot 虚拟机对象探秘 对象的创建 对象的内存布局 句柄 Java内存区域 运…

网络套件字(理论知识)

一、源IP地址和目的IP地址 上次说到IP地址是为了是为了让信息正确的从原主机传送到目的主机,而原IP地址和目的IP地址就是用于标识两个主机的,既然叫做地址必然有着路径规划的作用,而路径规划最重要的就是,从哪来到哪去&#xff0…

【C++】友元:友元函数与友元类

一、友元 友元&#xff08;friend&#xff09;是C中的一种特殊关系&#xff0c;用于在类之间共享访问权限。通过将一个函数或类声明为另一个类的友元&#xff0c;我们可以允许友元访问声明类的非公有成员。 二、友元函数 问题&#xff1a;现在尝试去重载operator<<&am…

机器人学、机器视觉与控制 上机笔记(第一版译文版 2.1章节)

机器人学、机器视觉与控制 上机笔记&#xff08;第一版译文版 2.1章节&#xff09; 1、前言2、本篇内容3、代码记录3.1、新建se23.2、生成坐标系3.3、将T1表示的变换绘制3.4、完整绘制代码3.5、获取点*在坐标系1下的表示3.6、相对坐标获取完整代码 4、结语 1、前言 工作需要&a…

简单说网络:TCP+UDP

TCP和UPD: (1)都工作在传输层 (2)目的都是在程序之中传输数据 (3)数据可以是文本、视频或者图片(对TCP和UDP来说都是一堆二进制数没有太大区别) 一、区别:一个基于连接一个基于非连接 将人与人之间的通信比喻为进程和进程之前的通信:基本上有两种方式(1)写信;(2)打电话;这…

Docker容器化K8s集群部署教程(一键部署sheel脚本)

本文通过脚本&#xff0c;可以快速地部署和配置Kubernetes环境&#xff0c;省去了各插件手动部署、配置的繁琐过程。 先看最终结果&#xff1a; [rootlocalhost home]# kubectl get node NAME STATUS ROLES AGE VERSION k8smaster Ready control-p…

LlamaIndex 入门实战

文章目录 LlamaIndex 入门实战1. 基本概念2. 优劣势分析3. 简单代码示例4. Index持久化5. 使用场景6. 总结 LlamaIndex 入门实战 LlamaIndex是一个连接大型语言模型&#xff08;LLMs&#xff09;与外部数据的工具&#xff0c;它通过构建索引和提供查询接口&#xff0c;使得大模…