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 logs或kubectl logs直接查看;二是容器本地文件系统上的滚动日志文件。文件日志的价值在于:
- 保留了按日期切分的归档文件,便于回溯历史某一天的问题;
- debug 级别的日志默认只进文件、不打印到 stdout,排查底层代码路径时必须读取文件;
- 日志文件可直接
grep、tail或整份导出交给团队分析。
下文所有操作都围绕这两个服务各自的日志目录展开。
第一步:找到目标容器或 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 的日志配置,确保容器内使用与仓库一致的日志行为。
两种日志类型的区别
容器内同时收集两类日志文件:
- Info 日志:包含 info、warn、error 级别的日志行,与容器 stdout 打印的内容一致;按天滚动归档,保留时间较长。
- 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 天 |
值得注意的两点:
- debug 日志仅覆盖 DataHub 自身代码:
com.linkedinlogger 被设为DEBUG并接入 DEBUG_FILE,而org.apache.kafka.clients等外部依赖保持 INFO/WARN,这正是文档所说"忽略外部库 debug 日志"的实现来源。 - 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 文件额外覆盖了controllers、auth、org.pac4j、graphql、react等与 UI 认证和渲染链路相关的 logger,排查登录问题或前端接口报错时优先查看该文件。
可选进阶:将日志推送到 Loki 聚合平台
从配置可以看到,GMS 与 frontend 的 logback 还内置了可选的日志聚合能力:当环境变量LOG_AGGREGATOR_ENDPOINT被设置时,日志会通过 Loki4jAppender 异步批量推送到兼容 Loki push 协议的聚合端(如 Grafana Loki、VictoriaLogs),标签格式为service=datahub-gms或service=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-gms或kubectl 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),仅供参考