我是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
答案 0 :(得分:2)
您的代码有几个问题:
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有多么有趣!