| | 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 |
| |
|