apv

- 🐍 advanced python logging 📔
git clone git://git.acid.vegas/apv.git
Log | Files | Refs | Archive | README | LICENSE

graylog.py (2226B)

      1 import logging
      2 import json
      3 import socket
      4 import zlib
      5 
      6 class GraylogHandler(logging.Handler):
      7     def __init__(self, host, port):
      8         super().__init__()
      9         self.host = host
     10         self.port = port
     11         self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
     12         
     13         # Mapping from Python logging levels to Graylog (syslog) levels
     14         self.level_mapping = {
     15             logging.CRITICAL : 2, # Critical
     16             logging.ERROR    : 3, # Error
     17             logging.WARNING  : 4, # Warning
     18             logging.INFO     : 6, # Informational
     19             logging.DEBUG    : 7, # Debug
     20             logging.NOTSET   : 7  # Default to Debug
     21         }
     22 
     23     def emit(self, record):
     24         try:
     25             log_entry = self.format(record)
     26             graylog_level = self.level_mapping.get(record.levelno, 7)
     27             
     28             gelf_message = {
     29                 'version'       : '1.1',
     30                 'host'          : socket.gethostname(),
     31                 'short_message' : record.getMessage(),
     32                 'full_message'  : log_entry,
     33                 'timestamp'     : record.created,
     34                 'level'         : graylog_level,
     35                 '_logger_name'  : record.name,
     36                 '_file'         : record.pathname,
     37                 '_line'         : record.lineno,
     38                 '_function'     : record.funcName,
     39                 '_module'       : record.module,
     40             }
     41             
     42             message = json.dumps(gelf_message).encode('utf-8')
     43             compressed = zlib.compress(message)
     44             self.sock.sendto(compressed, (self.host, self.port))
     45         except Exception:
     46             self.handleError(record) 
     47 
     48 def setup_graylog_handler(level_num: int, graylog_host: str, graylog_port: int):
     49     '''Set up the Graylog handler.'''
     50     if graylog_host is None or graylog_port is None:
     51         logging.error('Graylog host and port must be specified for Graylog handler.')
     52         return
     53 
     54     graylog_handler = GraylogHandler(graylog_host, graylog_port)
     55     graylog_handler.setLevel(level_num)
     56     graylog_formatter = logging.Formatter(fmt='%(message)s')
     57     graylog_handler.setFormatter(graylog_formatter)
     58     logging.getLogger().addHandler(graylog_handler)