• Python 日志输出


    昨天的任务是需要记录各操作的性能数据,所以需要用这种格式来输出日志:{"adb_start_time": 1480040663, "tag_name": "CLIMB_TOWER_8", "adb_end_time": 1480040767, "case_status": 0}
    开始时间、操作名称、结束时间、运行结果("0": "成功","1": "失败","2": "异常")。于是简单的学习了一下日志输出:

    一. 使用Python标准库——logging

    1. 日志级别

    日志一共分为5个级别:DEBUG<INFO<WARNING<ERROR<CRITICAL,分别对应logging的五个方法:debug、info、warning、error、critical。默认的是WARNING,当在WARNING或以上级别时,才会被跟踪。有两种方式记录跟踪:1)输出到控制台;2)记录到文件中,如日志文件

    2. 日志组件

    日志组件包括:logger、handler、filters、formatters

    1. logger:主要扮演了三个角色:1)暴露给应用五个方法(debug..)以便应用在运行时写log;2)logger对象 按照log信息的严重程度或根据filter对象来决定如何处理log信息(默认的过滤功能);3)还负责把log信息传送给相关的loghandlers

    2. handler:负责分配合适的log信息(基于log信息的严重程度)到handler指定的目的地。logger对象可以用addhandler()方法添加零个或多个handler对象。

    例如:一个应用既可以将所有的log信息发送到一个log文件,所有的ERROR信息发送到stdout,所有的CRITICAL信息通过邮件发送,这里需要三个不同的Handler,每个Handler负责把特定的信息发送到特定的地方。

    3. filter:过滤,确定哪些日志输出

    4. formatter:设置显示格式

    先看一个最简单的例子

    # 1. 创建logger
    logger = logging.getLogger(“sbw”)
    
    # 2. 设置输入到日志文件
    logging.basicConfig(filename="../mylog.log",
                                level=flevel,
                                format="%(asctime)s %(levelname)s %(funcName)s %(message)s")
    
    # 3. 终端Handler——输出到控制台
    consoleHandler = logging.StreamHandler()
    consoleHandler.setLevel(clevel)
    
    # 定义Handle的格式
    formatter = logging.Formatter("%(asctime)s %(levelname)s %(funcName)s %(message)s")
    
    # 给Handle添加formatter
    consoleHandler.setFormatter(formatter)
    
    # 给logger添加handler
    self.logger.addHandler(consoleHandler)

    对于日志记录,还可以使用logging.FileHandler:

    import logging 
    
    # 1、创建一个logger 
    logger = logging.getLogger('mylogger') 
    logger.setLevel(logging.DEBUG) 
    
    # 2、创建一个handler,用于写入日志文件 
    fh = logging.FileHandler('test.log') 
    fh.setLevel(logging.DEBUG) 
    
    # 3、定义handler的输出格式(formatter)
    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') 
    
    # 4、给handler添加formatter
    fh.setFormatter(formatter) 
    
    # 5、给logger添加handler 
    logger.addHandler(fh) 

    典型的记录流程:

    1. 创建logger
    2. 创建handler
    3. 定义formatter
    4. 给handler添加formatter
    5. 给logger添加handler

    3. logger

    日志记录的工作主要是由Logger对象来完成的

    3.1 创建logger——logging.getLogger([name])

    在调用getLogger时需要提供Logger名称(如果多次使用相同的名称来调用getLogger,返回的是同一个对象的引用)。Logger实例之间有层次关系名字中使用点号来进行等级管理,例如:

    p = logging.getLogger("root")
    c1 = logging.getLogger("root.c1")
    c2 = logging.getLogger("root.c2")

    例子中,p是父logger, c1,c2分别是p的子logger。c1, c2将继承p的设置。如果省略了name参数, getLogger将返回日志对象层次关系中的根Logger。如果logger有父类,日志流会同时发送给logger和logger的父类的handler

    最好的方式,用:logging.getLogger("__name__"):

    3.2 Logger方法

    1. logger.setLevel():设置日志的级别。对于低于该级别的日志消息将被忽略。
    2. logger.addHandler():添加handler;logger.remoteHandler():删除handler
    3. logger.addFilter():添加filter;logger.remoteHandler():删除filter
    4. logger.debug()、logger.info()、logger.warning()、logger.error()、logger.critical():记录日志
    5. logger.log(level, msg):logger.log(Logging.WARN, 'msg')==logging.warn('msg')

    3.3 Logger属性

    • Logger.handlers 该logger已添加的Handlers
    • Logger.filters 该logger已添加的Filters
    • 获取Logger实例:getLogger() 来获取logger。

    4. Handler

    一个logger可以设置0个或以上的Handler。logger执行记录日志的方法后,会把日志交给Handler来处理

    4.1 Handler方法

    1. Handler.setLevel() 设置logger的日志严重程度
    2. Handler.addFilter,Handler.remoteFilter()添加或删除Filter
    3. setFormatter() 设置日志输出的格式

    4.2 Handler类

    1. logging.StreamHandler()

    输出日志到一个文件对象,可以是open打开的文件,也可以是系统终端,例如sys.stdout或sys.stderr。

    # 1. 将日志输出到一个文件
    file = open('./test.log', 'w')
    fileHandler = logging.StreamHandler(file)
    
    # 2. 输出到控制台(默认是:sys.stderr)
    consoleHandler = logging.StreamHandler()
    # 或者:
    consoleHandler2=logging.StreamHandler(sys.stdout)

    2. logging.FileHandler(filename[, mode])

    向一个文件中输出日志内容。如果文件根路径不存在,会报错。如果文件根路径存在,但是文件不存在,会自动创建文件。

    • filename是日志文件路径。
    • mode是写文件的方法,例如’a','w',参考open里面的mode

    3. logging.handlers.RotatingFileHandler

    类似FileHandler,不同的是这个可以管理文件的大小,如果日志文件大于某个值,就会把旧的日志重命名,并创建新的日志文件。如果有三个日志文件chat.log,chat.log.1,chat.log.2 ,时间大小:chat.log>chat.log.1>chat.log.2

    RotatingFileHandler( filename[, mode[, maxBytes[, backupCount]]])
    # 其中:
    # filename和mode两个参数和FileHandler一样。
    # maxBytes 最大文件大小,单位字节,0代表无限大。
    # backupCount 保留的备份个数。

    例如:

    # 日志回滚
    import logging
    from logging.handlers import RotatingFileHandler
    
    RtHandler = RotatingFileHandler("../mylog.log", maxBytes=20 * 1024 * 1024, backupCount=5)
    RtHandler.setLevel(logging.DEBUG)
    formatter = logging.Formatter("%(asctime)s %(levelname)s %(funcName)s %(message)s")
    RtHandler.setFormatter(formatter)
    self.logger.addHandler(RtHandler)

    4. logging.handlers.TimedRotatingFileHandler

    这个Handler和RotatingFileHandler类似,不同的是这个Handler通过时间来切分日志文件

    TimedRotatingFileHandler( filename [,when [,interval [,backupCount]]])

    其中filename参数和backupCount参数和RotatingFileHandler具有相同的意义

    • interval是时间间隔。
    • when参数是一个字符串。表示时间间隔的单位,不区分大小写。它有以下取值:
      S 秒
      M 分
      H 小时
      D 天
      W 每星期(interval==0时代表星期一)
      midnight 每天凌晨

    5. 其他

    5. logging.handlers.SocketHandler

    6. logging.handlers.DatagramHandler
    以上两个Handler类似,都是将日志信息发送到网络。不同的是前者使用TCP协议,后者使用UDP协议。它们的构造函数是:

    • Handler(host, port)

    其中host是主机名,port是端口名

    7. logging.handlers.SysLogHandler

    8. logging.handlers.NTEventLogHandler

    9. logging.handlers.SMTPHandler

    10. logging.handlers.MemoryHandler

    11. logging.handlers.HTTPHandler

    5. Formatter

    设置格式

    二、使用配置:

  • 相关阅读:
    mySQL如何在查询的结果前添加序号
    bootstrap 列表前添加序号 1.10版本
    sql 如何优先显示不为空的字段 并进行排序
    java面向对象总结
    线程总结(二)
    数据库索引介绍(转载)
    线程总结(一)
    GUI图形界面编程之事件处理机制
    Eclipse快捷键大全(转载)
    JDBC数据库编程总结
  • 原文地址:https://www.cnblogs.com/lesleysbw/p/6909032.html
Copyright © 2020-2023  润新知