DataHub 容器日志提取完全指南:从 Docker Compose 与 Kubernetes 中导出 GMS 与前端日志
2026/9/17 14:44:16 网站建设 项目流程

DataHub 容器日志提取完全指南:从 Docker Compose 与 Kubernetes 中导出 GMS 与前端日志

【免费下载链接】datahubThe Context Platform for your Data and AI Stack项目地址: https://gitcode.com/GitHub_Trending/da/datahub

DataHub 的容器化部署中,后端服务 datahub-gms(元数据服务)与前端 datahub-frontend(UI 服务)会将运行日志写入各自容器内的本地文件系统。当后端 API 报错、UI 加载异常或元数据同步失败时,提取这些日志文件是定位问题的第一步。本文将基于当前仓库的官方运维文档,结合源码与配置逐层拆解日志的存放位置、两种日志类型的区别,以及如何在 Docker / Docker Compose 与 Kubernetes / Helm 两种部署形态下,把容器内日志安全地导出到宿主机进行排查。

为什么需要主动提取容器日志

DataHub 的 GMS 与 frontend 服务基于 Logback 输出日志,日志会同时写入两个目标:一是容器的标准输出(stdout),可通过docker logskubectl logs直接查看;二是容器本地文件系统上的滚动日志文件。文件日志的价值在于:

  • 保留了按日期切分的归档文件,便于回溯历史某一天的问题;
  • debug 级别的日志默认只进文件、不打印到 stdout,排查底层代码路径时必须读取文件;
  • 日志文件可直接greptail或整份导出交给团队分析。

下文所有操作都围绕这两个服务各自的日志目录展开。

第一步:找到目标容器或 Pod 的标识

日志文件位于容器内部,因此首先要拿到容器的 ID(Docker)或 Pod 名称(Kubernetes)。

Docker 与 Docker Compose

运行以下命令列出所有已知容器,并记录目标服务的 CONTAINER ID:

docker container ls

输出示例(来自仓库文档):

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6c4a280bc457 acryldata/datahub-frontend-react "datahub-frontend/bi…" 5 days ago Up 46 hours (healthy) 0.0.0.0:9002->9002/tcp datahub-frontend-react 122a2488ab63 acryldata/datahub-gms "/bin/sh -c /datahub…" 5 days ago Up 5 days (healthy) 0.0.0.0:8080->8080/tcp datahub-gms 7682dcc64afa confluentinc/cp-schema-registry:5.4.0 "/etc/confluent/dock…" 5 days ago Up 5 days 0.0.0.0:8081->8081/tcp schema-registry 3680fcaef3ed confluentinc/cp-kafka:5.4.0 "/etc/confluent/dock…" 5 days ago Up 5 days 0.0.0.0:9092->9092/tcp, 0.0.0.0:29092->29092/tcp broker 9d6730ddd4c4 neo4j:4.0.6 "/sbin/tini -g -- /d…" 5 days ago Up 5 days 0.0.0.0:7474->7474/tcp, 7473/tcp, 0.0.0.0:7687->7687/tcp neo4j c97edec663af confluentinc/cp-zookeeper:5.4.0 "/etc/confluent/dock…" 5 days ago Up 5 days 2888/tcp, 0.0.0.0:2181->2181/tcp, 3888/tcp zookeeper 150ba161cf26 mysql:8.2 "docker-entrypoint.s…" 5 days ago Up 5 days 0.0.0.0:3306->3306/tcp, 33060/tcp mysql 4b72a3eab73f elasticsearch:7.9.3 "/tini -- /usr/local…" 5 days ago Up 5 days (healthy) 0.0.0.0:9200->9200/tcp, 9300/tcp elasticsearch

datahub-gms服务为例,需要记下容器 ID:122a2488ab63

Kubernetes 与 Helm

使用 kubectl 查看 Pod 列表,并记录目标 Pod 的名称:

kubectl get pods

