zoukankan      html  css  js  c++  java
  • Python logging日志模块 封装完善

    import logging
    import os
    
    
    class Log:
        '''
        模块化使用
        : 创建一个logger对象, 并且进行初始化设置
        : 将logger对象进行返回, 方便使用
        : NOTSET < DEBUG < INFO < WARNING < ERROR < CRITICAL
        : 注意这里有个大坑, NOTSET不是显示所有消息, 而是默认的 WARNING 等级
        : 想要显示所有的消息, 把等级设置为 logging.DEBUG 或者 10
        : logger 和 handle的等级是谁高用谁, 比如 DEBUG和WARNING 不管谁先设置, 都是用 WARNING 等级
        '''
        def __init__(self, logger_name="logger"):
            self.logger = logging.getLogger(logger_name)    # 创建一个logger对象
            self.logger.setLevel(logging.DEBUG)             # NOTSET 默认是WARING
    
        def create_handle(self, log_level=logging.DEBUG, log_file=None):
            '''
            : log_level 等级
            : NOTSET < DEBUG < INFO < WARNING < ERROR < CRITICAL
            : 0 < 10 < 20 < 30 < 40 < 50
            '''
            # 判断是终端输出还是文件输出
            if log_file == None:
                handle = logging.StreamHandler()                            # terminal print
    
            else:
                handle = logging.FileHandler(log_file, encoding="utf-8")    # write to file
            handle.setLevel(log_level)                                      # 设置handle的等级
    
            # 设置log输出格式
            formatter = logging.Formatter("%(levelname)s - %(asctime)s - %(filename)s[line:%(lineno)d] - %(message)s",datefmt='%Y-%m-%d %a %H:%M:%S')
            handle.setFormatter(formatter)
    
            # 添加handle到logger
            self.logger.addHandler(handle)
    
        def return_logger(self):
            '''
            :return: 返回logger以便使用
            '''
            return self.logger
    
    
    def create_log_file():
        '''
        创建一个和当前文件所在目录同级别的一个log目录
        log文件: log_file.log
        '''
        log_dir = os.path.join(os.path.abspath("../.."), "log")
        if not os.path.exists(log_dir):
            os.mkdir(log_dir)
        log_path = os.path.join(log_dir, "log_file.log")
        return log_path
    
    
    def get_logger(logger_name:str = "default_logger", log_file=None, log_file_level=logging.INFO, log_print_level=logging.DEBUG):
        '''
        传入logger名字, 自动创建两个handle, 一个打印输出 默认为DEBUG, 一个日志文件记录 默认为INFO
        :param logger_name: string
        :return: logger
        '''
        if log_file:
            if os.path.exists(log_file):
                log_path = log_file
            else:
                print("---Log文件地址不存在, 重新创建Log文件---")
                log_path = create_log_file()
        else:
            print("---未给出Log文件路径, 创建Log文件---")
            log_path = create_log_file()
    
        log_obj = Log(logger_name=logger_name)
        log_obj.create_handle(log_level=log_print_level)
        log_obj.create_handle(log_level=log_file_level, log_file=log_path)
        logger = log_obj.return_logger()
        logger.warning("--- " + logger_name + " init success ---")
        return logger
    
    
    if __name__ == "__main__":
        # 测试
        # log_obj = Log(logger_name="test_log")
        # log_obj.create_handle()
        # logger = log_obj.return_logger()
        # logger.info('test_log')
        # logger.warning("warning")
    
    
        get_logger()
    
  • 相关阅读:
    转: React系统的入门系统
    转: Android官方培训课程中文版(v0.9.5)
    释放Linux系统缓存
    Hyperledger Fabric1.0环境搭建
    JS中的call、apply、bind
    资产和负债
    JS以指定格式获取当前日期
    apache2.4配置ssl
    Apache2.4整合tomcat8
    使用JDK将tomcat变成https访问
  • 原文地址:https://www.cnblogs.com/MasonHu/p/14143138.html
Copyright © 2011-2022 走看看