python 实现自定义 日志模块 logging 打印到屏幕和保存到文件

python 日志模块 logging

FileHandler:

以“a”(追加)的方式将日志输出到文件,如果文件不存在,则自动创建该文件。

StreamHandler:

将日志输出到Stream,比如sys.stderr、sys.stdour、文件流等。

RotatingFileHandler:

将日志输出到文件,可以通过设置文件大小,文件达到上限后自动创建一个新的文件来继续输出文件。

class logging.handlers.RotatingFileHandler(filename, mode='a', maxBytes=0, backupCount=0, encoding=None, delay=0)

参数maxBytes和backupCount允许日志文件在达到maxBytes时rollover.当文件大小达到或者超过maxBytes时,就会新创建一个日志文件。上述的这两个参数任一一个为0时,rollover都不会发生。也就是就文件没有maxBytes限制。backupcount是备份数目,也就是最多能有多少个备份。命名会在日志的base_name后面加上.0-.n的后缀,如example.log.1,example.log.1,…,example.log.10。当前使用的日志文件为base_name.log。

TimedRotatingFileHandler:

将日志输出到文件,可以通过设置时间,使日志根据不同的时间自动创建并输出到不同的文件中。

class logging.handlers.TimedRotatingFileHandler(filename, when='h', interval=1, backupCount=0, encoding=None, delay=False, utc=False)

参数when决定了时间间隔的类型,参数interval决定了多少的时间间隔。如when=‘D’,interval=2,就是指两天的时间间隔,backupCount决定了能留几个日志文件。超过数量就会丢弃掉老的日志文件。

Example


class Log:
    def __init__(
            self,
            logger_name=os.path.basename(
                sys.argv[0])):
        """
        By default module name is used as the logger name; if no output directory is provided, file_handler will not
        be used.
        :param logger_name:
        :param log_dir:
        """
        print('log init')
        self.start_time = None
        self.end_time = None
        self.log_path = None
        self.logger = logging.getLogger(logger_name)
        self.logger.setLevel(logging.DEBUG)

        self.formatter = logging.Formatter(
            '%(asctime)s - %(name)s - %(levelname)s - %(message)s',
            "%Y-%m-%d %H:%M:%S")

    def set_print(self):
        """
        decide whether to print log
        设置日志是否打印
        :return:
        """
        self.stream_handler = logging.StreamHandler()
        self.stream_handler.setLevel(logging.DEBUG)
        self.stream_handler.setFormatter(self.formatter)
        self.logger.addHandler(self.stream_handler)

    def set_path(self, log_path):
        """
        dicide whether to save log to path
        设置日志是否保存到文件夹
        :param log_path:
        :return:
        """
        self.log_path = log_path
        if self.log_path is not None:
            p = Path(self.log_path)
            if not os.path.exists(str(p.parent)):
                print(
                    "Creating logging directory {}".format(p.parent))
                os.makedirs(str(p.parent))

            # fname = datetime.strftime(datetime.now(), "%Y%m%d_%H:%M:%S")

            # log_filename = os.path.join(log_dir, fname)
            self.file_handler = logging.FileHandler(self.log_path)
            self.file_handler.setLevel(logging.INFO)
            self.file_handler.setFormatter(self.formatter)

            self.logger.addHandler(self.file_handler)
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 在现实生活中,记录日志非常重要。银行转账时会有转账记录;飞机飞行过程中,会有黑盒子(飞行数据记录器)记录飞行过程中...
    chliar阅读 4,174评论 1 0
  • logging模块介绍: logging是python内置的标准库模块,模块提供不同的日志级别,并可以采用不同的方...
    4ffde5305e8f阅读 7,866评论 0 2
  • 一、tracker.conf # 这个配置文件是否无效,false表示有效# is this config fil...
    依然饭太稀阅读 7,093评论 0 2
  • 日志 日志是跟踪软件运行时所发生的事件的一种方法。软件开发者在代码中调用日志函数,表明发生了特定的事件。事件由描述...
    桃子味的白开水阅读 1,761评论 0 0
  • Day05的课程要点记录详细教程地址:Day5 - 常用模块学习 | 第四篇:模块 一、模块介绍 1.1 定义 模...
    乘风逐月阅读 3,211评论 0 1