(logger_name, logger_filename)
| 15 | |
| 16 | |
| 17 | def build_logger(logger_name, logger_filename): |
| 18 | global handler |
| 19 | |
| 20 | formatter = logging.Formatter( |
| 21 | fmt="%(asctime)s | %(levelname)s | %(name)s | %(message)s", |
| 22 | datefmt="%Y-%m-%d %H:%M:%S", |
| 23 | ) |
| 24 | |
| 25 | # Set the format of root handlers |
| 26 | if not logging.getLogger().handlers: |
| 27 | logging.basicConfig(level=logging.INFO) |
| 28 | logging.getLogger().handlers[0].setFormatter(formatter) |
| 29 | |
| 30 | # Redirect stdout and stderr to loggers |
| 31 | stdout_logger = logging.getLogger("stdout") |
| 32 | stdout_logger.setLevel(logging.INFO) |
| 33 | sl = StreamToLogger(stdout_logger, logging.INFO) |
| 34 | sys.stdout = sl |
| 35 | |
| 36 | stderr_logger = logging.getLogger("stderr") |
| 37 | stderr_logger.setLevel(logging.ERROR) |
| 38 | sl = StreamToLogger(stderr_logger, logging.ERROR) |
| 39 | sys.stderr = sl |
| 40 | |
| 41 | # Get logger |
| 42 | logger = logging.getLogger(logger_name) |
| 43 | logger.setLevel(logging.INFO) |
| 44 | |
| 45 | # Add a file handler for all loggers |
| 46 | if handler is None: |
| 47 | os.makedirs(LOGDIR, exist_ok=True) |
| 48 | filename = os.path.join(LOGDIR, logger_filename) |
| 49 | handler = logging.handlers.TimedRotatingFileHandler( |
| 50 | filename, when='D', utc=True, encoding='UTF-8') |
| 51 | handler.setFormatter(formatter) |
| 52 | |
| 53 | for name, item in logging.root.manager.loggerDict.items(): |
| 54 | if isinstance(item, logging.Logger): |
| 55 | item.addHandler(handler) |
| 56 | |
| 57 | return logger |
| 58 | |
| 59 | |
| 60 | class StreamToLogger(object): |
no test coverage detected