Logger and config setup. Logger also pushes to elastic
This commit is contained in:
11
config.yaml
Normal file
11
config.yaml
Normal 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
79
logger.py
Normal 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
23
utils.py
Normal 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)
|
||||
|
||||
Reference in New Issue
Block a user