簡體   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