zoukankan      html  css  js  c++  java
  • python中logging模块使用

    1、logging模块使用场景

           在写程序的时候,尤其是大型的程序,在程序中加入日志系统是必不可少的,它能记录很多的信息。刚刚接触python的时候肯定都在用print来输出信息,这样是最简单的输出,正是因为这样,在调试的时候还要去逐个的去更新print后面的内容,代码少的时候还好,但是当代码量到达一定数量时,使用logging就是一种好的选择

    2、loggging对应日志的级别

    # coding:utf-8
    import logging
    
    logging.debug("test debug")
    logging.info("test info")
    logging.warning("test warning")
    logging.error("test error")
    logging.critical("test critical")

    回显信息:

    结果说明:

    默认生成的日志root logger的level是logging.WARNING,低于该级别的就不输出了

    日志级别优先级:CRITICAL > ERROR > WARNING > INFO > DEBUG

    debug : 打印全部的日志,详细的信息,通常只出现在诊断问题上

    info : 打印info,warning,error,critical级别的日志,确认一切按预期运行

    warning : 打印warning,error,critical级别的日志,一个迹象表明,一些意想不到的事情发生了,或表明一些问题在不久的将来(例如。磁盘空间低”),这个软件还能按预期工作

    error : 打印error,critical级别的日志,更严重的问题,软件没能执行一些功能

    critical : 打印critical级别,一个严重的错误,这表明程序本身可能无法继续运行

    如何需要展低于waring级别下的日志信息:则需要设置NOTSET级别来显示

    import logging
    
    logging.basicConfig(level=logging.NOTSET)
    logging.debug("test debug")

    回显信息:

    3、常见方法和参数说明

     logging.Formatter():这个类配置了日志的格式,在里面自定义设置日期和时间,输出日志的时候将会按照设置的格式显示内容

    Logging.Logger:Logger是Logging模块的主体,进行以下三项工作:
    1. 为程序提供记录日志的接口
    2. 判断日志所处级别,并判断是否要过滤
    3. 根据其日志级别将该条日志分发给不同handler
    常用函数有:
    Logger.setLevel() 设置日志级别
    Logger.addHandler() 和 Logger.removeHandler() 添加和删除一个Handler
    Logger.addFilter() 添加一个Filter,过滤作用
    Logging.Handler:Handler基于日志级别对日志进行分发,如设置为WARNING级别的Handler只会处理WARNING及以上级别的日志。
    常用函数有:
    setLevel() 设置级别
    setFormatter() 设置Formatter

    4、日志输出---控制台

    import logging  # 引入logging模块
    logging.basicConfig(level=logging.DEBUG,
                        format='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s')  # logging.basicConfig函数对日志的输出格式及方式做相关配置
    # 由于日志基本配置中级别设置为DEBUG,所以一下打印信息将会全部显示在控制台上
    logging.info('loggging info message')
    logging.debug('loggging debug message')
    logging.warning('loggging a warning message')
    logging.error('loggging error message')
    logging.critical('loggging critical message')

    5、日志输出--日志文件和控制台

     1、初始化 logger = logging.getLogger("endlesscode"),getLogger()方法后面最好加上所要日志记录的模块名字,后面的日志格式中的%(name)s 对应的是这里的模块名字

    2、设置级别 logger.setLevel(logging.DEBUG),Logging中有NOTSET < DEBUG < INFO < WARNING < ERROR < CRITICAL这几种级别,日志会记录设置级别以上的日志

    3、设置Filehandler和StreamHandler来把日志记录到文件里,同时设置记录文件的日志级别和控制台打印日志的文件级别--Handler,常用的是StreamHandler和FileHandler,windows下你可以简单理解为一个是console和文件日志,一个打印在CMD窗口上,一个记录在一个文件上

    4、设置日志格式

    --------------------------------------------------------------------

    及常见日志格式说明:

    %(name)s Logger的名字
    %(levelname)s 文本形式的日志级别
    %(message)s 用户输出的消息
    %(asctime)s 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒
    %(levelno)s 数字形式的日志级别
    %(pathname)s 调用日志输出函数的模块的完整路径名,可能没有
    %(filename)s 调用日志输出函数的模块的文件名
    %(module)s  调用日志输出函数的模块名
    %(funcName)s 调用日志输出函数的函数名
    %(lineno)d 调用日志输出函数的语句所在的代码行
    %(created)f 当前时间,用UNIX标准的表示时间的浮 点数表示
    %(relativeCreated)d 输出日志信息时的,自Logger创建以 来的毫秒数

    # getLogger()方法后面加上所要日志记录的模块名字
    logger = logging.getLogger("Y_Test")
    logger.setLevel(logging.DEBUG)
    # 建立一个filehandler来把日志记录在文件里,级别为debug以上
    fh = logging.FileHandler("spam.log")
    fh.setLevel(logging.DEBUG)
    # 建立一个streamhandler来把日志打在CMD窗口上,级别为error以上
    ch = logging.StreamHandler()
    ch.setLevel(logging.ERROR)
    # 设置日志格式
    formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
    ch.setFormatter(formatter)
    fh.setFormatter(formatter)
    # 将相应的handler添加在logger对象中
    logger.addHandler(ch)
    logger.addHandler(fh)
    # 开始打日志
    logger.debug("debug message")
    logger.info("info message")
    logger.warn("warn message")
    logger.error("error message")
    logger.critical("critical message")

    6、当一个项目比较大的时候,不同的文件中都要用到Log,可以考虑将其封装为一个类来使用

    # coding:utf-8
    import logging
    
    __author__ = 'YangJun'
    
    
    # 普通logging控制台输出和文件日志输出格式及调用
    # logger = logging.getLogger('Clarence')
    # logger.setLevel(logging.INFO)
    # # logging.basicConfig(level=logging.INFO,
    # #                    format='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s')  # 控制台日志输出日志格式
    #
    # Format = logging.Formatter(fmt="%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s")
    # fh = logging.FileHandler("test.log")
    # fh.setLevel(logging.DEBUG)
    # fh.setFormatter(Format)
    # logger.addHandler(fh)
    #
    # sh = logging.StreamHandler()
    # sh.setLevel(logging.INFO)
    # sh.format(Format)
    # logger.addHandler(sh)
    
    
    # 重新封装logging中控制台和文件日志输出,当项目中存在多处日志打印时,可封装日志模块
    class Logger:
        def __init__(self, name, sh_level, ft_level, path):
            self.logger = logging.getLogger(name)
            self.logger.setLevel(logging.INFO)
            Format = logging.Formatter(
                fmt="%(asctime)s - %(name)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s")
    #定义日志内容格式时,必须通过logging.Formatter(曾有遗漏) sh
    = logging.StreamHandler() sh.setLevel(sh_level) sh.setFormatter(Format) fh = logging.FileHandler(path) fh.setLevel(ft_level) fh.setFormatter(Format) self.logger.addHandler(sh) self.logger.addHandler(fh) def logging_info(self, message): self.logger.info(message) def logging_debug(self, message): self.logger.debug(message) def logging_warning(self, message): self.logger.warning(message) def logging_error(self, message): self.logger.error(message) def logging_critical(self, message): self.logger.critical(message) if __name__ == "__main__": test_log = Logger("clarence", logging.INFO, logging.DEBUG, 'test.log') test_log.logging_error("just test")

     

     

  • 相关阅读:
    python之面向对象函数与方法,反射,双下方法
    python之面向对象的成员,方法,属性,异常处理
    python之面向对象性封装,多态,以及鸭子类型
    python之面向对象三大特性: 继承(单继承)
    AMAP-TECH算法大赛开赛!基于车载视频图像的动态路况分析
    深度学习在高德ETA应用的探索与实践
    高德SD地图数据生产自动化技术的路线与实践(道路篇)
    高德前端这五年:动态化技术的研发历程和全面落地实践
    深度学习在高德POI鲜活度提升中的演进
    高德技术评测建设之路
  • 原文地址:https://www.cnblogs.com/clarenceyang/p/9675117.html
Copyright © 2011-2022 走看看