日志记录了软件系统运行时的详细信息,系统开发与运维人员可以根据日志监控系统剖析系统的异常行为与错误。日志异常检测可以分为语义异常(执行结果)、执行异常(执行日志序列)与性能异常(执行时间)。
1.日志异常类型
日志记录系统在某个时间点执行了某些操作以及相应操作的结果。
可以对异常类型进行大致分类,如网络异常、数据库异常、硬件异常、I/O异常、操作系统异常等。每一个类型又可以进行细分,以硬件异常为例,可能存在CPU异常、磁盘空间不足、磁盘损坏等硬件上的异常。
自动判断日志异常类型的前提是制定统一的日志异常类型说明标准、各类别中的细分类与特征。
2.日志与自然语言文本的区别
基于语义异常的日志分析方法首先对日志进行向量化表示。
日志与自然语言文本有所不同:
(1)日志为半结构化文本,日志通常包括日志头与日志描述信息,日志头中经常包含时间戳、来源、日志等级等字段;日志描述信息中包含对当前操作与对应结果的描述,语义信息丰富;
(2)日志中存在大量重复,在日志描述信息中包含常量信息与变量值,往往将变量值作为参数符号化后,大量日志可以压缩为一个日志模板;
(3)日志中包含大量驼峰格式的连写字符串,这与不同编程语言的函数、类等命名格式有关
(4)成熟的系统 / 中间件的日志数据中包含的词汇量较小。
3.日志的向量化
日志的向量化表示需要考虑以下问题:
(1)日志向量化之前需要提取日志描述字段,对日志描述字段进行初始化;
(2)日志中的变量值通常为无意义的数值或者不同的ip、url、path等,需要对变量值替换;
(3)日志特殊的写法需要制定新的规则对日志进行分词
(4)日志重复量越大且越成熟的系统,格式与描述越一致,导致日志有效词汇量少,后续会出现OOV问题,需要结合日志数据与通用数据进行向量化训练。
一种基于语义异常的日志分析方法
数据预处理:将原始日志数据处理为算法要求的标准输入数据,包括:命名实体识别、分词、过滤、大小写转换、向量化等。
命名实体识别需要对timestamp,url,ip,file,path,number,email等日志中经常出现的实体进行识别;
分词需要考虑日志中常见的驼峰表达式;
在日志向量化过程中,利用通用语料(wikidata)+系统/中间件日志语料+业务日志语料训练词向量,最终,词向量维度为200维,词库大小为583511。
日志来源检测:针对不同来源的日志进行分析,总结其日志格式,并提取正则表达式,为每一个来源的日志构建日志格式,根据日志格式检测日志来源。
基于规则的日志来源检测方法,针对不同来源组件的日志进行测试,每个组件日志各选择10000条日志进行测试,准确率达99.94%。针对成熟的系统/中间组件,构建规则进行来源检测可以达到极高的准确率。
日志分类模型:
可利用日志中包含的日志等级字段,如debug,info,warning,error等,对日志进行分类,通常会存在两个问题:
(1)有些系统/业务日志中并不包含日志等级字段,
(2)有些系统/业务日志中,日志等级字段标注不准确,或者将异常情况发生时的相关状态或情况标注为“error”等,实际上这类日志语义上并不包含错误信息。
首先对错误日志与异常日志进行区分:
异常日志:发生异常时打印的日志,可能仅为异常发生时的某个状态或情况说明,本身并不包含错误信息;
错误日志:语义中包含错误信息的日志。
本文中将日志分为正常日志与错误日志,即根据日志的语义信息将日志进行分类。
首先构造数据集:采集系统/中间件日志、业务日志,提取日志模式并进行去重,采用人工标注的方式标注数据集,抽取正常日志8926条,错误日志4051条进行实验。
利用传统机器学习中的二分类算法如svm,集成学习算法随机森林,深度学习的bert分别进行实验
异常分类模型:
(1)异常类型分类
将日志中包含的异常类型分为:文件/文件夹操作异常、网络异常、数据库异常、硬件异常、系统异常和其他异常6类。每一类中分别包含多个细分类异常,如文件/文件夹操作异常中包含文件或目录不存在、文件或目录无访问权限、读/写文件失败、其他IO异常等。
实验数据集:数据异常类型及细分类数据集存在类别不平衡且某些细分类中没有数据的情况,
因此采用粗分类进行异常类型分类实验,将日志异常类型分为6类:文件/文件夹操作异常、网络异常、数据库异常、硬件异常、系统异常、其他异常。