Source code for pyglimer.utils.log
'''
:copyright:
The PyGLImER development team (makus@gfz-potsdam.de).
:license:
GNU Lesser General Public License, Version 3
(https://www.gnu.org/copyleft/lesser.html)
:author:
Peter Makus (makus@gfz-potsdam.de)
Created: Monday, 13th September 2021 10:38:53 am
Last Modified: Friday, 7th January 2022 11:05:39 am
'''
import logging
[docs]def start_logger_if_necessary(
name: str, logfile: str, loglvl: int) -> logging.Logger:
"""
Initialise a logger.
:param name: The logger's name
:type name: str
:param logfile: File to log to
:type logfile: str
:param loglvl: Log level
:type loglvl: int
:return: the logger
:rtype: logging.Logger
"""
logger = logging.getLogger(name)
# remove all old handlers: Note that the hasHandlers function can lead
# to problems if there are several loggers already in the system?
while 1:
try:
logger.removeHandler(logger.handlers[0])
except IndexError:
break
logger.setLevel(loglvl)
sh = logging.StreamHandler()
sh.setFormatter(logging.Formatter(
"%(asctime)s %(levelname)-8s %(message)s"))
fh = logging.FileHandler(logfile, mode='w')
fh.setFormatter(logging.Formatter(
"%(asctime)s %(levelname)-8s %(message)s"))
logger.addHandler(sh)
logger.addHandler(fh)
return logger
[docs]def create_mpi_logger(logger: logging.Logger, rank: int) -> logging.Logger:
"""
Creates a very similar logger to the input logger, but with name and
filehandler dependent on mpi rank.
:param logger: The original logger to crete a rank-dependent version on.
:type logger: logging.Logger
:return: The rank dependent logger (different name and different file)
:rtype: logging.Logger
"""
lvl = logger.level
rankstr = str(rank).zfill(3)
name = '%srank%s' % (logger.name, rankstr)
while not logger.hasHandlers() or not (
any(hasattr(h, 'baseFilename') for h in logger.handlers)):
if logger.name == 'root':
raise ValueError(
'The logger used as input has to have a configured'
+ 'FileHandler.')
logger = logger.parent
for h in logger.handlers:
if hasattr(h, 'baseFilename'):
fn = '%srank%s.log' % (h.baseFilename.split('.')[0], rankstr)
try:
return start_logger_if_necessary(name, fn, lvl)
except UnboundLocalError as e:
print(e)
raise ValueError(
'The logger used as input has to have a configured FileHandler.'
)