commit ff8a08f35f56f5f3722b9593e4db1fd27ba2480c Author: jar3b Date: Wed Aug 21 19:24:22 2019 +0300 Initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ae945fa --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.idea/ +venv/ diff --git a/README.md b/README.md new file mode 100644 index 0000000..c3320d4 --- /dev/null +++ b/README.md @@ -0,0 +1,7 @@ +# logag-python-handler + +## using + +``` +git+https://gitlab.com/logag/logag-python-handler.git +``` \ No newline at end of file diff --git a/logag_handler/__init__.py b/logag_handler/__init__.py new file mode 100644 index 0000000..68da062 --- /dev/null +++ b/logag_handler/__init__.py @@ -0,0 +1,67 @@ +import json +import logging +import socket +import sys +import traceback + +from xid import Xid + +LEVELS = { + "DEBUG": 0, + "INFO": 1, + "WARN": 2, + "WARNING": 2, + "ERROR": 3 +} + + +def new_xid(): + return Xid().string() + + +class LogagHandler(logging.Handler): + def __init__(self, service_name: str, pod_name: str, ip: str, port: int): + super().__init__() + self.service_name = service_name + self.pod_name = pod_name + self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + self.connection = (ip, port) + + self.backup_handler = logging.StreamHandler(sys.stdout) + self.backup_handler.setFormatter( + logging.Formatter(u'[%(levelname)-8s][%(asctime)s][%(filename)s:%(lineno)d] %(message)s')) + self.backup_handler.setLevel(logging.INFO) + + def __send_to_udp(self, data: dict): + data = json.dumps(data).encode('utf-8') + self.sock.sendto(data, self.connection) + + def emit(self, record): + trace = None + if record.exc_info: + if isinstance(record.exc_info, tuple) and len(record.exc_info) == 3: + trace = ''.join(traceback.format_exception(*record.exc_info)) + + record.exc_info = None + + # get xid + xid = getattr(record, "xid", None) + if xid is None or len(xid) != 20: + xid = new_xid() + + msg = self.format(record) + try: + json_ = { + "timestamp": int(record.created * 1000), + "svc": self.service_name, + "pod": self.pod_name, + "xid": xid, + "lvl": LEVELS[record.levelname], + "msg": msg, + "trace": trace, + "requestId": getattr(record, "request_id", None), + } + + self.__send_to_udp(json_) + except Exception as e: + self.backup_handler.emit(record) diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..111ce66 --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +xid==1.0.4 \ No newline at end of file diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..aed43a7 --- /dev/null +++ b/setup.py @@ -0,0 +1,15 @@ +from setuptools import setup + +setup( + name='logag-python-handler', + version='0.1.0', + packages=['logag_handler'], + url='https://gitlab.com/logag/logag-python-handler', + license='MIT', + author='jar3b', + author_email='jar3b@outlook.com', + description='Python handler for logag', + install_requires=[ + 'xid==1.0.4', + ] +)