通过分析python/pandas for web scale应用程序中的服务器日志了解错误频率

通过分析python/pandas for web scale应用程序中的服务器日志了解错误频率,python,pandas,server,Python,Pandas,Server,我正在运行一个web规模的应用程序,希望了解用户遇到的错误。服务器日志捕获应用程序错误。我想将日志解析为一个数据帧,了解前x个错误,然后按天(绝对频率和相对频率)绘制前x个错误 第一步是解析日志并将其加载到数据帧中。原始日志文件如下所示: [2017-06-20T12:57:56.549-04:00][nexteesadf_server1][WARNING][ADF_FACES-60099][oracle.adfinternal.view.FACES.renderkit.rich.Region

我正在运行一个web规模的应用程序,希望了解用户遇到的错误。服务器日志捕获应用程序错误。我想将日志解析为一个数据帧,了解前x个错误,然后按天(绝对频率和相对频率)绘制前x个错误

第一步是解析日志并将其加载到数据帧中。原始日志文件如下所示:

[2017-06-20T12:57:56.549-04:00][nexteesadf_server1][WARNING][ADF_FACES-60099][oracle.adfinternal.view.FACES.renderkit.rich.RegionRenderer][tid:[ACTIVE].ExecuteThread:'2'队列:'weblogic.kernel.Default self-tuning'][userId:test@test.com][ecid:005KaSb9zIX4ulMpMK4Eye0000xO00zuxf,0:1][应用程序:NetApp_应用程序1.ear66.1254][DSID:0000Ln6ErTF4mnMpMKL6ie1PHmGo00045R][URI:/netapp/faces/pages/submission/submission.jspx]id为pt1:pt_r1的区域组件检测到包含多个根组件的页面片段。包含多个根组件的片段可能无法在区域中正确显示,并且可能会对性能产生负面影响。建议您将页面片段重新构造为具有单个根组件。 [2017-06-20T12:53:43.665-04:00][nexteesadf_server1][WARNING][ADF_FACES-60051][oracle.adfinternal.view.FACES.renderkit.rich.table.BaseColumnRenderer][tid:[ACTIVE].ExecuteThread:'16'队列:'weblogic.kernel.Default self-tuning'][userId:test@test.com][ecid:005KASO5ZOR4ULMPMK4EYE00000XO00ZUB9,0:1][APP:NetApp_application1.ear66.1254][DSID:0000LN6NNVT4MNPMKL6IE1PHMGO000495][URI:/netapp/faces/pages/oversight/oversight.jspx]列中指定的宽度无效:pt1:r1:r1:0:r11:1:r2:0:r5:0:pc1:t1:1:c26。 [2017-06-20T12:53:44.324-04:00][nexteesadf_server1][ERROR][[com.someco.netapp.sourcefile.helper.SourceFileHelper][tid:[活动]。队列的ExecuteThread:'6:'weblogic.kernel.Default self-tuning'][userId:test@test.com][ecid:005KaSO8oaU4QtMpMKc9ye0003da0050lR,0:1][APP:NetApp_application1.ear66.1254][DSID:0000LN6IPJM4MNPMKL6IE1PHMGO00047B][URI:/netapp/faces/pages/submission/submission.jspx]SourceFileHelper验证源文件:1152379
[2017-06-20T12:53:44.329-04:00][nexteesadf_server1][ERROR][ADFC-64010][oracle.adf.controller.internal.binding.TaskFlowRegionModelViewPort][tid:[ACTIVE].ExecuteThread:'6'队列:'weblogic.kernel.Default self-tuning'][userId:test@test.com][ecid:005KaSO8oaU4QtMpMKc9ye0003da0050lR,0:1][APP:NetApp_application1.ear66.1254][DSID:0000LN6IPJM4MNPMKL6IE1PHMGO00047B][URI:/netapp/faces/pages/submission/submission.jspx]ADFc:Page'/com/someco/netapp/submission/ui/fragment/uploadSubmissionFile.jsff'多次引用任务流绑定'guidelineNavTF1',这是不受支持的。您必须解析日志文件的每一行。然后为每一行创建一个字典,并使用pandas.Dataframe.from_dict方法创建数据帧

import pandas as pd
import numpy as np

def parse_log(filename):
    with open(filename, 'r') as f:
        lines = f.readlines()

    entries = []
    for line in lines:
        entry = {}
        cols = line.split('] [')
        entry['log_date'] = np.datetime64(cols[0].replace('[', ''))
        entry['log_server'] = cols[1]
        entry['log_level'] = cols[2]
        entry['col_four'] = cols[3]  # idk column proper name
        entry['col_five'] = cols[4]  # idk column proper name
        entry['tid'] = cols[5].replace('tid: ', '')
        entry['userId'] = cols[6].replace('userId: ', '')
        entry['ecid'] = cols[7].replace('ecid: ', '')
        entry['app'] = cols[8].replace('APP: ', '')
        entry['dsid'] = cols[9].replace('DSID: ', '')
        # this is where the last column and the message get split
        last = cols[10].split(']')
        entry['uri'] = last[0].replace('URI: ', '')
        entry['message'] = last[1].strip()
        entries.append(entry)
    return entries


if __name__ == '__main__':
    entries = parse_log('example.log')
    df = pd.DataFrame.from_dict(entries)
    print(df.head())

现在,您可以使用pandas提供的所有方法来分析数据。我不知道两列的列名应该是什么,所以我只给了它们通用名。

您需要其他字段吗?我可以很容易地获得前4个字段。理想情况下,如果开销不大,可以将所有字段解析为自己的列;但不需要sure如果每个错误有固定数量的项/字段,那么在分析问题时,我不想走这条路。这并不容易,你可能需要通过多种分析方法才能得到你想要的每个值。好的,我对前4项很满意;这将为我提供理解绝对频率所需的80%我想如果不是全部的话,我可以得到最多的错误。一秒钟…嘿,亚当,谢谢你-当我运行它的时候,我得到了:索引器回溯最近的一次呼叫最后一次在索引器:列表索引超出范围评论不是回溯的好地方,但是我发布的内容应该会让你得到大多数我留下了一条评论,你可能会遇到一些问题。你必须弄清楚如何解析日志中的URI和消息部分。谢谢你的帮助,我的AirGood上的4GB数据听上去非常好。可能有这样的情况,最后一部分我拆分了URI,但消息不起作用因为我只有4个条目需要测试。