Skip to content
Snippets Groups Projects

Log to LCU

Merged Jan David Mol requested to merge log-to-lcu into master
3 files
+ 65
6
Compare changes
  • Side-by-side
  • Inline
Files
3
logconfig.py 0 → 100644
+ 54
0
 
import logging
 
 
logger = logging.getLogger()
 
 
def configure_logger(logstash_host: str = "", level = logging.DEBUG, log_extra: dict = None):
 
"""
 
Configure the output of Python's logging module.
 
 
logstash_host: Logstash server to forward a copy of the logs to (f.e. the LCU).
 
level: Configure to use this log level (can be a string, or integer)
 
log_extra: Extra dict to annotate log lines with, or None.
 
"""
 
 
# By default we want to know everything
 
if isinstance(level, str):
 
level_nr = getattr(logging, level.upper(), None)
 
if not isinstance(level_nr, int):
 
raise ValueError('Invalid log level: %s' % level)
 
 
logger.setLevel(level_nr)
 
else:
 
logger.setLevel(level)
 
 
# remove spam from various libraries
 
logging.getLogger("asyncua").setLevel(logging.WARN)
 
logging.getLogger("opcua").setLevel(logging.WARN)
 
logging.getLogger("git").setLevel(logging.WARN)
 
 
# log to stderr, in a way that it can be understood by a human reader
 
handler = logging.StreamHandler()
 
formatter = logging.Formatter(fmt = '%(asctime)s [%(levelname)-8s,%(filename)-20s:%(lineno)-3d] %(message)s', datefmt = '%Y-%m-%dT%H:%M:%S')
 
handler.setFormatter(formatter)
 
logger.addHandler(handler)
 
 
# Log to ELK stack
 
if logstash_host:
 
try:
 
from logstash_async.handler import AsynchronousLogstashHandler, LogstashFormatter
 
 
logger.info(f"Sending logs to Logstash at {logstash_host}")
 
 
# log to the tcp_input of logstash, cache pending messages if we cannot reach the host
 
handler = AsynchronousLogstashHandler(logstash_host, 5959, database_path='pending_log_messages.db')
 
 
# configure log messages
 
formatter = LogstashFormatter(extra=log_extra, tags=["python", "lofar", "pypcc"])
 
handler.setFormatter(formatter)
 
 
# install the handler
 
logger.addHandler(handler)
 
except ImportError:
 
logger.exception("Cannot send logs to Logstash: logstash_async module not found.")
 
except Exception:
 
logger.exception(f"Cannot send logs to Logstash at {logstash_host}")
Loading