3

我被分配了一项任务,我需要检测给定的应用程序并生成一个跟踪文件,然后从跟踪文件中生成一个序列图。该应用程序是用 python 编写的。该应用程序在方法启动和退出的地方进行了检测。

我的主要目的是找到跟踪文件中的重复模式?

以下是跟踪文件的示例

Entering    get_instance    None    []  None    10:25:30:743000
Entering    __init__    ConfigHandler   ['config_filepath'] 56663624    10:25:30:743000
Entering    _load_config    ConfigHandler   ['path']    56663624    10:25:30:744000
Exited  _load_config    ConfigHandler   True    56663624    10:25:30:746000
Exited  __init__    ConfigHandler   None    56663624    10:25:30:747000
Exited  get_instance    None    <commons.ConfigHandler.ConfigHandler object at 0x0000000003609E48>  None    10:25:30:747000
Entering    __init__    ColumnConverter []  56963312    10:25:30:769000
Exited  __init__    ColumnConverter None    56963312    10:25:30:769000
Entering    __init__    PredicatesFactory   []  56963424    10:25:30:769000
Exited  __init__    PredicatesFactory   None    56963424    10:25:30:769000
Entering    __init__    LogFileConverter    []  56963536    10:25:30:769000
Exited  __init__    LogFileConverter    None    56963536    10:25:30:769000

如何在跟踪文件中查找重复模式?

我的主要目的是找到跟踪文件中的重复模式?

4

3 回答 3

3

您可以使用 PrefixSpan 算法来查找顺序规则。

论文:

http://www.cs.uiuc.edu/~hanj/pdf/span01.pdf

该站点具有开源 Java 代码,您可以从以下方面获得灵感:

http://www.philippe-fournier-viger.com/spmf/index.php?link=documentation.php#examplePrefixSpan

于 2013-04-16T06:30:31.353 回答
0

考虑检查正则表达式以查找模式。

例如,要匹配这样的行:

Exited  __init__    LogFileConverter    None    56963536    10:25:30:769000

您可以使用以下正则表达式模式:

>>> import re
>>> pattern = re.compile('Exited  __init__\s+(\w+)\s+(.*?)\s+(\d+)\s+(\d+:\d+:\d+\d+)')
>>> matches = re.findall(pattern, text)

通过一些修改,您应该能够找到重复的模式。

于 2013-04-15T14:26:11.043 回答
0

如果您想在前两个字段中查找重复,您可以将它们用作字典键并使用所有匹配行的列表填充它。当您处理了整个文件时,那些包含多个元素列表的字典条目是重复的。

#!/usr/bin/env python

import fileinput

def read (line, d=dict()):
    tokens = line.split()
    key = ' '.join(tokens[0:2])
    try:
        d[key].append(line)
    except KeyError:
        d[key] = [line]in v:
    return d

def main ():
    d = dict()
    for line in fileinput.input():
        read(line, d)
    for k  in d:
        v = d[k]
        if len(v) > 1:
            # print "### %s => %s" % (k, v)   for debugging
            for l in v:
                print l,

if __name__ == '__main__':
    main()

示例输出(启用了调试打印,因此您可以了解它打印这些输出的原因):

### Exited __init__ => ['Exited  __init__    ConfigHandler   None    56663624    10:25:30:747000\n', 'Exited  __init__    ColumnConverter None    56963312    10:25:30:769000\n', 'Exited  __init__    PredicatesFactory   None    56963424    10:25:30:769000\n', 'Exited  __init__    LogFileConverter    None    56963536    10:25:30:769000\n']
Exited  __init__    ConfigHandler   None    56663624    10:25:30:747000
Exited  __init__    ColumnConverter None    56963312    10:25:30:769000
Exited  __init__    PredicatesFactory   None    56963424    10:25:30:769000
Exited  __init__    LogFileConverter    None    56963536    10:25:30:769000
### Entering __init__ => ["Entering    __init__    ConfigHandler   ['config_filepath'] 56663624    10:25:30:743000\n", 'Entering    __init__    ColumnConverter []  56963312    10:25:30:769000\n', 'Entering    __init__    PredicatesFactory   []  56963424    10:25:30:769000\n', 'Entering    __init__    LogFileConverter    []  56963536    10:25:30:769000\n']
Entering    __init__    ConfigHandler   ['config_filepath'] 56663624    10:25:30:743000
Entering    __init__    ColumnConverter []  56963312    10:25:30:769000
Entering    __init__    PredicatesFactory   []  56963424    10:25:30:769000
Entering    __init__    LogFileConverter    []  56963536    10:25:30:769000
于 2013-04-15T15:49:46.000 回答