import datetime import json import logging import logging.handlers import traceback from .sender import LogzioSender class LogzioHandler(logging.Handler): def __init__(self, token, logzio_type="python", logs_drain_timeout=3, url="https://listener.logz.io:8071", debug=False): if token is "": raise Exception("Logz.io Token must be provided") self.logzio_type = logzio_type self.logzio_sender = LogzioSender(token=token, url=url, logs_drain_timeout=logs_drain_timeout, debug=debug) logging.Handler.__init__(self) def format(self, record): message = super(LogzioHandler, self).format(record) try: return json.loads(message) except (TypeError, ValueError): return message def format_exception(self, exc_info): return '\n'.join(traceback.format_exception(*exc_info)) def format_message(self, message): now = datetime.datetime.utcnow() timestamp = now.strftime("%Y-%m-%dT%H:%M:%S") + ".%03d" % (now.microsecond / 1000) + "Z" return_json = { "logger": message.name, "line_number": message.lineno, "path_name": message.pathname, "log_level": message.levelname, "type": self.logzio_type, "message": message.getMessage(), "@timestamp": timestamp } if message.exc_info: return_json["exception"] = self.format_exception(message.exc_info) else: formatted_message = self.format(message) if isinstance(formatted_message, dict): return_json.update(formatted_message) else: return_json["message"] = formatted_message return return_json def emit(self, record): self.logzio_sender.append(self.format_message(record))