82 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			82 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
#!/bin/usr/python3
 | 
						|
 | 
						|
import logging
 | 
						|
import os
 | 
						|
import json
 | 
						|
import uuid
 | 
						|
from datetime import datetime, date
 | 
						|
import urllib.request
 | 
						|
 | 
						|
from utils import getConfig, timezoneOffset
 | 
						|
 | 
						|
config = getConfig()
 | 
						|
LOGGER_NAME = config['logger']['name']
 | 
						|
esHost = config['elastic']['host']
 | 
						|
esPort = config['elastic']['port']
 | 
						|
systemTimezone = timezoneOffset()
 | 
						|
 | 
						|
class ESHandler(logging.Handler):
 | 
						|
  def __init__(self, *args, **kwargs):
 | 
						|
    self.host = kwargs.get('host')
 | 
						|
    self.port = kwargs.get('port') or 9200
 | 
						|
    self.date = date.today()
 | 
						|
    self.sessionID = uuid.uuid4()
 | 
						|
 | 
						|
    logging.StreamHandler.__init__(self)
 | 
						|
 | 
						|
  def emit(self, record):
 | 
						|
    self.format(record)
 | 
						|
    datetimeTemplate = '%Y-%m-%dT%H:%M:%S.%f{}'.format(systemTimezone)
 | 
						|
    timestamp = datetime.fromtimestamp(record.created).strftime(datetimeTemplate)
 | 
						|
 | 
						|
    indexURL = 'http://{}:{}/{}-{}/_doc'.format(self.host, self.port, LOGGER_NAME, self.date.strftime('%Y.%m.%d'))
 | 
						|
 | 
						|
    doc = {
 | 
						|
      'severity': record.levelname,
 | 
						|
      'message': record.message,
 | 
						|
      '@timestamp': timestamp,
 | 
						|
      'sessionID': str(self.sessionID)
 | 
						|
    }
 | 
						|
 | 
						|
    if hasattr(record, 'es'):
 | 
						|
      for param in record.es.values():
 | 
						|
        if ': {}'.format(param) in record.message:
 | 
						|
          doc['message'] = record.message.replace(': {}'.format(str(param)), '')
 | 
						|
 | 
						|
      doc = {**record.es, **doc}
 | 
						|
 | 
						|
    payload = json.dumps(doc).encode('utf8')
 | 
						|
    req = urllib.request.Request(indexURL, data=payload,
 | 
						|
                                 headers={'content-type': 'application/json'})
 | 
						|
    response = urllib.request.urlopen(req)
 | 
						|
    response = response.read().decode('utf8')
 | 
						|
    return response
 | 
						|
 | 
						|
class ElasticFieldParameterAdapter(logging.LoggerAdapter):
 | 
						|
  def __init__(self, logger, extra={}):
 | 
						|
    super().__init__(logger, extra)
 | 
						|
 | 
						|
  def process(self, msg, kwargs):
 | 
						|
    if kwargs == {}:
 | 
						|
      return (msg, kwargs)
 | 
						|
    extra = kwargs.get("extra", {})
 | 
						|
    extra.update({"es": kwargs.pop("es", True)})
 | 
						|
    kwargs["extra"] = extra
 | 
						|
    return (msg, kwargs)
 | 
						|
 | 
						|
logger = logging.getLogger(LOGGER_NAME)
 | 
						|
logger.setLevel(logging.DEBUG)
 | 
						|
 | 
						|
ch = logging.StreamHandler()
 | 
						|
ch.setLevel(logging.WARNING)
 | 
						|
 | 
						|
eh = ESHandler(host=esHost, port=esPort)
 | 
						|
eh.setLevel(logging.DEBUG)
 | 
						|
 | 
						|
formatter = logging.Formatter('%(asctime)s %(levelname)8s | %(message)s')
 | 
						|
logger.addHandler(ch)
 | 
						|
logger.addHandler(eh)
 | 
						|
logger = ElasticFieldParameterAdapter(logger)
 | 
						|
 | 
						|
 |