Skip to content
This repository was archived by the owner on Jul 19, 2023. It is now read-only.

Commit df662ac

Browse files
committed
Moved the mysql_slow parser to its own file, read desired parser from config file.
1 parent 06e4221 commit df662ac

File tree

3 files changed

+57
-40
lines changed

3 files changed

+57
-40
lines changed

togelf/parsers/__init__.py

Whitespace-only changes.

togelf/parsers/mysql_slow.py

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import re
2+
import os
3+
4+
5+
class Parser:
6+
"""Parses mysql slow logs"""
7+
def __init__(self, client, log_path, log_level):
8+
self.user_host_re = re.compile('^# User@Host: (?P<user>\w+)\[[^\]]+\] @ (?P<host>[a-zA-Z0-9.-]+)? \[(?P<ip>[0-9.]+)]');
9+
self.stats_re = re.compile('^# Query_time: (?P<query_time>\d+) \s*Lock_time: (?P<lock_time>\d+) \s*Rows_sent: (?P<sent>\d+) \s*Rows_examined: (?P<scanned>\d+)')
10+
self.content_re = re.compile('^[^#].*')
11+
self.client = client
12+
self.message = {}
13+
self.log_path = log_path
14+
self.log_level = log_level
15+
16+
def parse_line(self, line):
17+
# Check whether the log line matches our configured regex
18+
uh = user_host_re.match(line)
19+
if uh:
20+
if self.message:
21+
self.message['short_message'] = message['full_message'][:60]
22+
client.log(json.dumps(self.message))
23+
self.message = {}
24+
25+
self.message['version'] = '1.0'
26+
self.message['facility'] = self.facility
27+
self.message['file'] = self.log_path
28+
self.message['level'] = self.log_level
29+
self.message['host'] = os.getenv('HOSTNAME')
30+
self.message['_user'] = uh.group('user')
31+
self.message['_client_host'] = uh.group('host')
32+
self.message['_client_ip'] = uh.group('ip')
33+
return
34+
35+
st = stats_re.match(line)
36+
if st:
37+
self.message['_query_time'] = st.group('query_time')
38+
self.message['_lock_time'] = st.group('lock_time')
39+
self.message['_rows_sent'] = st.group('sent')
40+
self.message['_rows_examined'] = st.group('scanned')
41+
return
42+
ct = content_re.match(line)
43+
if ct:
44+
if message.has_key('full_message'):
45+
self.message['full_message'] += line
46+
else:
47+
self.message['full_message'] = line

togelf/togelf.py

Lines changed: 10 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,6 @@
1919
from client import Client
2020
from optparse import OptionParser
2121

22-
configFile = '/etc/gelfDaemon.conf'
23-
24-
user_host_re = re.compile('^# User@Host: (?P<user>\w+)\[[^\]]+\] @ (?P<host>[a-zA-Z0-9.-]+)? \[(?P<ip>[0-9.]+)]');
25-
stats_re = re.compile('^# Query_time: (?P<query_time>\d+) \s*Lock_time: (?P<lock_time>\d+) \s*Rows_sent: (?P<sent>\d+) \s*Rows_examined: (?P<scanned>\d+)')
26-
content_re = re.compile('^[^#].*')
27-
28-
29-
3022
# This class is used to collapse multi-line log files into a single line. You
3123
# will want to populate regEx with something useful!
3224
class Concatenate:
@@ -59,6 +51,8 @@ def GetConfig(self):
5951
self.regEx = config.get(self.section, 'regex')
6052
self.facility = config.get(self.section, 'facility')
6153
self.shortMessageRegEx = config.get(self.section, 'short_message_regex')
54+
self.logparser = config.get(self.section, 'parser')
55+
6256
try:
6357
self.concatenateOn = config.get(self.section, 'concatenate_on')
6458
except ConfigParser.NoOptionError:
@@ -78,7 +72,7 @@ def ResetLog(self):
7872
truncation"""
7973
self.handle.close()
8074
self.handle = open(self.logPath, 'r')
81-
self. position = self.handle.tell()
75+
self.position = self.handle.tell()
8276

8377
def run(self):
8478
# The the paths and whatnot from the config file
@@ -93,10 +87,14 @@ def run(self):
9387
sys.stderr.write('%s: unknown error occurred, thread exiting\n' %
9488
sys.argv[0])
9589
sys.exit()
90+
91+
# Import the parser in a manner most disgusting...
92+
module = __import__('parsers.' + self.logparser, globals(), locals(), [self.logparser], -1)
93+
logparser = module.Parser(client, self.logPath, self.logLevel)
9694

9795
# Instantiate the Concatenation class
9896
cat = Concatenate()
99-
message = {}
97+
10098
# Now for the thread's main loop
10199
while True:
102100
# We break if the queue is a non-zero size. This is pretty
@@ -115,36 +113,8 @@ def run(self):
115113
else:
116114
# Now ditch any blank lines, because they're dumbass
117115
if line != '':
118-
uh = st = ct = False
119-
# Check whether the log line matches our configured regex
120-
uh = user_host_re.match(line)
121-
st = stats_re.match(line)
122-
ct = content_re.match(line)
123-
124-
if uh:
125-
if message:
126-
message['short_message'] = message['full_message'][:60]
127-
client.log(json.dumps(message))
128-
message = {}
129-
130-
message['version'] = '1.0'
131-
message['facility'] = self.facility
132-
message['file'] = self.logPath
133-
message['level'] = self.logLevel
134-
message['host'] = os.getenv('HOSTNAME')
135-
message['_user'] = uh.group('user')
136-
message['_client_host'] = uh.group('host')
137-
message['_client_ip'] = uh.group('ip')
138-
elif st:
139-
message['_query_time'] = st.group('query_time')
140-
message['_lock_time'] = st.group('lock_time')
141-
message['_rows_sent'] = st.group('sent')
142-
message['_rows_examined'] = st.group('scanned')
143-
elif ct:
144-
if message.has_key('full_message'):
145-
message['full_message'] += line
146-
else:
147-
message['full_message'] = line
116+
logparser.parse_line(line)
117+
148118

149119

150120
if __name__ == '__main__':

0 commit comments

Comments
 (0)