Skip to content

LOG_SYS 系统日志表 ​

记录用户操作、资源访问、后台处理及异常等事件,用于审计、业务过程查询和问题追踪。每条日志表示一个事件;同一调用链可以产生多条日志,通过 TRACE_ID 关联。

位置 ​

模型路径:/sysdata/data/tables/sys/LOG_SYS.tbl

物理表名:SZSYS_5_LOG_SYS

通过数据模型查询时使用模型路径,通过数据库连接执行SQL时使用物理表名。以下字段说明用于读取和分析日志数据。

表结构 ​

字段名字段类型用途与取值
LOG_IDVARCHAR(36)单条日志的唯一标识,主键。按此字段可以定位一条完整记录。
EVENT_NAMEVARCHAR(128)事件编码,例如 sample.submit。用于筛选同一种业务事件,可关联事件目录取得显示名称。具体编码由系统功能或业务应用定义。
USER_IDVARCHAR(64)执行用户的ID,可关联用户信息查询执行人。没有用户身份的事件可为空。
SESSION_IDVARCHAR(128)登录会话标识,用于查询同一登录会话的事件与程序日志,与 HTTP_SESSIONS.SESSION_ID 是同一个值,可直接等值关联;无登录会话的事件为空。
TRIGGER_TYPEVARCHAR(16)事件发起来源,单值:USER、CLI、MCP、API、SCHEDULE、SYSTEM、UNKNOWN。未记录时为空,详细取值见下文。
PROJECT_NAMEVARCHAR(128)事件发生时主业务对象或资源所属项目的项目名。用于按项目筛选;无项目归属时可为空。项目重命名前后的日志可能记录不同名称。
CLIENT_IPVARCHAR(128)来源客户端地址,通常为单个IPv4或IPv6地址文本。用于按访问来源排查;没有网络请求的事件可为空。
RES_PATHVARCHAR(1024)事件发生时所在资源的完整路径,例如 /LAB/app/sample/submit.afl,路径包含项目名。没有关联资源时可为空。
RES_TYPEVARCHAR(32)事件所在资源的类型,例如 afl(程序流)、spg(页面)、dash(仪表盘)、rpt(报表)。用于按资源类型筛选,具体类型随资源种类而定。
OBJECT_TYPEVARCHAR(128)操作针对的主业务对象类型码,例如 sample(样本)、expense(报销单)。类型码由业务应用定义,未记录时为空。
OBJECT_IDVARCHAR(256)主业务对象标识,例如 SP001。查询一个对象的日志时,应结合 PROJECT_NAME 和 OBJECT_TYPE,避免不同项目或对象类型中相同ID混淆。多对象操作的其他对象信息可在详情中查看。
TRACE_IDVARCHAR(32)调用链标识,32位小写十六进制字符串,不能全为0。同一调用链中的事件和程序日志使用相同值;不唯一。历史日志未记录时为空。
UPDATE_TYPEVARCHAR(16)数据操作类型,单值:INSERT、UPDATE、DELETE、CREATE、ALTER、DROP、TRUNCATE、READ、COMPOSITE、OTHER、UNKNOWN。既表示业务数据操作,也表示表或模型等结构操作。
OPERATION_STATEVARCHAR(16)操作结果,单值:OK(成功)、FAIL(业务失败)、EXCPT(异常)、ERROR(严重错误)。具体错误原因在 DETAIL_INFO 中查看。
LOG_LEVELNUMBER(1)日志严重程度:0 OFF、1 FATAL、2 ERROR、3 WARN、4 IMPT、5 INFO、6 DEBUG、7 TRACE。详细说明见下文。
CLUSTER_NODEVARCHAR(32)记录日志的集群节点标识,用于定位处理该事件的服务器节点。
START_TIMETIMESTAMP事件或动作开始时间,用于时间范围筛选和排序。
END_TIMETIMESTAMP事件或动作结束时间。可结合开始时间计算耗时;此字段不是日志入库时间。
DETAIL_INFOCLOBJSON格式的日志详情,包括业务说明、具体错误码、异常消息、堆栈和其他上下文。内容随事件而异,可为空。

