| import os |
| import sys |
| import errno |
|
|
|
|
| def get_logger(logs_dir: str, file_name: str = "log.txt"): |
| logger = PrintLogger(os.path.join(logs_dir, file_name)) |
| sys.stdout = logger |
| return logger |
|
|
|
|
| class PrintLogger(object): |
|
|
| def __init__(self, fpath=None): |
| """ |
| python standard input/output records |
| """ |
| self.console = sys.stdout |
| self.file = None |
| if fpath is not None: |
| mkdir_if_missing(os.path.dirname(fpath)) |
| self.file = open(fpath, 'w') |
|
|
| def __del__(self): |
| self.close() |
|
|
| def __enter__(self): |
| pass |
|
|
| def __exit__(self, *args): |
| self.close() |
|
|
| def write(self, msg): |
| self.console.write(msg) |
| if self.file is not None: |
| self.file.write(msg) |
|
|
| def write_in(self, msg): |
| """write in log only, not console""" |
| if self.file is not None: |
| self.file.write(msg) |
|
|
| def flush(self): |
| self.console.flush() |
| if self.file is not None: |
| self.file.flush() |
| os.fsync(self.file.fileno()) |
|
|
| def close(self): |
| self.console.close() |
| if self.file is not None: |
| self.file.close() |
|
|
|
|
| def mkdir_if_missing(dir_path): |
| try: |
| os.makedirs(dir_path) |
| except OSError as e: |
| if e.errno != errno.EEXIST: |
| raise |
|
|