输出示例:

... default datahub-frontend-1231ead-6767 1/1 Running 0 42h default datahub-gms-c578b47cd-7676 1/1 Running 0 13d ...

其中datahub-gms-c578b47cd-7676即包含 GMS 后端服务的 Pod 名称。

第二步:定位容器内的日志文件

日志文件位于每个服务各自固定的目录下:

服务日志目录
datahub-gms/tmp/datahub/logs/gms
datahub-frontend/tmp/datahub/logs/datahub-frontend

这两个路径并非文档中的约定俗成,而是由源码中的 Logback 配置直接定义的。GMS 侧配置位于 metadata-service/war/src/main/resources/logback.xml,其中通过LOG_DIR属性声明:

<property name="LOG_DIR" value="${LOG_DIR:-/tmp/datahub/logs/gms}"/>

frontend 侧的配置位于 datahub-frontend/conf/logback.xml,声明:

<property name="LOG_DIR" value="${LOG_DIR:- /tmp/datahub/logs/datahub-frontend}"/>

也就是说,日志目录可以通过设置环境变量LOG_DIR覆盖默认值,默认值即为文档中给出的路径。容器启动时,docker/datahub-frontend/start.sh 通过 JVM 参数-Dlogback.configurationFile=${DATAHUB_HOME}/conf/logback.xml显式加载 frontend 的日志配置,确保容器内使用与仓库一致的日志行为。

两种日志类型的区别

容器内同时收集两类日志文件:

  1. Info 日志:包含 info、warn、error 级别的日志行,与容器 stdout 打印的内容一致;按天滚动归档,保留时间较长。
  2. Debug 日志:保留时间更短(仅最近 1 天),但包含来自 DataHub 自身代码的更细粒度调试信息。注意:DataHub 依赖的外部库的 debug 日志会被忽略,从而保证 debug 文件聚焦于项目自身逻辑。

以 GMS 为例,ls目录可见两类文件并存(示例来自仓库文档):

docker exec --privileged 122a2488ab63 ls -la /tmp/datahub/logs/gms total 4664 drwxr-xr-x 2 datahub datahub 4096 Jul 28 05:14 . drwxr-xr-x 3 datahub datahub 4096 Jul 23 08:37 .. -rw-r--r-- 1 datahub datahub 2001112 Jul 23 23:33 gms.2021-23-07-0.log -rw-r--r-- 1 datahub datahub 74343 Jul 24 20:29 gms.2021-24-07-0.log -rw-r--r-- 1 datahub datahub 70252 Jul 25 17:56 gms.2021-25-07-0.log -rw-r--r-- 1 datahub datahub 626985 Jul 26 23:36 gms.2021-26-07-0.log -rw-r--r-- 1 datahub datahub 712270 Jul 27 23:59 gms.2021-27-07-0.log -rw-r--r-- 1 datahub datahub 867707 Jul 27 23:59 gms.debug.2021-27-07-0.log -rw-r--r-- 1 datahub datahub 3563 Jul 28 05:26 gms.debug.log -rw-r--r-- 1 datahub datahub 382443 Jul 28 16:16 gms.log

因为日志文件以当前日期命名,必须先用ls查看当前实际存在的文件,再决定提取哪一个。

Docker 与 Docker Compose:使用 docker exec 查看

通用命令形式:

docker exec --privileged <container-id> <shell-command>

查看 GMS 日志目录:

docker exec --privileged 122a2488ab63 ls -la /tmp/datahub/logs/gms

--privileged并非查看日志所必需,但这是官方文档给出的示例写法;在部分受限容器环境(如需要特殊权限或挂载)中可保证命令正常执行。根据问题现象,可同时关注 debug 日志与普通 info 日志。

Kubernetes 与 Helm:使用 kubectl exec 查看

kubectl exec datahub-gms-c578b47cd-7676 -n default -- ls -la /tmp/datahub/logs/gms

