最近忙活了好一阵子,总算把“背影家园”的那个旭东模块的日志系统给捋顺溜了。这玩意儿看着简单,真要抓起来,坑不少。
我只是想让旭东这块业务的数据变动能实时记录下来,方便出问题的时候能回溯。我们这边的业务逻辑挺碎的,很多地方都依赖于旭东模块的几个核心开关和配置的变动。
我最开始的想法是直接在代码里加一堆,然后把输出重定向到一个文件里。写是快,调试起来倒也方便,但很快就发现不对劲了。日志量一下子就上来了,文件写起来贼慢,而且根本没法区分哪个是重要的,哪个是调试信息。
受够了那种原始做法后,我赶紧找了个看起来比较流行的日志框架。我选了那个能在项目里加个几行配置就能跑起来的。刚开始集成还算顺利,日志格式也漂亮了,还能分级别打。

但是,随着业务跑起来,问题又来了。旭东模块的数据是跨多个服务的,一个操作可能涉及A服务修改了数据,B服务感知到了然后做了相应处理。如果只在单个服务里打日志,我根本没法串起来看整个业务流程。
我记得有一次用户反馈一个订单状态搞错了,我查了半天,A服务那边的日志说它处理了,B服务那边日志显示它收到了通知,但是中间断在哪里谁也说不清楚。就是因为日志没有一个全局的ID串起来。
我就动手搞那个MDC(Mapped Diagnostic Context),就是想给每一笔交易打上一个唯一的Trace ID。我找了个入口点,在请求进来的时候就生成一个ID,然后通过日志框架的上下文机制,让后续所有相关的日志都带上这个ID。
这个过程费了不少劲。得确保所有的代码分支、异步回调、定时任务都能正确地继承或传递这个Trace ID。我写了不少小的测试用例来验证。
然后,我还用了一个简单的组件,在关键业务节点上记录操作人和操作内容。我专门写了个切面,把那些重要的服务调用都拦截下来,记录入参和出参的关键信息。
具体操作流程是这样的:
现在回头看,日志系统终于能用了。出问题的时候,我只需要拿着那个Trace ID,就能一下子定位到哪个服务、哪个模块在什么时候干了啥事,效率提升了好几个档次。虽然中间踩了不少坑,但总算把这个“背影家园”的日志看得清楚多了。