import os from datetime import datetime import types from logging import getLogger, DEBUG, INFO from logging import StreamHandler, FileHandler from mlimages.util.file_api import FileAPI def _bool_2_level(boolean): level = INFO if not boolean else DEBUG return level def __close(self): handlers = self.handlers[:] for h in handlers: h.close() self.removeHandler(h) def create_logger(name, debug=False): logger = None logger = getLogger(name) handler = StreamHandler() level = _bool_2_level(debug) handler.setLevel(level) logger.setLevel(level) logger.addHandler(handler) return logger def create_file_logger(root, name, file_name="log.txt", timestamp_format="", debug=False): file_api = FileAPI(root) timestamp = "" if timestamp_format: timestamp = datetime.now().strftime(timestamp_format) else: timestamp = datetime.now().strftime("%Y-%m-%d_%H-%M-%S") folder = name + "_" + timestamp # prepare folder and file with file_api.open_with_mkdir(folder + "/" + file_name) as f: f.write("".encode("utf-8")) log_root = os.path.join(root, folder) logger = create_logger(name, debug) fh = FileHandler(os.path.join(log_root, file_name), encoding="utf-8") fh.setLevel(_bool_2_level(debug)) logger.addHandler(fh) # add close method to release resource logger.close = types.MethodType(__close, logger) return logger, log_root