2012-07-24 36 views
2

我是python的新手程序員。我目前正在構建一個分析日誌文件並完成了該類的所有元素的類。儘管如此,由於python中的大部分內容都適用於我,所以我要麼不正確地格式化我的類,要麼搞砸了我的語義。我想知道是否有構造類的確切格式,以及我寫的是否符合上述格式。類格式問題

下面是從日誌裏的句子:

2012-06-12 14:02:21,813 [main] INFO ConnectionManager.java (line 238) Initializing the ConnectionManager. 
2012-06-12 14:02:21,844 [main] INFO CimListener.java (line 142) Starting listener at http://127.0.0.1:7012 
2012-06-12 14:02:21,974 [main] INFO CimListener.java (line 158) Listening at http://127.0.0.1:7012 
2012-06-12 14:02:23,209 [main] INFO RmiServiceExporter.java (line 393) Looking for RMI registry at port '10099' 
2012-06-12 14:02:23,232 [main] INFO RmiServiceExporter.java (line 404) Could not detect RMI registry - creating new one 

這裏是類:

import re 
import time 
import calendar 
from datetime import datetime 

f = open("C:\Users\-----\Desktop\Real Logs\controllersvc.log", "r") 
while True: 
    line = f.readline() 
    if not line: 
     break 

class LogLine: 

    SEVERITIES = ['EMERG','ALERT','CRIT','ERR','WARNING','NOTICE','INFO','DEBUG'] 
    severity = 1 


    def __init__(self, line): 
     try: 
      timestr, msstr, sevstr, self.filename, linestr, self.message = re.match(r"^(\d\d\d\d-\d\d-\d\d[ \t]\d\d:\d\d:\d\d),(\d\d\d),(?i[a-z]+),([A-Za-z]{1,.}),([(]\[lL]ine\>\s+\d+[)]),^(?<=\)\s?\w+$)", line).groups() 
      self.line = int(linestr) 
      self.sev = self.SEVERITIES.index(sevstr) 
      self.time = float(calendar.timegm(time.strptime(timestr, "%Y-%m-%d %H:%M:%S,%f"))) + float(msstr)/1000.0 
      dt = datetime.strptime(t, "%Y-%m-%d %H:%M:%S,%f") 
     except Exception: 
      print 'error',self.filename 

    def get_time(self): 
     return self.time 
    def get_severity(self): 
     return self.sev 
    def get_message(self): 
     return message 
    def get_filename(self): 
     return filename 
    def get_line(self): 
     return line 

回答

2

有幾件事情你的代碼錯誤:

  • 自我。文件名屬性在使用前不一定定義init
  • 你應該嘗試更加具體哪個你期望捕捉異常(是要禁止KeyboardInterruptException東西嗎?)
  • 正則表達式是複雜的,難以維護(我想錯了)
  • 您正在將「getters」暴露給對象上的公共屬性,這不是必需的。
  • 一些「干將」的返回的據推測打算返回實例全局變量(消息,線和文件名)屬性
  • 新編寫的類應理想子類的東西(在這種情況下,object

我希望這份名單有幫助,並被視爲建設性的批評。

爲了幫助您看到更多pythonic代碼,我爲您的數據寫了一個日誌讀取器,它沒有複雜的正則表達式,也沒有任何「getters」(如果您真的需要,可以添加它)。還有進一步簡化一個可以讓(使用namedtuple例如),但在清晰度和教育的興趣,我把每一件事情香草:

import datetime 


class LogEntry(object): 
    @staticmethod 
    def from_str(line): 
     """Converts a log line in a string, into a LogEntry.""" 
     # split the line by one or more spaces 
     date, time, _, severity, filename, _, line, message = re.split('\s+', line, 7) 

     # strip the trailing bracket on the line and cast to an int 
     line = int(line[:-1]) 

     # combine the date and time strings and turn them into a datetime 
     dt = datetime.datetime.strptime(date + time, "%Y-%m-%d%H:%M:%S,%f") 

     return LogEntry(dt, severity, filename, line, message) 

    def __init__(self, dt, severity, filename, line_num, message): 
     self.datetime = dt 
     self.severity = severity 
     self.filename = filename 
     self.line_num = line_num 
     self.message = message 

    def __str__(self): 
     return '%s %s %s L%s: %s' % (self.datetime, self.severity, self.filename, self.line_num, self.message) 


if __name__ == '__main__': 

    log_contents = """2012-06-12 14:02:21,813 [main] INFO ConnectionManager.java (line 238) Initializing the ConnectionManager. 
    2012-06-12 14:02:21,844 [main] INFO CimListener.java (line 142) Starting listener at http://127.0.0.1:7012 
    2012-06-12 14:02:21,974 [main] INFO CimListener.java (line 158) Listening at http://127.0.0.1:7012 
    2012-06-12 14:02:23,209 [main] INFO RmiServiceExporter.java (line 393) Looking for RMI registry at port '10099' 
    2012-06-12 14:02:23,232 [main] INFO RmiServiceExporter.java (line 404) Could not detect RMI registry - creating new one""" 

    # uncomment for real log reading 
    #fh = file(filename, 'r') 

    # emulate a log file by providing an iterable of lines (just like fh will do) 
    fh = log_contents.split('\n') 

    for line in fh: 
     print LogEntry.from_str(line.strip()) 

它產生的輸出:

2012-06-12 14:02:21.813000 INFO ConnectionManager.java L238: Initializing the ConnectionManager. 
2012-06-12 14:02:21.844000 INFO CimListener.java L142: Starting listener at http://127.0.0.1:7012 
2012-06-12 14:02:21.974000 INFO CimListener.java L158: Listening at http://127.0.0.1:7012 
2012-06-12 14:02:23.209000 INFO RmiServiceExporter.java L393: Looking for RMI registry at port '10099' 
2012-06-12 14:02:23.232000 INFO RmiServiceExporter.java L404: Could not detect RMI registry - creating new one 

我真的希望這可以幫助你發現Python有多好玩!