zoukankan      html  css  js  c++  java
  • python中的logging模块学习

    Python的logging模块

    Logging的基本信息:

    l  默认的情况下python的logging模块打印到控制台,只显示大于等于warning级别的日志

    l  日志级别:critical > error > warning > info > debug > notset

    Logging的基本组件:

    1.   logger

    l  logger是一个树形层级结构,输出信息之前都要获得一个logger

    l  logger = logging.getLogger() 返回一个默认的logger也即rootLogger,并应用默认的日志级别,即只有日志等级大于等于warning级别的信息输出

    l  也可以通过logger.setLevel(lel)指定最低的日志级别,可用的日志级别有:

    l  logging.DEBUG,logging.INFO,Logging.ERROR,logging.CRITICAL;logger.debug(),logger.info().logger.warning(),logger.error(),logger.critical()

    2.   handler

    l  handler对象负责发送相关的信息到指定目的地

    l  handler.setlevel(lel):指定日志级别,低于lel级别的日志将被忽略

    l  handler.setFormatter():给handler选择一个Formatter

    l  logging.StreamHandler 可以向类似与sys.stdout或者sys.stderr的任何文件对象(file object)输出信息

    l  logging.FileHander 用于向一个文件输出日志信息

    l  logging.handlers.RotatingFileHandler 类似于上面的FileHandler,但是它可以管理文件大小,当文件达到一定大小之后,它会自动将当前日志文件改名,然后创建一个新的同名日志文件继续输出

    l  logging.handlers.TimeRotatingFileHandler和RotatingFileHandler类似,不过它没有通过判断文件大小来决定何时重新创建日志文件,而是间隔一定时间就自动创建新的日志文件

    Formatter

    l  formatter对象设置日志信息最后的规则,结构和内容,默认的时间格式为%Y-%m-%d %H:%M:%S

    Filter

    l  filter:限制只有满足过滤规则的日志才会输出

    l  比如定义了filter = logging.Filter(‘jiyanjiao’),并将这个Filter添加到一个Handler上,则使用该handler的Logger中只有名字带’jiyanjiao’前缀的logger才能输出其日志

    下面就来说一下具体的应用吧

    l  需求是这样的:想打印自己的log,因为使用print每次都需要编辑替换觉得很麻烦,想让自己的程序更加正规些,也想区分不同级别log的颜色所以写下了如下的代码

    import logging
    import ctypes
    
    '''
     定义颜色日志级别颜色变量:
     '''
    FOREGROUND_WHITE = 0x0007
    FOREGROUND_BLUE = 0x01
    FOREGROUND_GREEN = 0x02
    FOREGROUND_RED = 0x04
    FOREGROUND_YELLOW = FOREGROUND_RED | FOREGROUND_GREEN
    STD_OUTPUT_HANDLE = -11
    std_out_handle = ctypes.windll.kernel32.GetStdHandle(STD_OUTPUT_HANDLE)
    def set_color(color, handle=std_out_handle):
        bool = ctypes.windll.kernel32.SetConsoleTextAttribute(handle, color)
        return bool
    
    class mylogger(object):
    
        def __init__(self,name='mylogger'):
            self.logger = logging.getLogger(name)
            self.init_logger()
    
        '''
        创建一个file_handler,用于写入日志文件
        再创建一个stream_handler,用于输出到控制台
        定义handler的输出格式formatter
            %(asctime)s   字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒
            %(name)s      Logger的名字
            %(levelname)s  文本形式的日志级别
            %(message)s    用户输出的消息
        '''
    
        def init_logger(self):
            self.logger.setLevel(logging.DEBUG)
            file_handler = logging.FileHandler('D:/tmp/test.log')
            stream_handler = logging.StreamHandler()
    
            formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
            file_handler.setFormatter(formatter)
            stream_handler.setFormatter(formatter)
    
            self.logger.addHandler(file_handler)
            self.logger.addHandler(stream_handler)
    
        def debug(self,message,color=FOREGROUND_BLUE):
            set_color(color)
            self.logger.debug(message)
            set_color(FOREGROUND_WHITE)
    
        def info(self, message, color=FOREGROUND_GREEN):
            set_color(color)
            self.logger.info(message)
            set_color(FOREGROUND_WHITE)
    
        def warn(self,message,color=FOREGROUND_YELLOW):
            set_color(color)
            self.logger.warn(message)
            set_color(FOREGROUND_WHITE)
    
        def error(self, message,color=FOREGROUND_RED):
            set_color(color)
            self.logger.error(message)
            set_color(FOREGROUND_WHITE)
    
        def critical(self,message,color=FOREGROUND_RED):
            set_color(color)
            self.logger.critical(message)
            set_color(FOREGROUND_WHITE)
    
    if __name__ == '__main__':
        mylogger = mylogger()
        mylogger.debug('这是debug信息')
        mylogger.info('这是info信息')
        mylogger.warn('这是warning')
        mylogger.error('这是error信息')
        mylogger.critical('这是critical信息')

    打印的结果:

    那么可能有同学就有疑问了那么ctypes是什么

    l  Ctypes是python的一个外部库,提供和c语言兼容的数据类型,可以很方便的调用C DLL中的函数

  • 相关阅读:
    关于如何使`(a === 1 && a === 2 && a === 3)`返回`true`问题的思考
    选择适合的类型判断方式
    this的指向问题
    MarkDown基础语法记录
    快速掌握vuex状态管理
    自己如何手动实现一个isNaN的方法
    移动端webapp使用flex布局解决底部导航被手机键盘顶起
    swiper文字内容超出一屏的时候如何实现区域滚动不翻页
    css3动画如何实现停止以后停留在最后一帧动画
    检测任意数据类型
  • 原文地址:https://www.cnblogs.com/jiyanjiao-702521/p/9328463.html
Copyright © 2011-2022 走看看