首批通过分布式安全可靠测评,为关键业务系统打造
查看 Web 版 ODC 日志
更新时间:2026-04-13 15:31:21
本文档旨在介绍如何查看 ODC Web 版日志路径。
查看 Web 版 ODC 日志路径和文件
日志路径
登录宿主机,执行以下命令进入 ODC Docker。
# 查看 odc docker image name docker ps -a --format "{{.Names}}" | grep odc # 进入 odc docker,假设 docker image name 为 odc IMAGE_NAME=odc && docker exec -it ${IMAGE_NAME} shDocker 中 /opt/odc/log/即为 Web 版 ODC 的日志路径。
日志文件
cd /opt/odc/log
sh-4.2# ls -l
total 540
-rw-r--r-- 1 root root 9062 May 13 15:23 gc.log.0.current
-rw-r--r-- 1 root root 523802 May 13 15:23 odc.log
参数说明:
| 参数 | 说明 |
|---|---|
| odc.log | odc-server 的应用程序日志。 |
| gc.log | odc-server 的 JVM GC 日志。 |
根据 HTTP 请求定位后端日志
步骤 1:通过浏览器开启调试
以 Chrome 浏览器为例,按快捷键 F12 ,选择 Network > XHR 过滤 AJAX 请求。

说明
ODC 为前后端分离架构,页面和数据是分离状态,因此 ODC 前端和后端的交互数据均通过 AJAX 请求实现。
步骤 2:执行操作,观察请求的 Response

所有 API 请求的 response 中均包含以下参数:
| 参数 | 说明 |
|---|---|
| requestId | 前端生成的 ID,包含在后端日志中。 |
| server | 后端返回的服务器名称,在多节点部署场景下,用于确定处理当前请求的服务器。 |
| timestamp | 后端处理当前请求的时间戳。 |
| traceId | 后端生成的随机串,每个请求对应一个唯一的 traceId。 |
步骤3:根据 traceId 检索后端日志文件
如上述步骤 2 中截图所示,在主机名称为 OceanBase******.et15sqa 的服务器中检索日志。
检索关键字 9a00e136******ac。
结果示例:
grep 9a00e136324c43ac /opt/odc/log/odc.log [2021-06-01 16:57:40.305][http-nio-8989-exec-15][9a00e136324c43ac,,QRR97CNVYCB61IP8TBXCPX][INFO][com.alipay.odc.service.OdcConsoleService][56]: sql is executed completely. executeSql=select * from dual;,duration=62(ms) [2021-06-01 16:57:40.305][http-nio-8989-exec-15][9a00e136324c43ac,,QRR97CNVYCB61IP8TBXCPX][INFO][com.oceanbase.odc.web.trace.TraceOdcResultResponseAdvice][71]: ODC_REQUEST_TRACE, method=POST, URI=http://xxx.xx.xxx.xx:xxxx/api/v1/console/sql-execute/sid:62-5:d:yizhou_odc_240?ignoreError=true, client=xx.xx.xxx.xxx, userId=1000100, result=OdcResult(errCode=null, errMsg=ErrorCode: 1096, No tables used, isImportantMsg=false, timestamp=2021-06-01T16:57:40.242+08:00, durationMillis=63, traceId=9a00e136324c43ac, server=OceanBase152084.et15sqa, requestId=QRR97CNVYCB61IP8TBXCPX), userAgent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36
示例: 包含错误提醒的日志检索过程
场景示例:获取一个非法语句的执行计划失败。

