Computer Science and Application 计算机科学与应用, 2020, 10(1), 98-111
Published Online January 2020 in Hans. /journal/csa
/10.12677/csa.2020.101011
A System Log Parsing Algorithm Based
on Cluster Algorithm
Wenjun Huo
Department of Computer Science and Technology, Tongji University, Shanghai
Received: Dec. 26th, 2019; accepted: Jan. 10th, 2020; published: Jan. 17th, 2020
Abstract
System log is an important source of checking system status in software system. The runtime sta-tus report and error information contained in system log are widely used in system operation and maintenance. With the current software system becoming increasingly large and complex, large-scale software systems usually use log analysis mining technology to automatically mine key system information from the system log. Log data is used in anomaly detection, root analysis, be-havior analysis and other applications. Log data is usually unstructured text data. Before using data mining algorithm to train the log data, we need to use log parsing algorithm to process the original log data structurally. According to the characteristics and requirements of log data analy-sis and mining technology, this paper proposes a log parsing algorithm based on clustering algo-rithm, which can analyze the original log data from the number of original logs. A fixed depth tree structure model is also proposed to store the message template to realize the fast structure of new log messages and the detection of abnormal log messages. Through the experiments on the specif-ic system log data, it is proved that the log parsing algorithm in this paper has high accuracy and generality.
Keywords
System Log, Log Parsing, Anomaly Detection
一种基于聚类的系统日志解析算法
霍文君
同济大学计算机科学与技术系,上海
收稿日期:2019年12月26日;录用日期:2020年1月10日;发布日期:2020年1月17日
霍文君
系统日志是软件系统中检查系统状态的重要来源,系统日志中包含的运行时状态报告以及错误信息被广泛地用于系统运维中。随着现阶段软件系统变得日益庞大和复杂,大型软件系统通常会使用日志分析挖掘技术来自动地从系统日志中发掘系统关键信息,日志数据被用于异常检测、根因分析、行为分析等等应用中。日志数据通常是无结构化的文本数据,在使用数据挖掘算法对日志数据进行训练之前,需要使用日志解析算法对原始日志数据进行结构化处理,本文根据日志数据分析挖掘技术的特点和需求,提出一种基于聚类算法的日志解析算法,可以从原始日志数据中提取消息模板和事件序列,同时提出了一种固定深度的树结构模型对消息模板进行存储以实现新日志消息的快速结构化和异常日志消息的检测。通过在特定系统日志数据上的实验证明本文的日志解析算法具有较高的准确性和通用性。
关键词
系统日志,日志解析,聚类,异常检测
Copyright © 2020 by author(s) and Hans Publishers Inc.
This work is licensed under the Creative Commons Attribution International License (CC BY).
正则匹配时间戳/licenses/by/4.0/
1. 引言
系统日志是在系统实时运行时记录软硬件问题的文本信息,系统日志可以被用来监视系统运行时发生的事件信息,比方说事件的时间戳、一个请求的IP 地址或者一个异常任务的状态[1]。系统日志蕴含的丰富信息可以帮助系统开发人员和维护人员更好地理解系统行为并在生产过程中检测和定位系统异常[2]。除此以外,对系统日志的分析和挖掘技术也被应用于金融和政府机构中,比方说,交易系统日志被用来进行异常交易的检测,电力系统日志被用来进行安全隐患的查。
随着现阶段软件系统规模和复杂度的日益增加,系统日志规模也变得更加庞大,大型软件系统会按照每小时10 gb 的速度产生日志。传统的人工方式对这些日志信息进行分析是非常不切实际的,因此,全自动的基于日志数据的分析挖掘技术是迫切需要的。比较典型的日志挖掘技术包括异常检测[3] [4] [5]、行为分析、程序验证[6]、根因分析[7] [8]等等。另外,由于现阶段算法和算力的发展,越来越多的开发人员选择使用机器学习和深度学习技术进行日志挖掘[9] [10]。然而,由于开发人员在记录系统日志为了简单和方便会使用简单文本,因此系统日志通常是无结构的文本数据,在使用数据挖掘算法对系统日志建立模型训练之前,需要使用日志解析算法将原始的日志数据结构化[11]。
Figure 1. A typical log
图1. 一条典型的日志
一条典型的日志,如图1所示,记录了一件特定的系统事件,包括多个部分:时间戳(记录了事件发生的具体时间),源IP 地址和目的IP 地址,以及原始的消息内容[4]。日志解析技术一般是针对日志事件中的消息部分,即图1中的“GET/api/saved_objects/…200 6 ms -9.0B src: 172.23.2.176 dest: 111.187.17.115”。Dec 27, 2019 @ 15:19:08.000 G
ET /api/saved_objects/_find?type=index-
pattern&per_page=10000&page=1&default_search_operator=OR 200 6ms -
9.0B src: 172.23.2.176 dest: 111.187.17.115
霍文君
消息部分通常可以分为常量部分和变量部分,常量部分是固定不变的文本内容,通常定义了一个消息模板的事件类型,变量部分显示了系统的运行时信息,比方说状态的值和参数(IP 地址、持续时间、文件路径等等),变量部分在不同的日志中会有不同的值。日志解析算法的目标是自动化地从日志消息部分中提取常量部分和变量部分,并将每一条日志转化为一个特定的事件,比方说图1所示例子中的常量部分为“GET * * -9.0B src: * dest: *”,变量部分我们用通配符替代,常量部分就代表了一个特定的事件。在本文中我们使用消息模板/事件类型来指消息部分中的常量部分。
日志解析技术是日志挖掘的关键一环。传统的日志解析算法包括正则表达式匹配[12]、基于源代码的方式,或者基于规则式的方式[13]。现代软件系统的迭代和发展速度过于迅速,一般系统中定义日志消息的源代码很难获得,并且日志的规则需要对系统非常熟悉的专业人士来制订,当系统发生变化时,规则也需要同时发生改变,这是比较费时费力的,因此传统的日志解析算法并不能适用于现在的软件日志系统。
一般来说,日志消息的常量部分是由系统中定义日志输出的代码决定的,通常同一条消息模板产生的日志消息都非常相
似。聚类算法的思想即是通过比较实例之间的距离,并将相似的实例聚为一类,本文利用这种思想,提出了一种基于聚类的日志解析算法,并使用一种固定深度的树结构模型来存储消息模板,以实现对新的日志消息快速解析和异常日志的检测。
本文的组织如下:第二部分本文将会给出相关学术工作以及符号定义,第三部分介绍一种基于聚类的日志提取算法,第四部分给出本文实验在特定系统日志数据上的实验结果,第五部分为总结与展望。
2. 问题描述与相关工作
2.1. 问题描述
系统日志一般是独立的文本数据,文本内容记录了系统中发生的事件,包括消息部分和一些事件属性,事件属性包括时间戳、消息级别等等。消息部分时由源代码定义的,比方说下面的一行代码:
(),  %  %, , ;printf message Connection from s port d ipaddress portnumber
可以产生下面的日志消息:
192.168.10.6  25.
192.168.10.6  80.
192.168.10.7  25.
192.168.10.8  21.Connection from port Connection from port Connection from port Connection from port
这些消息可以形成一个消息模板/事件类型,将其中的变量部分用通配符表示,则该条消息模板可以表示为:
*  *.Connection from port
大部分情况下,一条消息模板对应一条打印语句,日志解析就是从大量的原始日志数据中提取消息模板,这样一条日志就对应一个事件类型,按照时间顺序排列即得到事件序列。
图2展示了一个日志解析工具的主要功能,其中原始日志数据来源与在线实训平台功夫编程kf-coding ,由图2可知,原始的系统日志是非结构的,每一条日志都包含时间戳、类别、消息内容,真实情形下,系统在一天中会产生成千上万条类似这样的日志信息,日志解析将会读取原始日志消息并生成消息模板和事件序列。
2.2. 相关工作
日志解析对日志挖掘非常重要,传统的日志解析技术使用正则表达式匹配来提取日志事件(SEC [14])。
霍文君
Figure 2. Main functions of a log parsing tool
图2. 日志解析工具的主要功能
但是现代的软件系统规模和复杂性都越来越大,生成的日志也越来越多,人工制订正则表达式的规则是不切实际的。针对这种现象,现代的研究者提出了基于数据的自动化日志解析算法,这些算法使用历史日志数据建立统计模型来进行事件提取。
比较典型的基于数据的日志解析方法可以大致分为两类:基于聚类方法的和基于启发式的。对于基于聚类方法的日志解析算法,首先会计算日志间的距离,接着使用聚类方法将日志聚成不同的簇,最后从这些簇中生成事件模板。对于基于启发式的方法,首先会统计每个单词在每个日志位置上出现的次数,接着,频繁出现的单词被选为候选,从这些候选中选择单词作为日志事件。我们在这里介绍三种典型的基于数据的自动化的日志解析方法。
Risto Vaarandi等[15] [16]在2003年提出了SLCT (Simple Log Clustering Tool),一种自动的日志解析技术,同时开源了相应的日志解析工具。SLCT之后被广泛地用来进行日志挖掘任务,比方说事件日志挖掘,系统问题根因分析和网络预警分类。受关联规则挖掘算法的启发,SLCT会对日志消息进行两次扫描,并且包含三个步骤:1) 建立单词字典,第一次对日志进行扫描并建立包含每个单词频率和坐标的字典;
2) 建立日志簇,在第一步建立的字典上第二次扫描日志并建立日志簇;3) 生成日志模板,从第二步中建立的日志簇中选取包含有足够日志信息的日志簇,每一个簇可以生成一个日志模板,余下的日志簇被视为异常簇。
IPLoM (Iterative Partitioning Log Mining) [17]是一种基于系统消息特点设计的生成式方法,也被用于很多的日志挖掘方法,比方说预警检测,事件日志分析和事件摘要。在生成事件模板之前,IPLoM会首先进行三次启发式划分过程:1) 通过日志消息的不同长度进行划分;2) 基于标记位置进行划分于每一次划分,不同位置的单词都会统计次数,接着拥有最少变化单词的位置将用来对日志消息进行划分;3) 基于映射的划分,通过单独的标记集合在两个标记位置之间的映射关系对簇进行划分;4) 日志模板生成,类似于SLCT,最后一步是从每个簇中生成日志模板。
LogSig [18]是一种比较新的日志解析方法,包含三个过程:1) 生成单词对,每一个日志消息会被转化为一系列的单词对,单词对包括单词本身和它的位置信息;2) 日志聚类;根据单词对,对每一个日志消息计算一个度量值来决定该条日志消息属于哪一个簇,经过若干轮的迭代,日志消息就会被聚成几类;
3) 日志模板生成,在每一个簇中,通过对日志消息的提取生成日志模板。
霍文君
2.3. 符号定义
我们在这个小节给出基于聚类的日志解析算法的相关符号定义。
Figure 3. Log tagging
图3. 日志标注
定义1:事件日志:定义事件日志为记录系统内发生的事件或对应用程序跟踪记录的文本。
定义2:事件:事件为事件日志中一行独立的文本,详细地说明了系统或应用程序发生的一次事件。 定义3:消息:消息是指事件中除去时间戳、类型、标签等信息,只记录具体事件信息的文本序列。 一个事件通常不仅仅包含一个消息,还有其他信息包括日期,源和标签等。对于消息模板/事件类型提取,我们只关心事件中的消息部分,如图3所示的事件文本中,invalid SNAN..0为消息部分。
定义4:标记:消息部分中被分隔符划分的独立的单词为标记。一般情况下,分隔符为空格。 定义5:消息长度:消息部分中标记的个数。
定义6:消息模板/事件类型:消息模板是指由同一条print 语句生成的事件日志中的消息字段。由于确定消息模板具有一定的主观性,人类可能会将一个消息模板生成的事件视为由不同的消息模板产生,或者将由不同的打印语句产生的事件视为由同一个消息模板产生。同样的print 语句也可能出现在代码的不同部分,从而产生具有相同消息模板的不同事件。但是,在这里我们认为这些情况相对较少,因此为了简单起见,我们就使用这样的定义。
Figure 4. Message template description example
图4. 消息模板描述示例
定义7:消息模板描述:我们定义消息模板描述为可以表示消息模板所有成员的包含通配符的文本模板。如图4所示,一般一条消息模板描述对应着一条打印日志语句。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。