| |
| |
|
|
| from pathlib import Path |
| import logging |
|
|
|
|
| class BaseLogger: |
| """ |
| Class for defining logger. |
| """ |
| _unexecuted_configure = True |
|
|
| @classmethod |
| def get_logger(cls, name: str) -> logging.Logger: |
| """ |
| Set logger. |
| Args: |
| name (str): If needed, potentially hierarchical name is desired, eg. lib.net, lib.dataloader, etc. |
| For the details, see https://docs.python.org/3/library/logging.html?highlight=logging#module-logging. |
| Returns: |
| logging.Logger: logger |
| """ |
| if cls._unexecuted_configure: |
| cls._init_logger() |
|
|
| return logging.getLogger('nervus.{}'.format(name)) |
|
|
| @classmethod |
| def _init_logger(cls) -> None: |
| """ |
| Configure logger. |
| """ |
| _root_logger = logging.getLogger('nervus') |
| _root_logger.setLevel(logging.DEBUG) |
| formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s') |
|
|
| log_dir = Path('logs') |
| log_dir.mkdir(parents=True, exist_ok=True) |
| log_path = Path(log_dir, 'log.log') |
|
|
| |
| |
| fh_err = logging.FileHandler(log_path) |
| fh_err.setLevel(logging.WARNING) |
| fh_err.setFormatter(formatter) |
| fh_err.addFilter(lambda log_record: not ('BdbQuit' in str(log_record.exc_info)) and (log_record.levelno >= logging.WARNING)) |
| _root_logger.addHandler(fh_err) |
|
|
| |
| fh = logging.FileHandler(log_path) |
| fh.setLevel(logging.DEBUG) |
| fh.addFilter(lambda log_record: log_record.levelno < logging.WARNING) |
| _root_logger.addHandler(fh) |
|
|
| |
| |
| ch_err = logging.StreamHandler() |
| ch_err.setLevel(logging.WARNING) |
| ch_err.setFormatter(formatter) |
| ch_err.addFilter(lambda log_record: log_record.levelno >= logging.WARNING) |
| _root_logger.addHandler(ch_err) |
|
|
| |
| ch = logging.StreamHandler() |
| ch.setLevel(logging.DEBUG) |
| ch.addFilter(lambda log_record: log_record.levelno < logging.WARNING) |
| _root_logger.addHandler(ch) |
|
|
| cls._unexecuted_configure = False |
|
|
|
|