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.msg,
|
|
"@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))
|