1
2
3 from __future__ import print_function
4 from __future__ import unicode_literals
5 from __future__ import division
6 from __future__ import absolute_import
7
8 import logging
9 from multiprocessing import Process
10 import os
11 import sys
12 import time
13 from setproctitle import setproctitle
14
15
17
18 """Log mechanism where items from the events queue get recorded
19
20 :param Bunch opts: backend config
21 :param events: multiprocessing.Queue to listen
22 for events from other backend components
23
24 """
25
27
28
29 Process.__init__(self, name="logger")
30
31 self.opts = opts
32 self.events = events
33
34 logdir = os.path.dirname(self.opts.logfile)
35 if not os.path.exists(logdir):
36 os.makedirs(logdir, mode=0o750)
37
39 """
40 Configures standard python logger
41 """
42 sys.stderr.write("Running setup handler {} \n".format(self.opts))
43
44 logging.basicConfig(filename=self.opts.logfile, level=logging.DEBUG)
45
46 self.log({"when": time.time(), "who": self.__class__.__name__,
47 "what": "Logger initiated"})
48
49 - def log(self, event):
50 """
51 Format event into the log message
52
53 :param event: dict-like object
54
55 Expected **event** keys:
56 - `when`: unixtime
57 - `who`: event producer [worker|logger|job|main]
58 - `what`: content
59 """
60 when = time.strftime("%F %T", time.gmtime(event["when"]))
61 msg = "{0} : {1}: {2}".format(when,
62 event["who"],
63 event["what"].strip())
64 try:
65 if self.opts.verbose:
66 sys.stderr.write("{0}\n".format(msg))
67 sys.stderr.flush()
68 logging.debug(msg)
69
70 except (IOError, OSError) as e:
71
72 sys.stderr.write("Could not write to logfile {0} - {1}\n".format(
73 self.opts.logfile, e))
74
75
76
78 """
79 Starts logger process
80 """
81 setproctitle("CoprLog")
82 self.setup_log_handler()
83
84 try:
85 while True:
86 event = self.events.get()
87 if "when" in event and "who" in event and "what" in event:
88 self.log(event)
89 except KeyboardInterrupt:
90 return
91