1.实现一个简单的带颜色的日志import os import colorlog current_path os.path.abspath(os.path.dirname(__file__)) class LogHelp : 日志辅助类 _logger None _close_imme True staticmethod def set_close_flag(flag): LogHelp._close_imme flag staticmethod def _initlog(): import logging import colorlog LogHelp._logger logging.getLogger() # 输出到文件 logfile convert.log hdlr logging.FileHandler(logfile) # 创建一个ColorFormatter来设置日志消息的颜色 color_formatter colorlog.ColoredFormatter( %(log_color)s%(asctime)s - %(levelname)s - %(message)s, log_colors{ DEBUG: yellow, INFO: green, WARNING: yellow, ERROR: red, CRITICAL: red,bg_white, } ) # 将ColorFormatter添加到StreamHandler formatter logging.Formatter(%(asctime)s|%(levelname)s|%(lineno)d|%(funcName)s|%(message)s) hdlr.setFormatter(color_formatter) LogHelp._logger.addHandler(hdlr) # 输出到屏幕 hdlr2 logging.StreamHandler() hdlr2.setFormatter(color_formatter) hdlr2.setLevel(logging.INFO) LogHelp._logger.addHandler(hdlr2) LogHelp._logger.setLevel(logging.NOTSET) #LogHelp._logger.setLevel(logging.INFO) # LogHelp._logger.info(\n\n\n) # LogHelp._logger.info(logger is inited!) staticmethod def get_logger() : if LogHelp._logger is None : LogHelp._initlog() return LogHelp._logger staticmethod def close() : if LogHelp._close_imme: import logging if LogHelp._logger is None : return logging.shutdown() # log macro LOG_DEBUGLogHelp.get_logger().debug LOG_INFOLogHelp.get_logger().info LOG_WARNLogHelp.get_logger().warning LOG_ERRORLogHelp.get_logger().error FOREGROUND_RED 0x0c # red. FOREGROUND_GREEN 0x0a # green. FOREGROUND_BLUE 0x09 # blue. # 按间距中的绿色按钮以运行脚本。 if __name__ __main__: LOG_INFO(hahhahah)2.利用logging实现日志系统。提供更全的自定义内容import logging import datetime from pathlib import Path import shutil import typing from typing import Optional import sys import io class BaseLogger(logging.Logger): # pragma: no cover TODO class LogException(Exception): pass def __init__(self, name): super().__init__(name) self.console_handler: Optional[logging.StreamHandler] None self.console_error_handler: Optional[logging.StreamHandler] None # We can download logs from the BK build windows. So it is not necessary to log to files. self.file_handler: Optional[logging.FileHandler] None def warning(self, msg, *args, **kwargs): self.flush_console_output() super().warning(msg, *args, **kwargs) self.flush_console_error() def error(self, msg, *args, terminateTrue, **kwargs): self.flush_console_output() super().error(msg, *args, **kwargs) self.flush_console_error() if terminate: exit(1) def critical(self, msg, *args, **kwargs): self.flush_console_output() super().critical(msg, *args, **kwargs) self.flush_console_error() raise ValueError(Critical error happened.) def print(self, msg, *args, **kwargs): old_formatter self.console_handler.formatter self.console_handler.formatter logging.Formatter(%(message)s) super().info(msg, *args, **kwargs) self.console_handler.formatter old_formatter def flush(self): if self.console_handler: self.console_handler.flush() if self.console_error_handler: self.console_error_handler.flush() if self.file_handler: self.file_handler.flush() def flush_console_error(self): if self.console_error_handler: self.console_error_handler.flush() def flush_console_output(self): if self.console_handler: self.console_handler.flush() def suspend(self): fh self.file_handler fh.close() self.removeHandler(fh) def recover(self): fh _create_file_handler(self.name, appendTrue) fh.setLevel(logging.INFO) self.addHandler(fh) #创建日志记录器继承自定义的BaseLogger类 def _create_nfs_logger(logger_name, level) - BaseLogger: # pragma: no cover TODO logging.setLoggerClass(NfsLogger) new_logger typing.cast(NfsLogger, logging.getLogger(logger_name)) new_logger.setLevel(logging.DEBUG) info_stream io.TextIOWrapper(sys.stdout.buffer, encodingutf-8) info_handler logging.StreamHandler(info_stream) info_handler.setLevel(level) info_handler.addFilter(lambda record: record.levelno logging.INFO) info_formatter logging.Formatter(%(message)s) info_handler.setFormatter(info_formatter) new_logger.addHandler(info_handler) new_logger.console_handler info_handler error_stream io.TextIOWrapper(sys.stderr.buffer, encodingutf-8) error_handler logging.StreamHandler(error_stream) error_handler.setLevel(logging.WARNING) error_formatter logging.Formatter([%(levelname)s]: %(message)s - %(filename)s:%(lineno)d) error_handler.setFormatter(error_formatter) new_logger.addHandler(error_handler) new_logger.console_error_handler error_handler if common.LOCAL_BUILD: init_log_dir() file_handler _create_file_handler(logger_name) new_logger.addHandler(file_handler) new_logger.file_handler file_handler new_logger.info(fInit logger {logger_name} succeed) return new_logger #初始化日志记录器 def init_logger(logger_name, levellogging.DEBUG): # pragma: no cover TODO global task_logger if task_logger: default_logger.warning(Task logger cannot be recreated!) else: task_logger _create_nfs_logger(logger_name, level) return task_logger task_logger: Optional[BaseLogger] None def logger() - BaseLogger: if task_logger: return task_logger