输出示例:

total 36388 drwxr-xr-x 2 datahub datahub 4096 Jul 29 07:45 . drwxr-xr-x 3 datahub datahub 17 Jul 15 08:47 .. -rw-r--r-- 1 datahub datahub 104548 Jul 15 22:24 gms.2021-15-07-0.log -rw-r--r-- 1 datahub datahub 12684 Jul 16 14:55 gms.2021-16-07-0.log -rw-r--r-- 1 datahub datahub 2482571 Jul 17 14:40 gms.2021-17-07-0.log -rw-r--r-- 1 datahub datahub 49120 Jul 18 14:31 gms.2021-18-07-0.log -rw-r--r-- 1 datahub datahub 14167 Jul 19 23:47 gms.2021-19-07-0.log -rw-r--r-- 1 datahub datahub 13255 Jul 20 22:22 gms.2021-20-07-0.log -rw-r--r-- 1 datahub datahub 668485 Jul 21 19:52 gms.2021-21-07-0.log -rw-r--r-- 1 datahub datahub 1448589 Jul 22 20:18 gms.2021-22-07-0.log -rw-r--r-- 1 datahub datahub 44187 Jul 23 13:51 gms.2021-23-07-0.log -rw-r--r-- 1 datahub datahub 14173 Jul 24 22:59 gms.2021-24-07-0.log -rw-r--r-- 1 datahub datahub 13263 Jul 25 21:11 gms.2021-25-07-0.log -rw-r--r-- 1 datahub datahub 13261 Jul 26 19:02 gms.2021-26-07-0.log -rw-r--r-- 1 datahub datahub 1118105 Jul 27 21:10 gms.2021-27-07-0.log -rw-r--r-- 1 datahub datahub 678423 Jul 28 23:57 gms.2021-28-07-0.log -rw-r--r-- 1 datahub datahub 1776274 Jul 28 07:19 gms.debug.2021-28-07-0.log -rw-r--r-- 1 datahub datahub 27576533 Jul 29 09:55 gms.debug.log -rw-r--r-- 1 datahub datahub 1195940 Jul 29 14:55 gms.log

第三步:将容器日志文件保存到本地

确定目标日志文件后,将其复制到本地文件系统进行进一步排查。

Docker 与 Docker Compose:cat 重定向

使用docker exec执行cat命令,并把输出重定向到本地新文件:

docker exec --privileged 122a2488ab63 cat /tmp/datahub/logs/gms/gms.debug.log > my-local-log-file.log

执行后即可在本地查看my-local-log-file.log。同样的方法适用于 frontend 服务,只需替换容器 ID 与路径(如/tmp/datahub/logs/datahub-frontend/datahub-frontend.log)。

Kubernetes 与 Helm:kubectl exec 或 kubectl cp

Kubernetes 下有多种方式将 Pod 内文件导出到本地:既可以用kubectl cp直接拷贝文件,也可以像 Docker 一样用cat管道重定向。官方文档示例采用后者:

kubectl exec datahub-gms-c578b47cd-7676 -n default -- cat /tmp/datahub/logs/gms/gms.log > my-local-gms.log

若使用kubectl cp,等价命令为:

kubectl cp default/datahub-gms-c578b47cd-7676:/tmp/datahub/logs/gms/gms.log ./my-local-gms.log

源码视角:日志文件的滚动策略与调试级别

理解日志文件为什么按日期命名、debug 日志为何只保留 1 天,有助于判断该提取哪个文件。这些行为全部由 Logback 配置控制。

GMS 日志配置详解

GMS 的 logback.xml 定义了三个关键 appender:

