繁体   English   中英

在 python 中使用 readlines() 读取日志文件

[英]read log file by using readlines() in python

我有示例日志文件,其中对于每个 msisdn 值(例如“msisdn”:“22969000034”)有 3 个不同的状态值,例如(例如 '"state":"COMPLETED"', '"state":"IN_PROGRESS"' & “状态”:“输入”)。 我必须创建一个报告,其中包含“msisdn(包含 msisdn 字段值)、requestID(包含 requestID 字段值)、state1(包含状态字段值为 ENTERED)、state2(包含状态字段值为 IN_PROGRESS)”的列, state3(包含状态字段值作为 COMPLETED),文本(仅当状态值为 msisdn 完成时才包含文本字段值,否则如果状态值为 IN_PROGRESS/ENTERED,它将是 'NA' )”。

日志文件:

{"methodName":"offlineNotifQueueListener()","className":"com.ericsson.ms.business.jms.listener.impl.ActiveMqListener","text":"处理离线请求","errorText":"NA" ,"status":"NA","re​​questID":"OFFLINE_Notification_10.10.46.95_e6444dbc-b7ef-41d6-9111-eaa384717b27","orgTransactionID":"8951392422969","action203","action203"00003"0003"通知","input":"pre_Adhoc","sourceChannel":"OFFLINE","product":"1399","transactionDateTime":"2020-03-24T22:59:59+0100","state":" ENTERED"} {"methodName":"addNotificationText()","className":"com.ericsson.ms.business.service.notification.impl.MSProductNotificationImpl","text":"正在评估产品通知:1399"," errorText":"NA","status":"NA","re​​questID":"OFFLINE_Notification_10.10.46.95_e6444dbc-b7ef-41d6-9111-eaa384717b27","orgTransactionID":"8951390":"895139024209230"2009"2009" ,"action":"通知","input":"pre_Adhoc","sourceChannel":"OFFLINE","product":"1399","transactionDateTime":"2020-03-24T22:59:59+0100" ,"state":"IN_PROGRE SS"} {"methodName":"executeConstraint()","className":"com.ericsson.ms.business.service.constraint.impl.MSConstraintsImpl","text":"执行约束:OfferCHECK","errorText" :"NA","status":"NA","re​​questID":"OFFLINE_Notification_10.10.46.95_e6444dbc-b7ef-41d6-9111-eaa384717b27","orgTransactionID":"895139242209"6900000" action":"通知","input":"pre_Adhoc","sourceChannel":"OFFLINE","product":"NA","transactionDateTime":"2020-03-24T22:59:59+0100"," state":"IN_PROGRESS"} {"methodName":"getValueFromAIR()","className":"com.ericsson.ms.business.service.templateparam.impl.TemplateParamServiceImpl","text":"评估参数 --\\ u003e ${OFFER_123089_VALUE}","errorText":"NA","status":"NA","re​​questID":"OFFLINE_Notification_10.10.46.95_e6444dbc-b7ef-41d6-9111-eaa384719"300000000ID":"630205" ,"msisdn":"22969000034","action":"通知","input":"pre_Adhoc","sourceChannel":"OFFLINE","product":"1399","transactionDateTime":"2020-03- 24T22:59:59+0100", "state":"IN_PROGRESS"} {"methodName":"executeCommand","className":"com.ericsson.ms.business.service.templateparam.impl.TemplateParamServiceImpl","text":"执行AIR命令--- \> GetOffers","errorText":"NA","status":"NA","re​​questID":"OFFLINE_Notification_10.10.46.95_e6444dbc-b7ef-41d6-9111-eaa384717b27","orgTransactionID":"20.46"80" msisdn":"22969000034","action":"通知","input":"pre_Adhoc","sourceChannel":"OFFLINE","product":"1399","transactionDateTime":"2020-03-24T22: 59:59+0100","state":"完成"}

我正在使用的代码仅从日志文件的第一行给出输出。 如何读取完整文件以获得所需的输出?

代码:

with open('home/msLog.log', 'r') as f:
    data = '['+f.readlines()[0].replace('} {','}, {')+']'
    print(data)
    data1 = json.loads(data)
#    print(data1)
    #i += 1
    for x in data1:
    #print(f"msisdn: {x['msisdn']}, status: {x['state']}, requestID: {x['requestID']}")
        print(x['msisdn'],x['state'],x['product'])
    if x['state'] == 'ENTERED':
        msd = x['msisdn']
        RID = x['requestID']
        state1 = x['state']
        value = msd, RID, state1
        list1.append(value)
    elif x['state'] == 'IN_PROGRESS' and x['msisdn'] == msd:
        state2 = x['state']
        list1.append(state2)
    elif x['state'] == 'COMPLETED' and x['msisdn'] == msd:
        state3 = x['state']
        text = x['text']
        value = state3, text
        list1.append(value)
print(list1)

看起来文件是 jsonlines 格式 - 每行都是一个单独的 json 对象。 因此,您可以逐行反序列化,如下所示:

with open('home/msLog.log', 'r') as f:
    for line in f:
        x = json.loads(line)

        # Process the line (code unchanged from the question)
        if x['state'] == 'ENTERED':
            msd = x['msisdn']
            RID = x['requestID']
            state1 = x['state']
            value = msd, RID, state1
            list1.append(value)
        elif x['state'] == 'IN_PROGRESS' and x['msisdn'] == msd:
            state2 = x['state']
            list1.append(state2)
        elif x['state'] == 'COMPLETED' and x['msisdn'] == msd:
            state3 = x['state']
            text = x['text']
            value = state3, text
            list1.append(value)
print(list1)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM