跨端兼容的智能日志分类模型:一训全端精准归类
|
文章配图,仅供参考 去年八月份那会儿,我被拉去救火一个日志分类的破事儿——前端、后端、移动端,各写各的日志格式,运维组的老王天天在群里骂“这他妈谁写的日志?error和warn混着来,时间戳还带时区偏移,分类模型能分对才有鬼了”。我原以为得给每个端单独训模型,结果产品经理拍着桌子说“排期就两周,必须一训全端,否则告警风暴能把你们淹了”。那天下午三点,我盯着屏幕上的日志样本,前端是JSON但字段名带下划线,后端是纯文本用空格分隔,移动端更绝,直接塞了段base64编码的二进制——这他妈怎么统一?正骂着,工单系统“叮”地弹了条消息,又是前端说“分类模型把我们的警告全标成错误了,用户看到要投诉”。我抓起咖啡猛灌一口,发现已经凉透了,顺手倒进绿萝盆里,叶子都蔫了。 其实最头疼的不是格式,是语义。比如前端写“API调用超时”,后端可能写“请求超时未响应”,移动端更简单,直接“timeout”——这三个日志在业务上是一个意思,但模型得把它们归到“超时类”。我试了用BERT做文本相似度,结果移动端的“timeout”被分到“网络错误”,因为训练集里“timeout”和“network error”经常一起出现。前端小李在群里阴阳怪气:“你们模型是不是没学过移动端日志?这都能分错?” 后来我想了个损招:优胜劣汰。先把所有日志扔进一个池子,用TF-IDF抽特征,再跑个聚类——不管你是前端、后端还是移动端,只要语义相近就聚成一类。比如“超时”相关的日志,不管格式是JSON还是文本,也不管字段名是“timeout”还是“超时时间”,都会被聚到同一个簇里。然后我让模型只学这些簇的标签,而不是学原始日志的格式。说白了,就是让模型自己“淘汰”那些干扰项,比如移动端的base64编码——反正聚类的时候它会被单独扔到一边,不影响其他日志的分类。 但问题又来了:聚类结果不稳定。有时候“超时”和“网络错误”会被聚到同一个簇,有时候又分开。我查了半天,发现是数据量的问题——移动端的日志量只有后端的十分之一,聚类时容易被“淹没”。于是我又加了层权重:日志量少的端,在聚类时特征值乘以1.5。这招挺管用,移动端的“timeout”终于能稳定聚到“超时”簇里了。不过前端小李又跳出来:“你们这是作弊!模型根本没理解语义,只是靠权重硬拉!”我回他:“要不你来写?排期就两周,能分对就不错了。” 手机亮了一下,是测试组的老张发的消息:“新模型在预发环境跑了半天,分类准确率从72%涨到89%了。”我松了口气,转头看见后端老王在敲键盘,声音特别响——他总说机械键盘手感好,可吵得我头疼。窗外天黑了,工位上的台灯照着屏幕,反射的光里能看到几根白头发——我他妈才三十五啊。 其实到现在我也没完全搞懂,为什么优胜劣汰这招能奏效。按理说,不同端的日志格式差异那么大,模型应该学不会才对。可跑了大半年,除了偶尔把移动端的“内存不足”分到“存储错误”(因为训练集里“内存”和“存储”经常一起出现),其他时候都挺准。我怀疑是聚类时把语义相近的日志“强制”归到了一起,模型只需要学这些簇的标签,不用管原始格式——就像考试时,你不用懂所有知识点,只要记住老师划的重点就行。 不过最近又出幺蛾子了:新上的IoT设备日志,格式是二进制加自定义协议,完全没法用TF-IDF抽特征。我试了把二进制转成十六进制字符串,再跑聚类,结果模型把所有IoT日志都归到“未知类”——因为十六进制里全是0-9和a-f,语义完全丢失了。现在正跟硬件组扯皮,让他们改日志格式,可他们说“硬件已经量产了,改不了”。我他妈真想辞职——这破活,谁爱干谁干。 下一步打算试试把二进制日志解码成结构化数据,再跑优胜劣汰的模型。但硬件组的协议文档写得跟天书似的,我看了半天没细看,直接跳到最后看示例——结果示例里的字段名和文档里对不上。算了,明天找他们喝茶,慢慢磨吧。反正这模型能撑到现在,已经超出我预期了。 (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |

