python日志【logging模块】基础

版权声明: https://blog.csdn.net/Geroge_lmx/article/details/83900510

       logging模块是Python内置的标准模块,主要用于输出运行日志,可以设置输出日志的等级、日志保存路径、日志文件回滚等;相比print,具备如下优点:

  • 可以通过设置不同的日志等级,在release版本中只输出重要信息,而不必显示大量的调试信息;
  • print将所有信息都输出到标准输出中,严重影响开发者从标准输出中查看其它数据;logging则可以由开发者决定将信息输出到什么地方,以及怎么输出。

一.logging模块的日志级别

日志等级(level) 描述
DEBUG 最详细的日志信息,典型应用场景是问题诊断
INFO 记录关键节点信息,用于确认一切都是按照我们预期的那样进行工作
WARNING 当某些不期望的事情发生时记录的信息(如,磁盘可用空间较低),但是此时应用程序还是正常运行的
ERROR 由于一个更严重的问题导致某些功能不能正常运行时记录的信息
CRITICAL 当发生严重错误,导致应用程序不能继续运行时记录的信息

    【1】上面列表中的日志等级是从上到下依次升高的,即:DEBUG < INFO < WARNING < ERROR < CRITICAL,而日志的信息量是依次减少的;

    【2】当为某个应用程序指定一个日志级别后,应用程序会记录所有日志级别大于或等于指定日志级别的日志信息

二.logging日志模块四大组件

组件名称 类名 功能描述
日志器 Logger 提供了应用程序可一直使用的接口
处理器 Handler 将logger创建的日志记录发送到合适的目的输出
过滤器 Filter 提供了更细粒度的控制工具来决定输出哪条日志记录,丢弃哪条日志记录
格式器 Formatter 决定日志记录的最终输出格式

三.logging模块的使用

3.1 基本用法

import logging

"""logging.basicConfig函数各参数:
    filename:指定日志文件名;
    format:指定输出的格式和内容
    filemode:和file函数差不多,指定日志文件的打开格式w或者a
"""

"""format参数作用:
    %(levelno)s:打印日志级别的数值
    %(levelname)s:打印日志级别名称
    %(name)s:logger的名称,此处设置为了__name__
    %(pathname)s:打印当前执行程序的路径,其实就是sys.argv[0]
    %(filename)s:打印当前执行程序名
    %(funcName)s:打印日志的当前函数
    %(lineno)d:打印日志的当前行号
    %(asctime)s:打印日志的时间
    %(threadName)s:打印线程名称
    %(process)d:打印进程id
    %(message)s:打印日志信息
"""

logging.basicConfig(level=logging.INFO,format='%(asctime) - %(name)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)

logger.info("Start pring log")
logger.debug("Do something")

3.2 使用Handler组件

import logging
def log():
    #创建logger,如果参数为空则返回root logger
    logger = logging.getLogger("nick")
    logger.setLevel(logging.DEBUG)  #设置logger日志等级
​
    #这里进行判断,如果logger.handlers列表为空,则添加,否则,直接去写日志
    if not logger.handlers:
        #创建handler
        fh = logging.FileHandler("test.log",encoding="utf-8")
        ch = logging.StreamHandler()
​
        #设置输出日志格式
        formatter = logging.Formatter(
            fmt="%(asctime)s - %(levelname)s - %(filename)s[:%(lineno)d] - %(message)s",
            datefmt="%Y/%m/%d %X"
            )
​
        #为handler指定输出格式
        fh.setFormatter(formatter)
        ch.setFormatter(formatter)
​
        #为logger添加的日志处理器
        logger.addHandler(fh)
        logger.addHandler(ch)
​
    return logger #直接返回logger
​
logger = log()
logger.warning("泰拳警告")
logger.info("提示")
logger.error("错误")
logger.debug("查错")

3.3 捕获traceback

"""python中的traceback模块用于捕获异常信息,可以在logging中记录下traceback"""
import logging

def fun_set_logger(log_file, logger):
    logger.setLevel(logging.DEBUG)
    LOG_FORMAT = "[%(asctime)s]-[%(levelname)s] %(message)s"

    DATE_FORMAT = "%Y-%m-%d %H:%M:%S"

    # output log to file
    logger_FileHandler = logging.FileHandler(log_file)
    logger_FileHandler.setFormatter(logging.Formatter(fmt=LOG_FORMAT, datefmt=DATE_FORMAT))
    logger_FileHandler.setLevel(logging.DEBUG)
    logger.addHandler(logger_FileHandler)
    
    # output log to command-line console
    logger_StreamHandler = logging.StreamHandler()
    logger_StreamHandler.setFormatter(logging.Formatter(fmt=LOG_FORMAT, datefmt=DATE_FORMAT))
    logger_StreamHandler.setLevel(logging.INFO)
    logger.addHandler(logger_StreamHandler)

if __name__ == "__main__":
    logger = logging.getLogger()
    fun_set_logger("log.txt", logger)
    
    try:
        open("notexist,txt","rb")
    except (SystemExit,KeyboardInterrupt):
        raise
    except Exception:
        #等价于 logger.exception(message)
        logger.error("Failed to open file",exc_info=True) 

参考:

【1】https://www.cnblogs.com/Nicholas0707/p/9021672.html

【2】https://www.cnblogs.com/yyds/p/6901864.html

猜你喜欢

转载自blog.csdn.net/Geroge_lmx/article/details/83900510