Python正则处理多行日志一例

假设现在有这样的SQL日志:

SELECT * FROM open_app WHERE 1 and `client_id` = ‘a08f5e32909cc9418f‘ and `is_valid` = ‘1‘ order by id desc limit 32700,100;
# Time: 160616 10:05:10
# [email protected]: shuqin[qqqq] @  [1.1.1.1]  Id: 46765069
# Schema: db_xxx  Last_errno: 0  Killed: 0
# Query_time: 0.561383  Lock_time: 0.000048  Rows_sent: 100  Rows_examined: 191166  Rows_affected: 0
# Bytes_sent: 14653
SET timestamp=1466042710;
SELECT * FROM open_app WHERE 1 and `client_id` = ‘a08f5e32909cc9418f‘ and `is_valid` = ‘1‘ order by id desc limit 36700,100;
# [email protected]: shuqin[ssss] @  [2.2.2.2]  Id: 46765069
# Schema: db_yyy  Last_errno: 0  Killed: 0
# Query_time: 0.501094  Lock_time: 0.000042  Rows_sent: 100  Rows_examined: 192966  Rows_affected: 0
# Bytes_sent: 14966
SET timestamp=1466042727;

要求从中解析出相应的信息, Python 程序:

import re

globalRegex = r‘^\s*(.*?)# ([email protected]:.*?)# (Schema:.*?)# (Query_time:.*?)# Bytes_sent:(.*?)SET timestamp=(\d+);\s*$‘
costRegex = r‘Query_time:\s*(.*)\s*Lock_time:\s*(.*)\s*Rows_sent:\s*(\d+)\s*Rows_examined:\s*(\d+)\s*Rows_affected:\s*(\d+)\s*‘
schemaRegex = r‘Schema:\s*(.*)\s*Last_errno:(.*)\s*Killed:\s*(.*)\s*‘

def readSlowSqlFile(slowSqlFilename):
    f = open(slowSqlFilename)
    ftext = ‘‘
    for line in f:
         ftext += line
    f.close()
    return ftext

def findInText(regex, text):
    return re.findall(regex, text, flags=re.DOTALL+re.MULTILINE)

