mirror of
				https://github.com/KevinMidboe/transatlanticTorrentExpress.git
				synced 2025-10-29 18:00:19 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			108 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			108 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| #!/bin/usr/python3
 | |
| 
 | |
| import logging
 | |
| import os
 | |
| import json
 | |
| import math
 | |
| import uuid
 | |
| import datetime
 | |
| import urllib.request
 | |
| 
 | |
| from utils import getConfig
 | |
| 
 | |
| BASE_DIR = os.path.dirname(os.path.abspath(__file__))
 | |
| LOG_FILE = os.path.join(BASE_DIR, 'output.log')
 | |
| 
 | |
| logger = logging.getLogger('transatlanticTorrentExpress')
 | |
| logger.setLevel(logging.DEBUG)
 | |
| 
 | |
| if not os.path.isfile(LOG_FILE):
 | |
|   print('Log file does not exist yet, creating in project folder')
 | |
|   f = open(LOG_FILE, 'w+')
 | |
|   f.close()
 | |
| 
 | |
| fh = logging.FileHandler(LOG_FILE)
 | |
| fh.setLevel(logging.DEBUG)
 | |
| ch = logging.StreamHandler()
 | |
| ch.setLevel(logging.ERROR)
 | |
| 
 | |
| class ESHandler(logging.Handler):
 | |
|   def __init__(self, *args, **kwargs):
 | |
|     self.host = kwargs.get('host')
 | |
|     self.port = kwargs.get('port')
 | |
|     self.ssl = kwargs.get('ssl') or False
 | |
|     self.apiKey = kwargs.get('apiKey')
 | |
|     self.date = datetime.date.today()
 | |
|     self.sessionID = uuid.uuid4()
 | |
|     self.pid = str(os.getpid())
 | |
| 
 | |
|     logging.StreamHandler.__init__(self)
 | |
| 
 | |
|   def emit(self, record):
 | |
|     self.format(record)
 | |
|     indexURL = 'http://{}/transatlantic_torrent_express/_doc'.format(self.host, self.date.strftime('%Y.%m'))
 | |
|     headers = { 'Content-Type': 'application/json', 'User-Agent': 'transatlanticTorrentExpress/v0.1'}
 | |
|     if self.ssl:
 | |
|       indexURL = indexURL.replace('http', 'https')
 | |
|     if self.port:
 | |
|       indexURL = indexURL.replace(self.host, '{}:{}'.format(self.host, self.port))
 | |
| 
 | |
|     if self.apiKey:
 | |
|       headers['Authorization'] = 'ApiKey {}'.format(self.apiKey)
 | |
| 
 | |
|     doc = {
 | |
|       'severity': record.levelname,
 | |
|       'message': record.message,
 | |
|       '@timestamp': math.trunc(record.created*1000),
 | |
|       'sessionID': str(self.sessionID),
 | |
|       'pid': self.pid
 | |
|     }
 | |
| 
 | |
|     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=headers)
 | |
| 
 | |
|     try:
 | |
|         response = urllib.request.urlopen(req)
 | |
|         response = response.read().decode('utf8')
 | |
|         return response
 | |
|     except urllib.error.HTTPError as e:
 | |
|         print('Unable to reach elastic, error:', e)
 | |
|         return
 | |
| 
 | |
| 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)
 | |
| 
 | |
| config = getConfig()
 | |
| esHost = config['ELASTIC']['host']
 | |
| esPort = config['ELASTIC']['port']
 | |
| esSSL = config['ELASTIC']['ssl']
 | |
| esApiKey = config['ELASTIC']['api_key']
 | |
| esEnabled = config['ELASTIC']['enabled']
 | |
| if esEnabled == 'True':
 | |
|   eh = ESHandler(host=esHost, port=esPort, ssl=esSSL, apiKey=esApiKey)
 | |
|   eh.setLevel(logging.DEBUG)
 | |
| 
 | |
| formatter = logging.Formatter('%(asctime)s %(levelname)8s | %(message)s')
 | |
| fh.setFormatter(formatter)
 | |
| logger.addHandler(fh)
 | |
| logger.addHandler(ch)
 | |
| if esEnabled == 'True':
 | |
|   logger.addHandler(eh)
 | |
| logger = ElasticFieldParameterAdapter(logger)
 |