错误日志:
$grep 87d4f19ffcbd47cf /opt/odc/log/odc.log | grep ODC_FAILED_REQUEST | grep rootReason
[2021-06-01 17:08:38.743][http-nio-8989-exec-17][87d4f19ffcbd47cf,,QRR97CNVYCB61IP8TBXCPX][INFO][com.alipay.odc.controller.GlobalExceptionHandler][180]: ODC_FAILED_REQUEST, requestURI=/api/v1/diagnose/explain/sid:62-5:d:yizhou_odc_240, remoteHost=xx.xx.xxx.xxx, clientAddress=xx.xx.xxx.xxx, result=OdcResult(errCode=ObGetPlanExplainFailed, errMsg=获取执行计划失败,可能是语法错误或者 DDL 语句,错误详情:No tables used, isImportantMsg=false, timestamp=2021-06-01T17:08:38.738+08:00, durationMillis=4, traceId=87d4f19ffcbd47cf, server=OceanBase152084.et15sqa, requestId=null), exceptionType=ObException, message=No tables used, rootReason=com.alipay.odc.odcsdk.sdk.resourcedialect.exception.ObException: 获取执行计划失败,可能是语法错误或者 DDL 语句,错误详情:No tables used at com.alipay.odc.odcsdk.sdk.resourcedialect.exception.ObException.executeFailed(ObException.java:51)
注意
包含 ODC_FAILED_REQUEST 关键字的日志行,提供了 **rootReason** 信息,该信息对于开发定位问题非常有帮助(包含异常代码行)。错误日志中的 rootReason 信息:rootReason =com.alipay.odc.odcsdk.sdk.resourcedialect.exception.ObException: 获取执行计划失败,可能是语法错误或者 DDL 语句,错误详情:No tables used at com.alipay.odc.odcsdk.sdk.resourcedialect.exception.ObException.executeFailed(ObException.java:51)
对于预期外异常,ODC 日志还会包含完整的异常栈,示例如下:
[2021-03-08 17:05:42.675][http-nio-8989-exec-4][ERROR][com.alipay.odc.odcsdk.sdk.resourcedialect.command.sql.ExecuteSqlOneByOneCommand][139]:fail to recognize sql type, sql = flashback table odc_myapp20183253223_238930.__recycle_$_3_1613445194315049880 to before drop
com.alibaba.druid.sql.parser.ParserException: syntax error, error in :'back table odc_myapp20183253223_238', expect IDENTIFIER, actual IDENTIFIER pos 9, line 1, column 10, token IDENTIFIER null
at com.alibaba.druid.sql.parser.SQLParser.printError(SQLParser.java:344) ~[druid-1.1.23.jar!/:1.1.23]
at com.alibaba.druid.sql.parser.SQLStatementParser.parseStatementList(SQLStatementParser.java:532) ~[druid-1.1.23.jar!/:1.1.23]
at com.alibaba.druid.sql.parser.SQLStatementParser.parseStatementList(SQLStatementParser.java:171) ~[druid-1.1.23.jar!/:1.1.23]
at com.alipay.odc.odcsdk.sql.OdcSqlParser.parseStatements(OdcSqlParser.java:99) ~[ob-odc-sdk-2.4.0-SNAPSHOT.jar!/:?]
at com.alipay.odc.odcsdk.sql.OdcSqlParser.<init>(OdcSqlParser.java:36) ~[ob-odc-sdk-2.4.0-SNAPSHOT.jar!/:?]
at com.alipay.odc.odcsdk.sdk.resourcedialect.command.sql.ExecuteSqlOneByOneCommand.recognizeSqlType(ExecuteSqlOneByOneCommand.java:130) [ob-odc-sdk-2.4.0-SNAPSHOT.jar!/:?]
at com.alipay.odc.odcsdk.sdk.resourcedialect.command.sql.ExecuteSqlOneByOneCommand.doExecute(ExecuteSqlOneByOneCommand.java:109) [ob-odc-sdk-2.4.0-SNAPSHOT.jar!/:?]
at com.alipay.odc.odcsdk.sdk.resourcedialect.command.sql.ExecuteSqlOneByOneCommand.doObMysql(ExecuteSqlOneByOneCommand.java:114) [ob-odc-sdk-2.4.0-SNAPSHOT.jar!/:?]
at com.alipay.odc.odcsdk.sdk.resourcedialect.command.sql.ExecuteSqlOneByOneCommand.doObMysql(ExecuteSqlOneByOneCommand.java:27) [ob-odc-sdk-2.4.0-SNAPSHOT.jar!/:?]
日志查看分析常用命令参考
# 查看最近10次错误请求
grep ODC_FAILED_REQUEST /opt/odc/log/odc.log | tail -10
# 根据 traceId 查看错误日志上下文,向前向后5行
# -B, --before-context=NUM print NUM lines of leading context
# -A, --after-context=NUM print NUM lines of trailing context
grep 87d4f19ffcbd47cf /opt/odc/log/odc.log -A 5 -B 5