Appender文件滚动策略要点
FILE(info)${LOG_DIR}/gms.log单文件最大 100MB(maxFileSize),归档总量上限 10GB(totalSizeCap),最多保留 30 天(maxHistory),文件名形如gms.yyyy-dd-MM-i.log
DEBUG_FILE${LOG_DIR}/gms.debug.log单文件最大 100MB,归档总量上限 2GB,仅保留 1 天,且通过LevelFilter只接受 DEBUG 及以上级别
GRAPHQL_DEBUG_FILE${LOG_DIR}/gms.graphql.log独立记录 GraphQL 层的调试日志(com.datahub.graphqllogger 设为 DEBUG/TRACE),保留 1 天

值得注意的两点:

  1. debug 日志仅覆盖 DataHub 自身代码com.linkedinlogger 被设为DEBUG并接入 DEBUG_FILE,而org.apache.kafka.clients等外部依赖保持 INFO/WARN,这正是文档所说"忽略外部库 debug 日志"的实现来源。
  2. stdout 与文件共用过滤:STDOUT 与 FILE appender 都通过ThresholdFilter拦截 INFO 以下日志,并过滤掉scanned from multiple locations等无意义告警行,保证两种输出内容一致且干净。

Frontend 日志配置详解

frontend 的 logback.xml 结构类似:datahub-frontend.log(info,保留 30 天、总量上限 10GB)与datahub-frontend.debug.log(DEBUG,保留 1 天)。其 debug 文件额外覆盖了controllersauthorg.pac4jgraphqlreact等与 UI 认证和渲染链路相关的 logger,排查登录问题或前端接口报错时优先查看该文件。

可选进阶:将日志推送到 Loki 聚合平台

从配置可以看到,GMS 与 frontend 的 logback 还内置了可选的日志聚合能力:当环境变量LOG_AGGREGATOR_ENDPOINT被设置时,日志会通过 Loki4jAppender 异步批量推送到兼容 Loki push 协议的聚合端(如 Grafana Loki、VictoriaLogs),标签格式为service=datahub-gmsservice=datahub-frontend。该能力默认休眠,且采用有界队列、不会阻塞服务。在 docker-compose 中可通过 docker/profiles/docker-compose.gms.yml 与 docker/profiles/docker-compose.frontend.yml 中的LOG_AGGREGATOR_ENDPOINT环境变量启用:

LOG_AGGREGATOR_ENDPOINT: ${LOG_AGGREGATOR_ENDPOINT:-}

启用后,即使不进入容器,也可以直接在聚合平台上检索、过滤 GMS 与 frontend 的全部日志,适合大规模部署场景。

排查实践建议

  • 先看 stdout,再取文件docker logs datahub-gmskubectl logs deployment/datahub-gms适合快速确认服务是否正常启动;需要回溯历史或查看 debug 细节时,再按本文步骤提取文件。
  • 按需选择日志文件:业务报错通常查 info 日志(gms.log/datahub-frontend.log);需要深入 DataHub 内部调用链时,查当日 debug 文件(gms.debug.log/datahub-frontend.debug.log);GraphQL 查询问题在 GMS 容器中可查gms.graphql.log
  • 注意 debug 日志的短保留期:debug 文件仅保留 1 天,遇到持续性问题应尽早导出;历史 debug 归档文件(如gms.debug.2021-27-07-0.log)只在归档窗口内可用。
  • 提取完整目录:若问题横跨多天,可以一次导出整个目录,例如docker exec --privileged <id> tar -cf - /tmp/datahub/logs/gms | tar -xf -,再在本地检索。

总结

DataHub 的日志体系设计得很直观:GMS 与 frontend 各自维护独立的日志目录,info 与 debug 双轨并行,滚动策略与保留期由仓库内的 Logback 配置统一定义。无论是 Docker Compose 还是 Kubernetes 部署,掌握docker exec/kubectl exec查看与导出文件的方法后,即可在几分钟内拿到定位后端与 UI 问题所需的全部日志证据。

【免费下载链接】datahubThe Context Platform for your Data and AI Stack项目地址: https://gitcode.com/GitHub_Trending/da/datahub

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询