LOG_ID 标识一条日志,TRACE_ID 关联一条调用链,SESSION_ID 关联一次登录会话,三者的查询范围不同。对象标识按字符串使用,例如 00123 与 123 不应自行合并。

历史记录或未采集相关信息的事件可能存在空字段。空值表示没有该项信息,不能据此判断“系统发起”“操作成功”或“没有数据变化”。

发起来源 TRIGGER_TYPE ​

值含义示例
USER产品界面中的用户操作用户点击按钮提交表单,随后执行程序流或脚本。
CLI通过SuccApp CLI发起手动运行CLI命令,或CI、自动化脚本直接调用CLI。
MCP通过MCP工具调用发起AI客户端调用MCP工具执行产品操作。
SCHEDULE定时调度发起定时运行数据加工或程序流。
API其他外部接口调用外部应用直接调用接口提交数据,不属于已识别的CLI或MCP来源。
SYSTEM系统内部主动发起系统内部维护任务。
UNKNOWN来源无法确定事件来源不能明确分类。

该字段表示最初发起来源,USER_ID 表示执行身份。使用用户凭证的CLI或MCP调用仍分别属于 CLI 或 MCP,不会因此归为 USER。

来源沿同一次调用传递:MCP工具内部调用CLI,再由CLI请求接口时,记录为 MCP;直接运行CLI则记录为 CLI。用户界面或产品调度器触发的操作即使经过脚本或接口执行,仍分别记录为 USER 或 SCHEDULE。CI直接调用CLI属于 CLI,不因CI具有定时能力而归为产品内部的 SCHEDULE。

来源以系统识别并传递的调用上下文为准,不能仅根据HTTP协议、用户名或任意客户端自报标签判断。NULL 表示未记录;查询未知来源时可同时包含 UNKNOWN 和空值。

数据操作类型 UPDATE_TYPE ​

值含义示例
INSERT新增业务数据新建报销单、新增样本记录。
UPDATE修改业务数据修改金额、更新审批状态。
DELETE删除业务数据删除样本,包括业务上的逻辑删除。
CREATE创建表、模型等结构性对象创建数据表;新增一条业务记录则属于 INSERT。
ALTER修改结构或定义增加表字段、修改模型定义、重命名表。
DROP删除表、模型等结构性对象删除数据表。
TRUNCATE整体清空数据并保留结构清空表数据。
READ读取数据查询业务数据。
COMPOSITE无单一主操作的复合操作一次处理同时新增和修改业务数据。
OTHER已知但不属于上述类别的操作未归入具体业务类型的授权或过程调用。
UNKNOWN操作类型无法确定记录中缺少足够信息判断操作类型。

每条日志只保存一个类型,可用等值条件或 IN 筛选。该字段描述业务操作,不要求与底层SQL关键字相同。例如逻辑删除可能通过SQL UPDATE 完成,业务日志仍记录为 DELETE。

操作类型与结果需要结合查看:UPDATE_TYPE = 'UPDATE' 表示修改操作,是否成功由 OPERATION_STATE 判断。修改失败或回滚的事件也可能标记为 UPDATE;不能仅凭操作类型统计实际变更行数。

操作状态 OPERATION_STATE ​

值含义示例
OK成功登录成功、业务操作成功。
FAIL业务失败用户凭证不正确、业务条件不满足。
EXCPT执行异常操作过程中发生异常,例如访问的表不存在。
ERROR严重错误对服务器运行产生影响的严重错误。

直接查询数据库时使用上述字符串。事件API中的数字状态 0/1/2/3 分别对应 OK/FAIL/EXCPT/ERROR,不应用数字条件查询本列。

取消、超时等情况可能记录为失败或异常,具体原因需查看详情。空值及无法识别的历史状态应单独处理,不能计入成功。详情中存在异常信息也不一定代表最终失败,应以本字段记录的结果为准。

日志级别 LOG_LEVEL ​

值名称含义
0OFF关闭日志的配置值,不作为常规业务日志级别。
1FATAL致命级别。
2ERROR错误级别。
3WARN警告级别。
4IMPT重要信息。
5INFO一般信息。
6DEBUG调试信息。
7TRACE跟踪信息。

