add tsstats.log.re_log_entry for log-line-matching
* don't evaluate invalid log-lines leading to unexpected results * don't abort parsing just because of an invalid character at the beginning/end * add debug-output if line doesn't match
This commit is contained in:
parent
42d8c74f72
commit
da5683ede2
|
@ -54,9 +54,9 @@ author = 'Thor77'
|
|||
# built documents.
|
||||
#
|
||||
# The short X.Y version.
|
||||
version = '0.4'
|
||||
version = '0.5'
|
||||
# The full version, including alpha/beta/rc tags.
|
||||
release = '0.4.1'
|
||||
release = '0.5.0'
|
||||
|
||||
# The language for content autogenerated by Sphinx. Refer to documentation
|
||||
# for a list of supported languages.
|
||||
|
|
2
setup.py
2
setup.py
|
@ -2,7 +2,7 @@ from setuptools import setup
|
|||
|
||||
setup(
|
||||
name='tsstats',
|
||||
version='0.4.1',
|
||||
version='0.5.0',
|
||||
author='Thor77',
|
||||
author_email='thor77@thor77.org',
|
||||
description='A simple Teamspeak stats-generator',
|
||||
|
|
|
@ -5,6 +5,9 @@ from glob import glob
|
|||
|
||||
from tsstats.client import Client, Clients
|
||||
|
||||
re_log_entry = re.compile('(?P<timestamp>\d{4}-\d\d-\d\d\ \d\d:\d\d:\d\d.\d+)'
|
||||
'\|(?P<level>\w+)\ +\|(?P<component>\w+)'
|
||||
'\|\ +(?P<sid>\d+)\|\ (?P<message>.*)')
|
||||
re_dis_connect = re.compile(r"'(.*)'\(id:(\d*)\)")
|
||||
re_disconnect_invoker = re.compile(
|
||||
r'invokername=(.*)\ invokeruid=(.*)\ reasonmsg'
|
||||
|
@ -28,28 +31,32 @@ def parse_log(log_path, ident_map=None, clients=None):
|
|||
# process lines
|
||||
logger.debug('Started parsing of %s', log_file.name)
|
||||
for line in log_file:
|
||||
parts = line.split('|')
|
||||
match = re_log_entry.match(line)
|
||||
if not match:
|
||||
logger.debug('No match: "%s"', line)
|
||||
continue
|
||||
match = match.groupdict()
|
||||
log_format = '%Y-%m-%d %H:%M:%S.%f'
|
||||
stripped_time = datetime.strptime(parts[0], log_format)
|
||||
stripped_time = datetime.strptime(match['timestamp'], log_format)
|
||||
logdatetime = int((stripped_time - datetime(1970, 1, 1))
|
||||
.total_seconds())
|
||||
data = '|'.join(parts[4:]).strip()
|
||||
if data.startswith('client'):
|
||||
nick, clid = re_dis_connect.findall(data)[0]
|
||||
message = match['message']
|
||||
if message.startswith('client'):
|
||||
nick, clid = re_dis_connect.findall(message)[0]
|
||||
client = clients.setdefault(clid, Client(clid, nick))
|
||||
client.nick = nick # set nick to display changes
|
||||
if data.startswith('client connected'):
|
||||
if message.startswith('client connected'):
|
||||
client.connect(logdatetime)
|
||||
elif data.startswith('client disconnected'):
|
||||
elif message.startswith('client disconnected'):
|
||||
client.disconnect(logdatetime)
|
||||
if 'invokeruid' in data:
|
||||
if 'invokeruid' in message:
|
||||
re_disconnect_data = re_disconnect_invoker.findall(
|
||||
data)
|
||||
message)
|
||||
invokernick, invokeruid = re_disconnect_data[0]
|
||||
invoker = clients.setdefault(invokeruid,
|
||||
Client(invokeruid))
|
||||
invoker.nick = invokernick
|
||||
if 'bantime' in data:
|
||||
if 'bantime' in message:
|
||||
invoker.ban(client)
|
||||
else:
|
||||
invoker.kick(client)
|
||||
|
|
Loading…
Reference in New Issue