Source code for metator.log
#!/usr/bin/env python3
# coding: utf-8
"""Basic logging setup for metaTOR
Basic logging setup with three main handlers (stdout, log file and optionally
texting with the right API). By default the log file is disabled, but can be
enabled or changed using set_file_handler.
"""
import logging
import logging.handlers
import requests
import json
TEXT_CREDENTIALS_DEFAULT_PATH = "text_credentials.json"
CURRENT_LOG_LEVEL = logging.INFO
logging.captureWarnings(True)
logger = logging.getLogger("metator_logger")
logger.setLevel(CURRENT_LOG_LEVEL)
logfile_formatter = logging.Formatter(
"%(asctime)s :: %(levelname)s :: %(message)s", datefmt="%Y-%m-%d,%H:%M:%S"
)
stdout_formatter = logging.Formatter("%(levelname)s :: %(message)s")
text_formatter = logging.Formatter("%(message)s")
stream_handler = logging.StreamHandler()
stream_handler.setLevel(logging.DEBUG)
stream_handler.setFormatter(stdout_formatter)
logger.addHandler(stream_handler)
logger.propagate = False
[docs]def set_file_handler(log_path, formatter=logfile_formatter):
"""Change the file handler for custom log file location"""
filehandler = logging.FileHandler(log_path, "a")
filehandler.setLevel(logging.INFO)
filehandler.setFormatter(formatter)
for hdlr in logger.handlers[:]: # remove the existing file handlers
if isinstance(hdlr, logging.FileHandler):
logger.removeHandler(hdlr)
logger.addHandler(filehandler) # set the new handler
[docs]def setup_text_logging(credentials=TEXT_CREDENTIALS_DEFAULT_PATH):
"""Setup text logging
Setup text notifications on errors with a basic API. In order for it to
work, a file named 'text_credentials.json' must be in the directory where
a command is run. The logger performs a GET request to a text notification
API.
Parameters
----------
credentials : str or pathlib.Path
A JSON file with necessary credentials for the GET request
"""
with open(credentials) as cred_handle:
cred_dict = json.load(cred_handle)
api_service = cred_dict.pop("api_service")
class TextHandler(logging.Handler):
def emit(self, record):
log_entry = self.format(record)
cred_dict["msg"] = log_entry
return requests.get(api_service, cred_dict)
sms_handler = TextHandler()
sms_handler.setLevel(logging.ERROR)
sms_handler.setFormatter(text_formatter)
logger.addHandler(sms_handler)
try:
setup_text_logging(TEXT_CREDENTIALS_DEFAULT_PATH)
except FileNotFoundError:
pass