[d9566e]: / sybil / utils / logging_utils.py

Download this file

69 lines (52 with data), 2.0 kB

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
import logging
import os
LOGGER_NAME = "sybil"
LOGLEVEL_KEY = "LOG_LEVEL"
def _get_formatter(loglevel="INFO"):
warn_fmt = "[%(asctime)s] %(levelname)s - %(message)s"
debug_fmt = "[%(asctime)s] [%(filename)s:%(lineno)d] %(levelname)s - %(message)s"
fmt = debug_fmt if loglevel.upper() in {"DEBUG"} else warn_fmt
return logging.Formatter(
fmt=fmt,
datefmt="%Y-%b-%d %H:%M:%S %Z",
)
def remove_all_handlers(logger):
while logger.hasHandlers():
logger.removeHandler(logger.handlers[0])
def configure_logger(loglevel=None, logger_name=LOGGER_NAME, logfile=None):
"""Do basic logger configuration and set our main logger"""
# Set as environment variable so other processes can retrieve it
if loglevel is None:
loglevel = os.environ.get(LOGLEVEL_KEY, "WARNING")
else:
os.environ[LOGLEVEL_KEY] = loglevel
logger = logging.getLogger(logger_name)
logger.setLevel(loglevel)
remove_all_handlers(logger)
logger.propagate = False
formatter = _get_formatter(loglevel)
def _prep_handler(handler):
for ex_handler in logger.handlers:
if type(ex_handler) == type(handler):
# Remove old handler, don't want to double-handle
logger.removeHandler(ex_handler)
handler.setLevel(loglevel)
handler.setFormatter(formatter)
logger.addHandler(handler)
sh = logging.StreamHandler()
_prep_handler(sh)
if logfile is not None:
fh = logging.FileHandler(logfile, mode="a")
_prep_handler(fh)
return logger
def get_logger(base_name=LOGGER_NAME):
"""
Return a logger.
Use a different logger in each subprocess, though they should all have the same log level.
"""
pid = os.getpid()
logger_name = f"{base_name}-process-{pid}"
logger = logging.getLogger(logger_name)
if not logger.hasHandlers():
configure_logger(logger_name=logger_name)
return logger