数值越小,级别越高,OFF 除外。例如筛选警告及以上日志使用 LOG_LEVEL BETWEEN 1 AND 3。日志级别与操作状态分别表示严重程度和执行结果;查询失败操作应使用 OPERATION_STATE,不能仅筛选错误级别。

发生位置与操作对象 ​

例如用户在程序流中修改样本,一条日志可以包含:

text
EVENT_NAME      = sample.update
TRIGGER_TYPE    = USER
PROJECT_NAME    = LAB
RES_PATH        = /LAB/app/sample/submit.afl
RES_TYPE        = afl
OBJECT_TYPE     = sample
OBJECT_ID       = SP001
UPDATE_TYPE     = UPDATE
OPERATION_STATE = OK

RES_PATH/RES_TYPE 说明事件发生在哪个资源中,OBJECT_TYPE/OBJECT_ID 说明操作针对哪个对象。同一资源可以处理多个对象,一个对象也可能经过不同资源。

日志详情 DETAIL_INFO ​

详情是JSON文本,各事件的属性可能不同。常见属性包括 logs(日志说明)、message(消息)、exception(异常堆栈)、className(异常类名),也可能包含业务自定义的错误码、对象摘要、登录方式等。

下面是业务事件详情示例,其中 errorCode 是示例应用提供的属性,并非每条日志都有:

json
{
  "logs": ["修改样本失败"],
  "errorCode": "sample.invalidStatus",
  "message": "当前状态不允许修改"
}

按需读取详情,并在解析时处理空值、缺失属性及无法解析的历史内容。不同数据库对CLOB和JSON的查询函数不同;需要提取JSON属性时,使用所连接数据库支持的函数,或在应用中读取并解析。

登录会话与程序日志关联 ​

通过登录会话、业务调用和事件三个层次,可以从用户操作记录定位对应的程序日志:

text
登录会话(SESSION_ID = S1)
  ├─ 业务调用 A:TRACE_ID = A
  │    ├─ 事件日志 L1:SESSION_ID = S1,TRACE_ID = A
  │    ├─ 事件日志 L2:SESSION_ID = S1,TRACE_ID = A
  │    └─ 程序日志:session_id = S1,trace_id = A
  └─ 业务调用 B:TRACE_ID = B
       ├─ 事件日志 L3:SESSION_ID = S1,TRACE_ID = B
       └─ 程序日志:session_id = S1,trace_id = B
查询范围日志表字段程序日志中的关联项用法
同一登录会话SESSION_IDsession_id从会话标识查找该会话中的操作及程序日志。一个会话可能包含多次并发调用。
同一调用链TRACE_IDtrace_id从一条事件记录定位该调用的其他事件及程序日志。
单条事件记录LOG_ID不要求每行程序日志包含此值查询事件详情。同一调用链可以产生多条事件,不能将Trace ID当作日志主键。

图中的S1、A、B为便于阅读的简写;会话标识与Trace ID都应作为不透明字符串使用,Trace ID为32位小写十六进制字符串。会话标识可从 HTTP_SESSIONS.SESSION_ID 或已有事件记录中取得,两个表的 SESSION_ID 是同一个值,可直接等值关联。

找到需要排查的事件后,使用其 TRACE_ID 搜索程序日志中的 trace_id,或使用 SESSION_ID 搜索 session_id。结合节点和时间范围选择日志文件;调用跨节点时,需要查询相关节点的日志。

下面是包含关联项的程序日志格式示例:

text
2026-09-10 10:30:00.123 INFO  [127.0.0.1,S1,A] [worker-1] c.s.Foo - ...

实际可搜索的关联项以所用版本及日志输出配置为准。只有程序日志输出了相同标识,才能按标识关联;日志级别过滤或文件过期清理也可能导致找不到对应内容。这些标识用于定位已有日志,不表示每条事件一定对应一行程序日志。

