zoukankan      html  css  js  c++  java
  • loggin 模块及其单例模式

    1. loggin模块的5个级别:

    # logging.debug('debug message')      # 调试
    # logging.info('info message')        # 普通信息
    # logging.warning('warning message')  # 警告
    # logging.error('error message')      # 错误信息
    # logging.critical('critical message')# 严重错误
    
    # 默认情况下 不打印warning以下级别的信息
    View Code

    2. loggin模块的简单使用

    logging.basicConfig(level=logging.DEBUG,
                         format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
                         datefmt='%a, %d %b %Y %H:%M:%S')
    View Code

     此方法的缺点:

       1.中文显示乱码
       2.不能同时输出到文件和屏幕

    3.logger对象的方式来使用logging模块
    import logging
    
    
    logger = logging.getLogger()   # 首先 先创建logger对象
    logger.setLevel(logging.DEBUG)  #设置显示级别
    
    fh = logging.FileHandler('log',encoding='utf-8')# 第二 创建一个文件操作符
    
    
    sh = logging.StreamHandler()# 第三 创建一个屏幕操作符
    
    
    fmt = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')# 第四 创建一个格式
    
    
    logger.addHandler(fh)#第五 logger 绑定 文件操作符
    
    logger.addHandler(sh)#第六 logger 绑定 屏幕操作符
    
    fh.setFormatter(fmt)#第七 文件操作符 绑定格式
    
    sh.setFormatter(fmt)#第八 屏幕操作符 绑定格式
    
    logger.debug('logger debug message')
    logger.info('logger info message')
    logger.warning('logger warning message')
    logger.error('logger error message')
    logger.critical('logger critical message')
    View Code

    4. 面向对象:loggin的单例模式

    import logging
    
    
    class Log(object):
        def __init__(self, level=logging.DEBUG):
            logger = logging.getLogger()
            logger.setLevel(level)
            fh = logging.FileHandler('test.log', encoding='utf-8')
            ch = logging.StreamHandler()
            formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
            fh.setFormatter(formatter)
            ch.setFormatter(formatter)
            logger.addHandler(fh)
            logger.addHandler(ch)
            self.logger = logger
    
    
    log = Log()
    log.logger.info("wahaha01")
    log = Log()
    log.logger.info("wahaha02")
    log = Log()
    log.logger.info("wahaha03")
    View Code

    当执行上面代码时, 输出结果如图: 

     这是由于,其源码中运用了单例模式

    想要解决这种情况, 就需要自己重写一个单例模式, 如下代码:

    class Log(object):
        __instance = None
        def __new__(cls, *args, **kwargs):
            if not cls.__instance:
                cls.__instance = super().__new__(cls)
            return cls.__instance
    
        def __init__(self,level = logging.DEBUG):
            if 'logger' not in self.__dict__:
                logger = logging.getLogger()
                logger.setLevel(level)
                fh = logging.FileHandler('test.log', encoding='utf-8')
                ch = logging.StreamHandler()
                formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
                fh.setFormatter(formatter)
                ch.setFormatter(formatter)
                logger.addHandler(fh)
                logger.addHandler(ch)
                self.logger = logger
    
    log = Log()
    log.logger.info("wahaha01")
    log = Log()
    log.logger.info("wahaha02")
    log = Log()
    log.logger.info("wahaha03")
    View Code

    输出结果为:

     
  • 相关阅读:
    ASP.NET 2.0中使用webpart系列控件
    ASP.NET AJAX入门系列(11):在多个UpdatePanle中使用Timer控件(转)
    WebService SoapHeader的使用
    (转)对程序员职业的一些建议
    android组件间通信
    关于android library project
    (转)我6个月的学习编程经历:从”大齿怪“到“狂欢者”
    DOM的一个要注意的地方
    android的休眠对service,activity的影响
    java的字符串和char数组
  • 原文地址:https://www.cnblogs.com/LL97155472/p/10711977.html
Copyright © 2011-2022 走看看