2. 日志数据类型:订单日志、交易日志、系统日志、风控日志、审计日志的定义与区别

做高频交易系统,日志这东西,说白了就是你的「黑匣子」。

我见过不少团队,一开始觉得日志嘛,随便打打就行。结果呢?出问题的时候,翻遍所有文件都找不到线索。那种感觉,就像飞机失事了才发现黑匣子没装电池——太要命了。

今天咱们就把高频交易里最常见的五类日志掰开揉碎讲清楚。你想想看,一个订单从客户端发出来,到最终成交,中间要经过多少环节?每个环节都会产生日志,但它们的用途完全不同。

2.1 订单日志:交易的「出生证明」

订单日志记录的是最原始的动作——谁、在什么时间、想买什么、多少钱、多少量。

我个人习惯把订单日志比作「出生证明」。它记录了订单从诞生到消亡的全过程。包括订单的创建、修改、撤销、拒绝等所有状态变更。

核心字段:
  • 订单ID(全局唯一)
  • 客户端ID / 交易员ID
  • 证券代码
  • 买卖方向(买/卖)
  • 订单类型(限价/市价/IOC/FOK等)
  • 价格、数量
  • 时间戳(纳秒级)
  • 状态(新单/部分成交/全部成交/已撤销/已拒绝)

我在项目中遇到过一件事:某次回测结果和实盘差距巨大,查了两天没头绪。后来我翻了订单日志,发现回测系统里订单类型写错了,把IOC写成了FOK。嗯,就这一个字段的差异,导致整个策略失效。从那以后,订单日志的每个字段我都要求做校验。

避坑指南: 我曾经因为订单日志的时间戳精度不够,导致无法准确还原撮合顺序。后来统一改成纳秒级,配合原子钟同步,才彻底解决。记住,在高频交易里,1微秒的误差可能就意味着几万块的损失。

2.2 交易日志:成交的「户口本」

交易日志和订单日志容易搞混,但其实它们分工明确。订单日志管「想做什么」,交易日志管「实际发生了什么」。

说白了,交易日志是交易所撮合引擎返回的成交确认。它记录的是「你的订单在什么时间、以什么价格、成交了多少」。

对比维度 订单日志 交易日志
触发时机 订单生命周期事件 交易所成交回报
数据来源 交易系统内部 交易所/撮合引擎
关键字段 订单状态、价格、数量 成交价、成交量、成交编号
用途 订单状态追踪 资金结算、持仓计算

交易日志还有一个重要功能——对账。每天收盘后,系统会把交易日志和券商/交易所的结算数据做比对。我曾经遇到过一次,因为网络延迟导致成交回报重复发送,交易日志里多了一条记录。要不是对账发现了,那笔虚增的持仓第二天开盘就得爆仓。

2.3 系统日志:系统的「体检报告」

系统日志记录的是基础设施层面的信息。包括进程启动/停止、内存使用率、CPU负载、网络延迟、磁盘IO等。

你可能会问:「这些和交易有什么关系?」关系大了去了。我见过一个案例,某天策略突然频繁报错,查了半天发现是磁盘空间满了,日志写不进去导致系统崩溃。这就是典型的系统日志没监控到位。

注意: 系统日志的级别要区分清楚。DEBUG级别的日志在生产环境一定要关掉,否则每秒几万条的日志量,磁盘根本扛不住。我建议生产环境只保留INFO及以上级别,DEBUG日志通过动态开关控制,只在排查问题时开启。

我个人习惯把系统日志按模块拆分:

  • 硬件层: CPU温度、风扇转速、电源状态
  • 操作系统层: 进程状态、文件描述符、网络连接数
  • 中间件层: 消息队列积压、数据库连接池、缓存命中率
  • 应用层: 线程池状态、GC日志、API调用耗时

2.4 风控日志:系统的「刹车记录」

风控日志,嗯,这个最特殊。它记录的是「系统主动干预」的行为。

为什么特殊?因为其他日志都是被动记录,风控日志是主动触发。当系统检测到异常行为时,风控模块会介入,比如:

  • 单笔订单金额超过阈值
  • 日内累计交易量超标
  • 自成交检测触发
  • 价格偏离市场均价超过N%
  • 撤单率过高

风控日志必须包含「触发原因」和「处置动作」。比如:「自成交检测触发,订单ID=123456,已拒绝」。这样事后审计时,才能说清楚为什么某个订单被拦下来了。

关键点: 风控日志的写入优先级要高于其他日志。我曾经设计过一个系统,风控日志使用独立的日志通道和独立的存储设备。为什么?因为如果系统整体崩溃了,其他日志可能写不进去,但风控日志必须留下来。这是合规的生命线。

2.5 审计日志:合规的「呈堂证供」

审计日志是给监管看的。它记录的是「谁在什么时间、通过什么系统、做了什么操作」。

审计日志和前面几种日志最大的区别在于——它不能修改,不能删除,甚至不能追加。一旦写入,就是只读的。我见过有些团队用普通文件存审计日志,结果运维人员不小心删了,那麻烦就大了。

审计日志通常包含:

  • 用户登录/登出记录
  • 权限变更记录
  • 策略参数修改记录
  • 系统配置变更记录
  • 数据导出/导入记录
  • 管理员操作记录
我的做法: 审计日志我一般用WORM(Write Once Read Many)存储,写入后物理上不可修改。同时做异地备份,防止单点故障。合规检查的时候,直接把存储设备交给监管,他们自己读,省得扯皮。

2.6 五类日志的关系图

下面这张图展示了五类日志在高频交易系统中的位置和关系。你可以看到,订单日志和交易日志是核心业务流,系统日志是基础设施支撑,风控日志是安全屏障,审计日志是合规底线。

高频交易系统五类日志关系图 高频交易系统边界 客户端/交易员 下单 订单管理 订单日志 风控检查 风控引擎 风控日志 发送 交易所/撮合引擎 成交回报 交易管理 交易日志 资金结算 持仓/资金 系统日志 审计日志 订单日志 交易日志 系统日志 风控日志 审计日志

2.7 实际项目中的日志策略

说了这么多理论,来点实际的。我在设计日志系统时,一般遵循这几个原则:

  1. 分类存储: 五类日志分别写入不同的文件或不同的数据库表。千万别混在一起,否则查询效率低到令人发指。
  2. 分级保留: 订单日志和交易日志保留30天,风控日志保留90天,审计日志保留至少5年(监管要求)。系统日志保留7天就够了,除非要排查历史问题。
  3. 独立通道: 风控日志和审计日志使用独立的IO线程和独立的磁盘。这样即使系统负载高,这两类日志也不会被其他日志阻塞。
  4. 实时告警: 风控日志一旦写入,立即触发告警。我见过一个系统,风控日志写进去了,但告警延迟了3秒,结果那3秒内又触发了多次违规操作。
最后提醒一句: 日志不是越多越好。我见过有人把每个函数的入参出参都打日志,结果一天产生几百GB的日志文件,磁盘直接爆了。日志要有目的性——你记录它,是因为将来某个时刻你需要用它来证明什么、排查什么。否则,那就是噪音。

好了,这五类日志的定义和区别,咱们就聊到这儿。记住一句话:日志系统设计得好不好,直接决定了你出问题后能不能快速定位、能不能通过合规检查。别等到火烧眉毛了才想起来补日志,那时候就晚了。