系统任务和未登录请求可能没有登录会话,仍可通过 TRACE_ID 关联。会话失效或清理后,日志中已记录的会话标识仍可用于检索日志,但当前会话信息可能已无法查询。不同登录会话不会仅因属于同一用户而自动合并;查询用户跨会话操作时使用 USER_ID。

TRACE_ID 与W3C Trace Context中的Trace ID对应。HTTP服务之间通过标准 traceparent 传播调用上下文。一次登录会话可以包含多个Trace;无会话的调度任务也可有Trace。跨时间、跨多次独立操作的业务过程通过对象标识查询,不要求共用一个Trace。

会话关联使用 LoginUtils.hash(HttpSession.getId()) 生成的存储键,与 HTTP_SESSIONS.SESSION_ID 同值。HttpSession.getId() 本身是客户端凭据,不能直接记录;日志中的存储键不能作为 Cookie 或令牌使用。

程序日志中的会话标识与事件表的对应关系:数据库使用 SESSION_ID,日志JSON属性使用 sessionId,Logback输出 session_id。映射到OpenTelemetry属性时使用 session.id。该会话属性不属于W3C traceparent,不会随该头传给外部服务。

会话轮换(重新登录等)后会话标识变化,历史日志中的原标识仍可用于检索原日志。跨会话查询用户活动时使用 USER_ID 和时间范围。

历史字段与空值 ​

升级前产生的记录可能没有发起来源、项目、对象或调用关联信息,按这些字段筛选时可能不包含相关历史记录。需要查询更早的数据时,可结合时间、事件编码、用户和资源路径。

部分升级数据库中还保留以下历史列。这些列不属于通用字段集合,编写跨环境查询前应检查实际表结构;新查询优先使用上文中的字段。

历史字段类型历史用途与读取说明
LOGIN_SESSIONVARCHAR(64)历史原始登录会话ID,格式与 SESSION_ID 不同,不能直接相等关联。未记录 SESSION_ID 的历史记录不会命中 SESSION_ID 筛选。
OPTION1VARCHAR(128)不同事件可能记录IP、项目名、应用ID或其他业务标识。必须结合事件编码解释,不能将整列统一理解为对象ID。
OPTION2VARCHAR(128)不同事件可能记录业务错误码、登录方式、消息类型等,具体含义由对应事件决定。
OPTION3VARCHAR(128)部分事件记录SSO标识、消息内容类型等扩展信息。
SQL_MODEVARCHAR(250)事件登记的SQL类型摘要,例如 SELECT、CREATE,INSERT。可能含多个逗号分隔值,仅反映登记的SQL种类,不证明执行成功。
CONSISTENCY_INFOVARCHAR(256)历史扩展写入的完整性校验信息;仅有字段值不能证明日志完整性,其含义取决于原扩展。

直接执行SQL不会自动将 OPTION1 转成 CLIENT_IP,也不会自动将 SQL_MODE 转成 UPDATE_TYPE。只有确认事件含义和历史取值后,才能在查询中编写对应转换;不能对所有事件统一使用 COALESCE(CLIENT_IP, OPTION1)。历史列保留不表示所有新日志仍填写这些列。

表索引与查询建议 ​

类型名称字段列表是否唯一
主键PRIMARYLOG_ID是
索引IDX4_LOG_SYS_EVENT_NAMEEVENT_NAME否
索引IDX4_LOG_SYS_USER_IDUSER_ID否
索引IDX4_LOG_SYS_TIMESTART_TIME, END_TIME否
索引IDX4_LOG_SYS_LOG_LEVELLOG_LEVEL否

数据库中的实际索引可能随版本和部署配置不同。TRACE_ID 不是唯一字段,不能将其当作主键。组合索引是否适用于某个查询取决于过滤条件和数据库执行计划,不能仅根据字段出现在索引中就判断一定会使用索引。

查询大量日志时,优先限定时间范围,再增加项目、事件、用户等条件。读取用户或事件名称时使用可保留日志记录的关联方式,例如左连接,避免关联对象已删除导致历史日志被过滤。数据库直连查询使用数据库账号权限,不会自动应用产品页面中的项目访问权限。

微信公众号微信公众号:山川软件