| 135 |
|
def readentry(self):
|
| 136 |
|
"""Read the next entry in this log. Do not use this
|
| 137 |
|
|
| 138 |
|
@todo unit testing
|
| 139 |
|
"""
|
| 140 |
|
parse_header = self.headerParser.parse
|
| 141 |
|
delta = 0
|
| 142 |
|
if self.__lastheader:
|
| 143 |
|
header = self.__lastheader
|
| 144 |
|
else:
|
| 145 |
|
line = self.fd.readline()
|
| 146 |
|
if not line:
|
| 147 |
|
return
|
| 148 |
|
try:
|
| 149 |
|
header, _ = parse_header(line)
|
| 150 |
|
except LogParseException:
|
| 151 |
|
header, _ = None, None
|
| 152 |
|
if header:
|
| 153 |
|
header = LogHeader(header)
|
| 154 |
|
delta = len(line) - len(header)
|
| 155 |
|
self.__lastheader = None
|
| 156 |
|
self.fd.seek(-delta, 1)
|
| 157 |
|
line = self.fd.readline()
|
| 158 |
|
msg_buffer = StringIO()
|
| 159 |
|
while line:
|
| 160 |
|
try:
|
| 161 |
|
nexthdr, meta = parse_header(line)
|
| 162 |
|
self.__lastheader = LogHeader(nexthdr)
|
| 163 |
|
delta = len(line) - len(self.__lastheader)
|
| 164 |
|
self.fd.seek(-delta, 1)
|
| 165 |
|
break
|
| 166 |
|
except LogParseException:
|
| 167 |
|
msg_buffer.write(line)
|
| 168 |
|
line = self.fd.readline()
|
| 169 |
|
message = msg_buffer.getvalue()
|
| 170 |
|
try:
|
| 171 |
|
if header is None:
|
| 172 |
|
raise LogParseException
|
| 173 |
|
#return LogEntry(header, message)
|
| 174 |
|
entry = LogEntry(header, message, parser=self.messageParser)
|
| 175 |
|
if self.action is not None:
|
| 176 |
|
self.action(entry)
|
| 177 |
|
return entry
|
| 178 |
|
except LogParseException:
|
| 179 |
|
return MalformedLogEntry(header or '', message)
|
| 180 |
|
|
| 181 |
|
|