def parseSql(sqlobj, sqlText):
    try:
        if sqlText.find(‘#‘) != -1:
            sqlobj[‘sql‘] = sqlText.split(‘#‘)[0].strip()
            sqlobj[‘time‘] = sqlText.split(‘#‘)[1].strip()
        else:
            sqlobj[‘sql‘] = sqlText.strip()
            sqlobj[‘time‘] = ‘‘
    except:
        sqlobj[‘sql‘] = sqlText.strip()

def parseCost(sqlobj, costText):
    matched = re.match(costRegex, costText)
    sqlobj[‘Cost‘] = costText
    if matched:
        sqlobj[‘QueryTime‘] = matched.group(1).strip()
        sqlobj[‘LockTime‘] = matched.group(2).strip()
        sqlobj[‘RowsSent‘] = int(matched.group(3))
        sqlobj[‘RowsExamined‘] = int(matched.group(4))
        sqlobj[‘RowsAffected‘] = int(matched.group(5))

def parseSchema(sqlobj, schemaText):
    matched = re.match(schemaRegex, schemaText)
    sqlobj[‘Schema‘] = schemaText
    if matched:
        sqlobj[‘Schema‘] = matched.group(1).strip()
        sqlobj[‘LastErrno‘] = int(matched.group(2))
        sqlobj[‘Killed‘] = int(matched.group(3))

def parseSQLObj(matched):
    sqlobj = {}
    try:
        if matched and len(matched) > 0:
            parseSql(sqlobj, matched[0].strip())
            sqlobj[‘UserHost‘] = matched[1].strip()
            sqlobj[‘ByteSent‘] = int(matched[4])
            sqlobj[‘timestamp‘] = int(matched[5])
            parseCost(sqlobj, matched[3].strip())
            parseSchema(sqlobj, matched[2].strip())
            return sqlobj
    except:
        return sqlobj

if __name__ == ‘__main__‘:

    files = [‘slow_sqls.txt‘]

    alltext = ‘‘
    for f in files:
        text = readSlowSqlFile(f)
        alltext += text
    allmatched = findInText(globalRegex, alltext)

    tablenames = [‘open_app‘]

    if not allmatched or len(allmatched) == 0:
        print ‘No matched. exit.‘
        exit(1)

    sqlobjMap = {}
    for matched in allmatched:
        sqlobj = parseSQLObj(matched)
        if len(sqlobj) == 0:
            continue
        for tablename in tablenames:
            if sqlobj[‘sql‘].find(tablename) != -1:
                 if not sqlobjMap.get(tablename):
                     sqlobjMap[tablename] = []
                 sqlobjMap[tablename].append(sqlobj)
                 break

    resultMap = {}
    for (tablename, sqlobjlist) in sqlobjMap.iteritems():
        sqlstat = {}
        for sqlobj in sqlobjlist:
            if sqlobj[‘sql‘] not in sqlstat:
                sqlstat[sqlobj[‘sql‘]] = 0
            sqlstat[sqlobj[‘sql‘]] += 1
        resultMap[tablename] = sqlstat

    f_res = open(‘/tmp/res.txt‘, ‘w‘)
    f_res.write(‘-------------------------------------: \n‘)
    f_res.write(‘Bref results: \n‘)
    for (tablename, sqlstat) in resultMap.iteritems():
        f_res.write(‘tablename: ‘ + tablename + ‘\n‘)
        sortedsqlstat = sorted(sqlstat.iteritems(), key=lambda d:d[1], reverse = True)
        for sortedsql in sortedsqlstat:
            f_res.write(‘sql = %s\ncounts: %d\n\n‘ % (sortedsql[0], sortedsql[1]))
    f_res.write(‘-------------------------------------: \n\n‘)

    f_res.write(‘-------------------------------------: \n‘)
    f_res.write(‘Detail results: \n‘)
    for (tablename, sqlobjlist) in sqlobjMap.iteritems():
        f_res.write(‘tablename: ‘ + tablename + ‘\n‘)
        f_res.write(‘sqlinfo: \n‘)
        for sqlobj in sqlobjlist:
            f_res.write(‘sql: ‘ + sqlobj[‘sql‘] + ‘ QueryTime: ‘ + str(sqlobj.get(‘QueryTime‘)) + ‘ LockTime: ‘ + str(sqlobj.get(‘LockTime‘)) + ‘\n‘)
            f_res.write(str(sqlobj) + ‘\n\n‘)
    f_res.write(‘-------------------------------------: \n‘)
    f_res.close()
时间: 2024-09-29 21:03:48

Python正则处理多行日志一例的相关文章

【Python】[技术博客] 一些使用Python编写获取手机App日志的操作

一些使用Python编写获取手机App日志的操作 如何获取手机当前打开的App的包名 如何获取当前App进程的PID 如何查看当前App的日志 如何将日志保存到文件 如何关闭进程 如何不显示命令行窗口 1.如何获取手机当前打开的App的包名 可以直接在命令行中输入adb shell dumpsys window | findstr mCurrentFocus 以手机QQ为例,读取到的mCurrentFocus的信息为 mCurrentFocus=Window{cb7270e u0 com.ten

python 正则模块的使用(re)说明

python 正则模块的使用(re)说明 正则表达式使用反斜杆(\)来转义特殊字符,使其可以匹配字符本身,而不是指定其他特殊的含义.这可能会和python字面意义上的字符串转义相冲突,这也许有些令人费解.比如,要匹配一个反斜杆本身,你也许要用'\\\\'来做为正则表达式的字符串,因为正则表达式要是\\,而字符串里,每个反斜杆都要写成\\. 你也可以在字符串前加上 r 这个前缀来避免部分疑惑,因为 r 开头的python字符串是 raw 字符串,所以里面的所有字符都不会被转义,比如r'\n'这个字

Python正则匹配字母大小写不敏感在读xml中的应用

需要解决的问题:要匹配字符串,字符串中字母的大小写不确定,如何匹配? 问题出现之前是使用字符串比较的方式,比如要匹配'abc',则用语句: 1 if s == 'abc':#s为需要匹配的字符串 2 print '匹配成功\n' 现在的问题是s可能是Abc.ABC等等,所以需要大小写不敏感的匹配,如果把需要匹配的模式的大小写进行罗列,那即使是三个字母的短模式也是很麻烦,查了一下,正则表达式re模块中有个参数flags=re.I,这样就可以大小写不敏感的匹配了,示例如下: 1 import re

命令行日志输出

在linux中运行命令行时,会输出一些日志信息,特别典型的是启用WebLogic命令时,输出一些信息,当启用demon模式运行时,又想收集这些信息咋办? 解决的办法就是使用输出重定向,如下面的命令: nohup ./startWebLogic.sh  >  app.log    2>&1     & 这是什么意思呢? 其中app.log是保存输出的文件名称: 2>&1 表示不仅命令行正常的输出保存到app.log中,产生错误信息的输出也保存到app.log文件中:

Python 全栈开发八 日志模块

日志是一种可以追踪某些软件运行时所发生事件的方法.软件开发人员可以向他们的代码中调用日志记录相关的方法来表明发生了某些事情.一个事件可以用一个可包含可选变量数据的消息来描述.此外,事件也有重要性的概念,这个重要性也可以被称为严重性级别(level). 1.日志的作用 通过log的分析,可以方便用户了解系统或软件.应用的运行情况:如果你的应用log足够丰富,也可以分析以往用户的操作行为.类型喜好.地域分布或其他更多信息:如果一个应用的log同时也分了多个级别,那么可以很轻易地分析得到该应用的健康状

多行日志合并处理的内外存方法

上一讲中,我们介绍了如何用SPL将一行日志结构化为一条记录,今天则要说一下多行日志对应一条记录的情况,我们称之为不定行日志. 事实上,集算器自己的输出日志就是这种不定行日志,我们来看一下集算器节点机下的一个日志文件rqlog. log,同样摘录两段日志: [2018-05-14 09:20:20] DEBUG: 临时文件过期时间为:12小时. [2018-05-14 09:20:20] DEBUG: Temporary file directory is: D:\temp\esProc\node

python正则非贪婪模式

上一篇python正则匹配次数大家应该也发现了,除了?其他匹配次数规则都是尽可能多的匹配 那如果只想匹配1次怎么办呢,这就是正则中非贪婪模式的概念了 原理就是利用?与其他匹配次数规则进行组合 +?  *?  {m,n}?等就暂不举例了

python 提交SVN 写更新日志

SCENE = "mjdy_dyhry" DIRS = { "md5/scenes/" + SCENE, "data/tex/scenes/" + SCENE, "data/tex/share", "data/mesh/scenes/" + SCENE, } import os WORKSPACE = "D:/workspace/muData/"#os.getcwd()+ # execu

python海明距离 - 5IVI4I_I_60Y的日志 - 网易博客

python海明距离 - 5IVI4I_I_60Y的日志 - 网易博客 python海明距离 2009-10-01 09:50:41|  分类: Python |  标签: |举报 |字号大中小 订阅 def hammingDist(s1, s2):    assert len(s1) == len(s2)    return sum([ch1 != ch2 for ch1, ch2 in zip(s1, s2)])python海明距离 - 5IVI4I_I_60Y的日志 - 网易博客,布布扣,