Source code for gnrs.core.logging

"""
This module provides functions for logging.

This source code is licensed under the BSD-3-Clause license found in the
LICENSE file in the root directory of this source tree.
"""
from __future__ import annotations

__author__ = ["Yi Yang", "Rithwik Tom"]
__email__ = "yiy5@andrew.cmu.edu"
__group__ = "https://www.noamarom.com/"

import logging

from mpi4py import MPI


[docs] class GenarrisLogger: """ Sets up the logging. """
[docs] def __init__(self, comm: MPI.Comm, level: str = "DEBUG", parallel_log: str = "redirect_errors") -> None: """ Initialize the logger. Args: comm: MPI communicator level: Log level parallel_log: Parallel log mode """ self.log_level = getattr(logging, level.upper()) self.rank = comm.Get_rank() self.size = comm.Get_size() self.parallel_log = parallel_log self._configure() self.logger = logging.getLogger("genarris") self._welcome() return
def _configure(self) -> None: """ Configure the logger. """ if self.parallel_log == "slave_log": slave_logfile = "Genarris_slave.log" slave_loglevel = logging.DEBUG elif self.parallel_log == "supress": slave_logfile = "/dev/null" slave_loglevel = logging.ERROR elif self.parallel_log == "redirect_errors": slave_logfile = "Genarris.log" slave_loglevel = logging.ERROR else: print("logging method not implemented!") raise RuntimeError if self.rank == 0: logging.basicConfig( filename="Genarris.log", level=self.log_level, format="%(asctime)s: %(levelname)5s: " "%(name)15s- %(message)s", datefmt="%b %d %I:%M:%S %p", ) else: logging.basicConfig( filename=slave_logfile, level=slave_loglevel, format=f"Genarris slave process {self.rank} -" "%(asctime)s: %(levelname)5s: " "%(name)15s- %(message)s", datefmt="%b %d %I:%M:%S %p", ) return def _welcome(self) -> None: """ Welcome message. """ self.logger.info(10 * "xx" + " STARTING GENARRIS " + 10 * "xx") self.logger.info("Initializing Genarris Logger") self.logger.info(f"Launching Genarris on {self.size} process(es)") return
[docs] def reset_loglevel(self, level: str) -> None: """ Reset the log level. Args: level: Log level """ self.logger.info(f"Setting new log level: {level}") self.log_level = getattr(logging, level.upper()) logging.getLogger().setLevel(self.log_level)