Source code for backend.daemons.log

# coding: utf-8

import json

import logging
import logging.handlers
import os
from setproctitle import setproctitle


# TODO: remove when RedisLogHandler works fine
from .. import constants
from .. import helpers


[docs]class RedisLogHandler(object): """ Single point to collect logs through redis pub/sub and write them through standard python logging lib """ def __init__(self, opts): self.opts = opts self.log_dir = os.path.dirname(self.opts.log_dir) if not os.path.exists(self.log_dir): os.makedirs(self.log_dir, mode=0o750) self.components = ["spawner", "terminator", "vmm", "build_dispatcher", "action_dispatcher", "backend", "actions", "worker", "modifyrepo"]
[docs] def setup_logging(self): self.main_logger = logging.Logger("logger", level=logging.DEBUG) self.main_handler = logging.handlers.WatchedFileHandler( filename=os.path.join(self.log_dir, "logger.log")) self.main_handler.setFormatter(self.opts.log_format) self.main_logger.addHandler(self.main_handler) level = getattr(logging, self.opts.log_level.upper(), None) self.loggers = {} for component in self.components: logger = logging.Logger(component) handler = logging.handlers.WatchedFileHandler( filename=os.path.join(self.log_dir, "{}.log".format(component))) handler.setFormatter(self.opts.log_format) handler.setLevel(level) logger.addHandler(handler) self.loggers[component] = logger
[docs] def handle_msg(self, json_event): try: event = json.loads(json_event) who = event.get('who', None) if not who: raise Exception("No LogRecord.who field, raw: {}".format(event)) if who not in self.loggers: raise Exception("Unknown LogRecord.who field: {}, raw event: {}" .format(who, event)) log_record = logging.makeLogRecord(event) self.loggers[who].handle(log_record) except Exception as err: self.main_logger.exception(err)
[docs] def run(self): self.setup_logging() setproctitle("RedisLogHandler") rc = helpers.get_redis_connection(self.opts) while True: # indefinitely wait for the next entry, note that blpop returns # tuple (FIFO_NAME, ELEMENT) (_, json_event) = rc.blpop([constants.LOG_REDIS_FIFO]) self.handle_msg(json_event)