python 代码解读

# -*- coding: utf-8 -*-
# date: 2017-01-23
# author: starking
# module function: extract log structure from log files
import os
import time
import json


#这个类的对象代表了单条日志
class Log:
    #定义在类内,但是不是类的方法内的变量叫做类的静态变量
    __SOH = '\x01'  # parameter separator in log text
    __NULL = '\N'  # indicate the log parameter is null
    __params = ['row_key', 'user_id', 'app_key', 'user_ip', 'question',
                'answer', 'process_record', 'gps', 'ts', 'result_code',
                'error', 'total_time', 'voiceId', 'request_id', 'server_code',
                'screen_type_code', 'platform_type_code', 'history', 'method',
                'city', 'time', 'scenario', 'scenario_param', 'wakeup_word',
                'service_code', 'oneshotkey_property', 'create_date']

    def __init__(self):
        self.text = None  # 初始化赋值为None
        for param in Log.__params:
            setattr(self, param, None)#obj,属性名,属性值这里赋值

    def __init__(self, log_text):
        self.parse(log_text)

    # parse a log string
    def parse(self, log_text):
        self.text = log_text
        for i, item in enumerate(log_text.split(Log.__SOH)):
            item = None if item == Log.__NULL or item.strip() == '' else item
            setattr(self, Log.__params[i], item)
        self.__parse_param_values()

    # extract parameter value when the param has non-string structure
    def __parse_param_values(self):
        self.total_time_value = int(self.total_time) if self.total_time is not None else None
if self.answer is None: self.answer_json = None else: self.answer_json = json.loads(self.answer) if type(self.answer_json) is list: self.answer_json = self.answer_json[0] self.process_record_json = json.loads(self.process_record) if self.process_record is not None else None self.create_date_value = time.strptime(self.create_date, '%Y-%m-%d') if self.create_date is not None else None self.ts_value = time.strptime(self.ts, '%Y-%m-%d %H:%M:%S.0') if self.ts is not None else None if self.time is None: self.time_value = None else: try: self.time_value = time.strptime(self.time, '%Y-%m-%d %H:%M:%S') except: self.time_value = None try: self.time_value = time.strptime(self.time, '%Y-%m-%d%H:%M:%S') except: self.time_value = None # the print info def __str__(self): return self.display() def display(self): return '{' + os.linesep.join( ['(%s: %s)' % (param, getattr(self, param)) for param in Log.__params]) + '}' # return the log input def to_text(self): return self.text # 代表了多条日志,就是一个日志文件,这里覆盖了 __iter__方法所以是一个iterable,同时覆盖了__next__ 所以是一个iterator; #python 需要覆盖的放法一般 __ 开头同时__ 结尾 class LogStream: def __init__(self, filepaths): self.files = [open(fp, mode='r') for fp in filepaths] self.f_iters = [iter(f) for f in self.files] self.f_n = len(self.files) self.f_i = 0 # LogStream is iterable def __iter__(self): return self # LogStream is an iterator def __next__(self): while self.f_i < self.f_n: try: val = self.f_iters[self.f_i].next() if val is None or len(val.strip()) == 0: continue return Log(val.strip()) except StopIteration: self.f_i += 1 else: raise StopIteration() # close all file sources def __del__(self): for f in self.files: f.close() # reset stream def reset(self): self.f_i = 0 for f in self.files: f.seek(0) if __name__ == '__main__': log_path = r'*.log' stream = LogStream([log_path]) # just print the first log for test for log in stream: print log break#因为break所以只打印了一条日志

 

posted @ 2017-11-09 16:53  随遇而安jason  阅读(1509)  评论(0)    收藏  举报