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

在python中使用readlines()读取日志文件,python,json,Python,Json,我有一个示例日志文件,其中每个msisdn值(例如“msisdn”:“22969000034”)都有3个不同的状态值,如(例如“状态”:“已完成”、“状态”:“正在进行”和“状态”:“已输入”)。我必须创建一个包含以下列的报告:“msisdn(包含msisdn字段值)、requestID(包含requestID字段值)、state1(包含输入的状态字段值)、state2(包含正在进行的状态字段值)、state3(包含完成的状态字段值)、text”(仅当msisdn的状态值已完成时才包含文本字段值

我有一个示例日志文件,其中每个msisdn值(例如“msisdn”:“22969000034”)都有3个不同的状态值,如(例如“状态”:“已完成”、“状态”:“正在进行”和“状态”:“已输入”)。我必须创建一个包含以下列的报告:“msisdn(包含msisdn字段值)、requestID(包含requestID字段值)、state1(包含输入的状态字段值)、state2(包含正在进行的状态字段值)、state3(包含完成的状态字段值)、text”(仅当msisdn的状态值已完成时才包含文本字段值,否则,如果状态值正在进行/输入,则将为“NA”)

日志文件:

{“methodName”:“offlineNotifQueueListener()”,“className”:“com.ericsson.ms.business.jms.listener.impl.ActiveMqListener”,“text”:“正在处理脱机请求”,“errorText”:“NA”,“status”:“NA”,“requestID”:“脱机通知”_10.10.46.95_E64444DBC-b7ef-41d6-9111-eaa384717b27”,“orgTransactionID”:“895139242296900003”,“msisdn”:“229900034”,“操作”:”:“通知”,“输入”:“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”状态“:”NA“,”requestID“:”离线通知“,”动作“,”通知“,”输入“,”预处理“,”源频道“,”离线“,”产品“,”1399“,”交易日期“,”2020-03-24T22:59:59+0100“,”状态“,”正在进行“,”方法名称“,”状态“,”msisdn“,”动作“,”通知“,”输入“,”预处理“,”源频道“,”离线“,”产品“,”1399“,”交易日期时间“,”2020-03-24T22:59:59+0100“,”状态“,”状态“,”正在进行中“,”方法名称“,”executeConstraint(),“类名”:“com.ericsson.ms.business.service.constraint.impl.MSConstraintsImpl”,“文本”:“执行约束:OfferCHeck”,“错误文本”:“NA”,“状态”:“NA”,“请求ID”:“脱机通知”_10.10.46.95_E64444DBC-b7ef-41d6-9111-eaa384717b27”,“orgTransactionID”:“895139242296900003”,“msisdn”:“2296900034”,“操作”:“通知”输入“:”pre_Adhoc“,”sourceChannel“:”OFFLINE“,”product“:”NA“,”transactionDateTime“:”2020-03-24T22:59:59+0100“,”状态“:”进行中“{”methodName“:”getValueFromAIR()”,”className“:”com.ericsson.ms.business.service.templateparam.impl.TemplateParamServiceImpl“,”文本“:”评估参数--\u003e${OFFER\u123089\uValue}”,“错误文本“:”NA“,”状态“,”requestID:“脱机通知”;“操作”;“通知”;“输入”;“预处理”;“源频道”;“脱机”;“产品”;“1399”;“事务日期时间”;“2020-03-24T22:59:59+0100”;“状态”;“进行中”;{“方法名”;“执行命令”;“类名”;“状态”;“正在进行中”;{“方法名”;“执行命令”;“类名”;“com.ericsson.ms.business.service.templateparam.impl.TemplateParamServiceImpl,“文本”:“执行空中命令--\u003e GetOffers”,“错误文本”:“不适用”,“状态”:“不适用”,“请求ID”:“脱机通知”10.10.46.95_E64444BC-b7ef-41d6-9111-eaa384717b27”,“orgTransactionID”:“89513924296900003”,“msisdn”:“2299000034”,“操作”:“通知”,“输入”:“预处理”“,”sourceChannel:”离线“,”产品“:”1399“,”交易日期时间“:”2020-03-24T22:59:59+0100“,”状态“:”已完成“}”

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

代码:


看起来文件是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)

您能解释一下预期的输出吗?list1看起来很复杂,因为您在不同的if-else分支下追加元组和值。
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)