Logger and config setup. Logger also pushes to elastic

This commit is contained in:
2021-10-03 18:51:10 +02:00
parent 63eb29c4c5
commit b75671e68c
3 changed files with 113 additions and 0 deletions

11
config.yaml Normal file
View File

@@ -0,0 +1,11 @@
logger:
name: brewlogger
ch_level: INFO
elastic:
host: elastic.schleppe
port: 9200
ssl: True
database:
name: brew.db

79
logger.py Normal file
View File

@@ -0,0 +1,79 @@
#!/bin/usr/python3
import logging
import os
import json
import uuid
from datetime import datetime, date
import urllib.request
from utils import getConfig
config = getConfig()
LOGGER_NAME = config['logger']['name']
esHost = config['elastic']['host']
esPort = config['elastic']['port']
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)
timestamp = datetime.fromtimestamp(record.created).strftime('%Y-%m-%dT%H:%M:%S.%f+02:00')
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)

23
utils.py Normal file
View File

@@ -0,0 +1,23 @@
#!/bin/usr/python3
import os
import yaml
import pytest
def loadYaml(filePath):
with open(filePath, "r") as stream:
try:
return yaml.safe_load(stream)
except yaml.YAMLError as exception:
print('Error: {} is unparsable'.format(filePath))
print(exception)
def getConfig():
pwd = os.path.dirname(os.path.abspath(__file__))
path = os.path.join(pwd, 'config.yaml')
if not os.path.isfile(path):
print('Please fill out and rename config file. Check README for more info.')
exit(0)
return loadYaml(path)