美文网首页
python 实现自定义 日志模块 logging 打印到屏幕和

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

作者: 数据小新手 | 来源:发表于2020-02-28 20:08 被阅读0次

    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)
    

    相关文章

      网友评论

          本文标题:python 实现自定义 日志模块 logging 打印到屏幕和

          本文链接:https://www.haomeiwen.com/subject/mjerhhtx.html