Docker 和 Portainer 新
连接 容器日志 到 Excel、Sheets 和 AI
Docker 会为每个容器写入日志——您可以一次性查询所有日志。json 文件记录了守护进程的写入操作。 Docker 日志 导出您手动保存的文件,以及 Portainer 自身的服务器日志。将查询流指向该文件夹,每一行都会变成一行——其中包含容器的真实名称、镜像和 Compose 服务,而不是一个充满 64 个字符 ID 的目录。
一个容器日志文件夹合并成一个表格。
查询流读取守护进程已写入的文件,固定格式,并提供带有容器名称的类型化列,每行数据都显示在旁边。无需边车、传输管道或维护索引——解析器无法读取的行会被保留为一行,并附带原因,而不是被默默丢弃。
a3f9c1…-json.logDocker
shopfront-stack_api.log出口
portainer.log波特纳轮换、压缩存档和重读文件——已处理
选择 app、compose_service、
数数(*) AS 线条
从 文件集.事件
地点 流 = 'stderr'
GROUP BY app,compose_service
ORDER BY 线条 DESC在同一查询中将其连接到您的应用程序数据库
守护进程已经写入的文件,现在生成一个可以生成报告的表格
两种工具,三种格式,无需边车
每张卡片都标明了查询流读取的确切文件及其所在位置。您无需更改日志驱动程序即可实现此功能。 json文件 是 Docker 的默认值,默认值是受支持的值。
支持的容器日志
3 种格式 · 2 种工具
Dockerjson文件日志记录驱动程序
- 一
{"日志","流","时间"}每行一个信封,由守护进程写入 - 容器名称来自 Docker 自己的
config.v2.json原木旁边 - 图片和合成项目/服务随行列
- 通常
/var/lib/docker/containers - 追加;编号旋转和
.gz随后
DockerDocker 日志导出
- 您保存的文件
docker logs --timestamps - 一个 RFC 3339 纳秒时间戳,然后是容器自身的行
- 容器横幅行是通过声明而非偶然方式跳过的。
- 你存放导出文件的任何文件夹
- 每个服务一个文件;文件名来自文件词干。
波特纳服务器日志,zerolog 控制台
portainer.log或容器自身的输出- 解析前会去除 ANSI 颜色代码,因此每个级别就是一个级别。
- 这
键=值尾部变成列;其余部分落入数据 - 嵌入式隧道服务器不同形状的线路也会被读取。
- 以分钟为单位的时间戳,读作UTC时间
每次发布代理程序时都会添加新的容器日志格式。由于代理程序会自行更新,因此即使没有服务器访问,后续添加的格式也会出现在您的连接器中。
Docker 日志 从 Swarm 主机导出日志,以及 Portainer CE 2.39.1 的服务器日志。需要注意的是:在 Windows 和 Mac 版 Docker Desktop 中,json 文件日志位于其虚拟机内部,作为服务运行的 Agent 无法访问这些日志。请使用以下命令导出日志。 docker logs --timestamps 并使用第二个配置文件。
每个区域中的容器,日志读取 他们坐在那里
容器很少全部运行在同一位置。可能是办公室里的一台主机,某个云区域的 Swarm 集群,或者另一个国家的单台服务器。每个位置都运行着一个网络代理,它会读取现有日志文件,并向查询流发送请求。对于防火墙而言,这只是一个普通的出站连接——无需开放任何端口,也无需建立 VPN。
Docker 日志 每项服务的出口
拨号退出
三个出站连接,只需一个查询点——无需入站端口、无需 VPN、无需更改防火墙。
每个地点一名代理人
代理程序覆盖整个站点,而非单个文件夹:您需要的每种日志格式都会在该代理程序上建立各自的文件集连接器。通常情况下,每个位置运行一个代理程序。免费套餐运行一个代理程序,更高级别的套餐运行多个代理程序。
1 个站点 = 1 个代理 = 多个连接器
无需打开
代理程序会建立一个加密的出站连接,所有出站请求和返回数据都通过该连接传输。无需更改入站端口、VPN 或防火墙设置——凭据始终保留在您的网络内部。
一个连接,双向
跨站点的一次查询
每个来源 联合查询 它拥有自己的代理,因此一条语句可以读取一个国家/地区的日志和另一个国家/地区的日志,并返回一个结果——或者将其中任何一个结果连接到数据库。包含在 Business 和 Enterprise 版本中。
2 个国家 → 1 个结果集
他们不断更新自己。
代理程序会自动更新,因此后续版本中添加的容器日志格式无需任何人登录服务器进行安装即可到达所有站点。正因如此,上面的内容只是一个起点,而不是一个固定的列表。
代理人带来了新的格式。
名称、时钟和颜色代码
容器日志并非带有日期信息的文本文件。如果试图将其视为数据,通常会出现三种错误,而本文将通过明确声明而非猜测来处理这些错误。
名称,而非十六进制 ID
Docker 会以容器 ID 命名每个日志文件夹,这使得分组查询难以阅读。Query Streams 会读取 Docker 在日志旁边写入的记录,并采用实际的文件夹名称,同时将 ID 作为单独的一列保留下来。
a3f9c1…-json.log → app = shopfront-api
恶魔的时钟
如果一个容器打印出以 Unix 纪元秒为单位的自身时间戳,那么它实际的时间戳应该是 1970 年(如果你相信的话)。事件时间是守护进程的捕获时间;容器自身的时间戳会被保存为一个单独的列,而不是被信任的时间戳。
信封时间 → 事件时间
文件内的颜色代码
控制台日志记录器会将终端转义序列直接写入日志。这些转义序列在解析之前会被移除,因此日志级别会以级别本身的形式读取,而不是以转义字符包裹的级别形式读取——原始字节保持不变。
转义码已移除 → 级别 = INF
没有任何事会被重复计算。
每个文件都通过其前 4 KB 的数据进行指纹识别,因此即使文件位置发生旋转,系统也会将其识别为同一个文件,而不是从头重新读取。当写入器重放其尾部数据时,滚动重复窗口会捕获重叠部分。
4 KB 前缀哈希 · 20,000 条记录窗口
你实际得到的列
并非只是一串带有时间戳的文本。每种格式都会被解析成可直接进行筛选、分组和聚合的类型化列——如果容器记录的是结构化的 JSON,那么它自身的字段也会被展开成列。
每一行也都承载着 事件时间读取原始印章及其来源文件。每种格式都会添加其标识列—— 应用程序 对于 json 文件和 Portainer, 容器 导出时——并且 json 文件行还包含 图像, compose_project, compose_service 和 container_id单曲 信息 导出列是特意设置的:容器自身的行保持完整,而不是靠猜测。
容器日志数据可以放在哪里?
日志文件并非无解之谜。只需连接一次文件夹,同一个只读连接即可为 Query Streams 支持的所有接口提供数据——无需二次设置,无需二次复制数据,处理方式与数据库连接器完全相同。
容器日志导出到 Excel
微软 Excel · Excel 加载项
将实时容器日志结果直接提取到工作表中,并按需刷新——支持桌面版 Excel、Excel Online 和 Microsoft 365。
Excel 的工作原理容器日志保存到 Google 表格
表格插件
从侧边栏运行已保存的容器日志查询,并将结果行拖放到工作表中。共享协作者可以自行刷新工作表。
Google 表格的工作原理容器日志 MCP 服务器
Claude、Cursor 和 MCP 客户端 · MCP 服务器
赋予 AI 助手对容器日志的只读访问权限,并提供其编写正确 SQL 所需的架构——聊天中无需提供凭据。
MCP 的工作原理容器日志 REST API
HTTP 端点
将容器日志查询发布为任何应用程序都可以调用的已认证 JSON 端点,符合 OpenAPI 3.1 规范,并预置了 Postman、Insomnia 和 Hoppscotch 集合。无需打开数据库端口。
REST API 的工作原理容器日志到 Airtable
自动化平台
按计划将容器日志行同步到 Airtable,或者在 Airtable 自动化脚本中获取它们。
Airtable 的工作原理容器日志记录到 Baserow
自动化平台
通过 REST 端点从容器日志向 Baserow 表提供数据——无论是自托管还是 Baserow 云。
Baserow 的工作原理容器日志到 SeaTable
自动化平台
无需导出文件或暴露数据库,即可使用容器日志数据保持 SeaTable 数据库的最新状态。
SeaTable 的工作原理容器日志到 Smartsheet
自动化平台
将集装箱日志结果推送到 Smartsheet 网格中,以便计划和报告能够从源系统读取数据,而不是从上周的导出数据读取数据。
Smartsheet 的工作原理容器日志记录到 Anvil
Anvil Works · 应用平台
通过 REST 端点向 Anvil Python 应用程序提供容器日志,而不是将数据库凭据嵌入到应用程序中。
Anvil 的工作原理将容器日志保存到 Power BI
Power Query M
将生成的 Power Query M 粘贴到 Power BI 高级编辑器中,报表将通过 HTTPS 读取实时容器日志结果——无需 ODBC 驱动程序,也无需打开数据库端口。
Power BI 的工作原理容器日志警报和报告
Slack · Discord · 电子邮件 · Webhook
将容器日志查询设置为定时执行,并将查询结果发送到 Slack、Discord、电子邮件或签名 webhook,或者等到行数、阈值或百分比变化超过您设定的界限时才发送消息。
警报和报告的工作原理它刻意不做的事情
它不是实时日志流。查询流会在您运行查询时读取磁盘上的文件,因此重启循环会显示为行,而不是您可以监视的流。如果您需要在打印行时立即发出亚秒级警报,日志管道才是合适的工具。
容器的输出格式是自由的,这会带来一个需要明确说明的后果:应用程序输出的任何内容都会被写入表格。如果它记录了一个令牌或客户电子邮件,那么该字符串已经存在于日志文件中,并且也会出现在相应的列中。与 Web 服务器日志不同,容器没有用于排除特定内容的标头映射——因此,请像对待日志文件一样谨慎对待生成的表格。
两个较小的限制,明确命名而非隐藏。 Docker 日志 导出时,容器自身的线路保持完整。 信息 列;目前尚未实现按其自身格式重新解析该内部行的功能。此外,Docker 可以附加到日志标签的可选属性仅能通过形状识别——捕获的语料库中没有任何容器使用这些属性,因此路径已声明,但尚未验证。
其余部分遵循常规设计。代理程序连接外部网络并读取文件;容器内不会安装任何内容,也不会写回任何数据,Docker 套接字和 API 也不会被修改,并且访问权限为只读。此预设的保留期限为 30 天,您可以自行更改。
工作原理
只需三步,容器中就不会安装任何东西。
指向日志文件夹
赋予查询流代理对日志所在位置的读取权限 — /var/lib/docker/containers 在 Docker 主机上、已保存导出文件的文件夹或您收集它们的共享位置。
它能识别这种格式
查询流通过行内容(而不是文件名)来识别格式——因此,重命名的副本仍然可以读取,并且与固定格式不匹配的文件会被暂时搁置并给出原因,而不是破坏表。
查询它,或者连接它
从门户网站运行 SQL,将其实时导入 Microsoft Excel 或 Google Sheets,或者使用联合查询将容器日志与应用程序数据库中的用户和订单连接起来——只需一条语句即可完成。
容器日志常见问题解答
我需要更改 Docker 日志驱动程序吗?
不。 json文件 这是 Docker 的默认驱动程序,也是受支持的驱动程序。如果您从未配置过日志记录,则文件已存在且格式正确。
如果您更换了司机, docker logs --timestamps export 是入口点:无论驱动程序是什么,它都能正常工作,因为 CLI 会通过守护进程读取数据。
它是如何知道容器的名称而不仅仅是容器的 ID 的?
Docker 会在与日志相同的文件夹中写入容器记录。Query Streams 会从该文件中读取容器名称,并将其用作标识列,镜像、Compose 项目和服务则作为相邻的列保留。64 个字符的文件夹 ID 会被保留。 container_id所以,什么也不会损失。
如果该记录缺失、无法读取或没有名称,则会使用文件夹名称代替,并且扫描会统计这种情况发生的次数——因此,备用方案会显示为一个您可以查看的数字,而不是一个静默的替换。
我使用的是 Windows 或 Mac 版的 Docker Desktop。这样可以吗?
并非直接针对 JSON 文件日志。Docker Desktop 将这些日志保存在其自身的虚拟机内部,运行在主机上的代理服务无法访问这些日志。
解决之道在于导出配置文件: docker logs --timestamps <容器> 重定向到代理程序可读取的任何文件夹中的文件。这本身就是一种受支持的格式,并非权宜之计——这与人们在容器消失后保留日志副本的方式相同。
这是实时画面吗?
它是按需读取而非流式传输。查询运行时,文件会按原样读取,因此新行会随着容器的写入而出现,文件也会被读取——并非按照固定的夜间时间表,但也并非实时跟踪。
对于过去几周内每个集装箱的情况,需要询问相关问题并将答案输入电子表格,这种方式比堆放原木的方式更实用,而且所需的机械设备也少得多。
Kubernetes 或 Podman 怎么样?
目前两者均无各自的配置文件,我们宁愿明确说明这一点,而不是暗示涵盖所有内容。但导出格式是适用的:配置文件与确切形状相对应。 docker logs --timestamps 写入格式为:一个 RFC 3339 纳秒时间戳,一个空格,然后是容器自身的一行,每个服务一个文件。能够写入相同格式的文件也能读取相同格式的文件。
对于您自己的文件,可靠的查找方法是使用“测试连接”,它会在您执行任何操作之前报告它识别到的内容。
我的容器会记录 JSON 数据。我能将它们的字段作为列获取吗?
是的,对于 JSON 文件日志来说是这样。守护进程的数据包会被解包,容器内部的 JSON 数据会被扁平化为若干列——级别、日志记录器、消息、主机和服务(如果存在)。任何未映射到指定列的内容都会被保留在一个单独的容器中。 数据 而不是丢弃该列,因此不常见的字段仍然可以查询。
唯一没有从容器 JSON 中获取的信息是时间戳。时间戳来自守护进程,因为应用程序自身的时间戳格式不固定,如果格式错误,会导致该行数据在时间上发生静默错误。
如果解析器无法读取某一行代码怎么办?
它会被保留,而不是删除。不符合固定格式的行会作为原始行保留,并附带原因说明。因此,格式错误的条目或意外的格式更改会以可见和可查询的形式显示出来,而不是在数据中留下一个无声的空白。












