• python logging模块的使用


    logging 专门用于记录日志的模块,相对于print来说,logging 提供了日志信息的分级、格式化、过滤等功能。在程序中定义丰富有条理的log信息,可以方便分析程序的运行状态,在发生问题是可有效定位和分析问题。

    logging的几个部分:

    1. Logger:进行日志记录时创建的对象,调用它的方法传入日志模板和信息 来生成日志记录logRecord

    2. Handler:用来处理日志记录的类,指定输入日志位置和存储形式等

    3. Formatter:指定日志的输出格式,返回字符串给 Handler 处理

    4. Filter:通过级别或者关键字等过滤日志

    5. Parent Handler: Handler 之间存在层级关系,使不同的 Handler 间可共享相同功能的代码

    用法:

    1:默认 Logger 和 basicConfig 格式输出

    import logging
    import time
    
    # 返回一个默认的root Logger,默认level=warning,打印内容为每个级别的信息
    logger = logging.getLogger()
    # 格式化输出log信息,返回的是日志字符串,传回给 Handler 来处理。
    logging.basicConfig(
                        # 指定log级别:CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET
                        # FATAL:致命错误;CRITICAL:内存磁盘空间耗尽等;ERROR:IO操作失败或连接有问题;WARNING:警告不是错误;INFO:处理请求或日常状态变化;DEBUG:调试信息中间状态等
                        level= logging.ERROR,
                        # 指定保存log信息的文件名称
                        filename="logging.txt",
                        # 设置文件的读写方式
                        # r 只读、w 创建覆盖写入、a 创建追加写入、
                        # rb 二进制格式打开只读、wb 二进制创建覆盖写入、ab 二进制创建追加写入、
                        # r+ 打开读写、w+ 创建覆盖读写、a+ 创建追加读写
                        # rb+ 二进制格式打开读写、wb+ 二进制创建覆盖读写;ab+ 二进制追加读写
                        filemode="w",
                        # 格式化输出
                        format=" 日志时间:%(asctime)s 
    "
                               " 日志级别数值:%(levelno)s 
    "
                               " 日志级别名称:%(levelname)s 
    "
                               " 打印日志信息:%(message)s 
    "
                               " 当前执行程序的路径:%(pathname)s 
    "
                               " 当前执行程序名:%(filename)s 
    "
                               " 当前模块名:%(name)s 
    "
                               " 当前执行函数:%(funcName)s 
    "
                               " 日志的当前行号:%(lineno)s 
    "
                               " 线程ID:%(thread)d 
    "
                               " 线程名称:%(threadName)s 
    "
                               " 进程ID:%(process)d 
    "
                               "----------------------------------",
                        # 设置 asctime 的输出格式
                        datefmt= time.strftime("%Y-%m-%d %X")
                        )
    
    logger.info("info message")
    logger.debug("debug message")
    logger.warning("warning message")
    logger.error("error message")
    logging.critical("critical error message")
    
    """
    运行结果:打印log到logging.txt文件中
    
     日志时间:2019-03-19 16:23:10 
     日志级别数值:40 
     日志级别名称:ERROR 
     打印日志信息:error message 
     当前执行程序的路径:/Users/soumoemoe/Documents/pyAutoTest/log.py 
     当前执行程序名:log.py 
     当前模块名:root 
     当前执行函数:<module> 
     日志的当前行号:40 
     线程ID:140735671509888 
     线程名称:MainThread 
     进程ID:42144 
    ----------------------------------
     日志时间:2019-03-19 16:23:10 
     日志级别数值:50 
     日志级别名称:CRITICAL 
     打印日志信息:critical error message 
     当前执行程序的路径:/Users/soumoemoe/Documents/pyAutoTest/log.py 
     当前执行程序名:log.py 
     当前模块名:root 
     当前执行函数:<module> 
     日志的当前行号:41 
     线程ID:140735671509888 
     线程名称:MainThread 
     进程ID:42144 
    ----------------------------------
    """

    2:Logger、Handler、Formatter、addHandler

    import logging
    import sys
    # 声明 logger
    logger = logging.getLogger(__name__)
    # 指定log级别
    logger.setLevel(logging.DEBUG)
    
    # FileHandler log日志格式化输出到文件中
    fileHandler = logging.FileHandler("logging.txt")
    formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
    fileHandler.setFormatter(formatter)
    logger.addHandler(fileHandler)
    
    # StreamHandler sys.stderr,sys.stdout 输出到控制台
    streamHandler = logging.StreamHandler(sys.stderr)
    streamHandler.setLevel(level=logging.DEBUG)
    logger.addHandler(streamHandler)
    
    
    logger.info("This is a log info")
    logger.debug("Debugging")
    logger.warning("Warning exists")
    logger.error("Error Message")
    logger.critical("Critical message")

    3:Parent Handler,logger配置服用,以下childlog.py复用了log.py文件中Logger的配置,注意两个文件中 getLogger的参数

    #log.py
    
    import logging
    import sys
    import childlog
    
    logger = logging.getLogger("log")
    logger.setLevel(logging.DEBUG)
    
    streamHandler = logging.StreamHandler(sys.stderr)
    streamHandler.setLevel(level=logging.DEBUG)
    formatter = logging.Formatter("%(asctime)s - %(filename)s - %(levelname)s - %(message)s")
    streamHandler.setFormatter(formatter)
    logger.addHandler(streamHandler)
    
    logger.info("Log Info")
    logger.debug("Log Debug")
    logger.warning("Log Warning")
    logger.error("Log Error")
    logger.critical("Log Critical")
    
    childlog.run()
    # childlog.py
    
    import logging
    logger = logging.getLogger("log.childlog")
    def run():
        logger.info("Child Info")
        logger.debug("Child Debug")
        logger.error("Child Error")

    运行log.py 结果为:

    2019-03-19 17:10:13,951 - log.py - INFO - Log Info
    2019-03-19 17:10:13,951 - log.py - DEBUG - Log Debug
    2019-03-19 17:10:13,951 - log.py - WARNING - Log Warning
    2019-03-19 17:10:13,951 - log.py - ERROR - Log Error
    2019-03-19 17:10:13,951 - log.py - CRITICAL - Log Critical
    2019-03-19 17:10:13,951 - childlog.py - INFO - Child Info
    2019-03-19 17:10:13,951 - childlog.py - DEBUG - Child Debug
    2019-03-19 17:10:13,951 - childlog.py - ERROR - Child Error

    4:异常捕获,打印Traceback信息:或者用exception打印

    list = [1,2]
    try:
        for i in range(3):
            print(list[i])
    except Exception:
        logger.error("访问列表出错")
    
    """
    运行结果:
    2019-03-19 17:16:42,608 - log.py - ERROR - 访问列表出错
    1
    2
    """
    
    #-----------------------------------------------------------------
    # 设置 exc_info = True,会输出完整的Traceback信息
    list = [1,2]
    try:
        for i in range(3):
            print(list[i])
    except Exception:
        logger.error("访问列表出错", exc_info = True)
    #logger.exception("访问列表出错")
    """ 运行结果: 2019-03-19 17:18:37,204 - log.py - ERROR - 访问列表出错 Traceback (most recent call last): File "/Users/soumoemoe/Documents/pyAutoTest/log.py", line 68, in <module> print(list[i]) IndexError: list index out of range 1 2 """

    5:Filter 通过Logger名称过滤log

    import logging
    import sys
    
    logger = logging.getLogger("log")
    
    streamHandler = logging.StreamHandler(sys.stderr)
    streamHandler.setLevel(level=logging.DEBUG)
    formatter = logging.Formatter("%(asctime)s - %(filename)s - %(levelname)s - %(message)s")
    streamHandler.setFormatter(formatter)
    logger.addHandler(streamHandler)
    
    filter = logging.Filter(name = "log.a")
    streamHandler.addFilter(filter)
    
    logging.getLogger("log.a").warning("log.a")
    logging.getLogger("log.b").warning("log.b") #log.b没有输出
    
    """
    运行结果:
    2019-03-19 17:33:39,979 - log.py - WARNING - log.a
    """
  • 相关阅读:
    android 4种启动模式
    android定位
    android GestureDetector 手势基础
    Android 软键盘盖住输入框的问题
    Android Fragment应用实战,使用碎片向ActivityGroup说再见
    Android Fragment完全解析,关于碎片你所需知道的一切
    setImageResource和setBackgroundResource的區別
    【Android面试】Android面试题集锦 (陆续更新)(最新2012-6-18) eoe上看到的
    Android内存性能优化(内部资料总结)
    关于BFC
  • 原文地址:https://www.cnblogs.com/belle-ls/p/10560161.html
Copyright © 2020-2023  润新知