Python logging 库 记录日志

Python logging 库 记录日志

1 日志级别和记录日志

1.1 日志级别

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

日志等级是从上到下依次升高的,即:DEBUG < INFO < WARNING < ERROR < CRITICAL,而日志的信息量是依次减少的。

1.2 记录日志

记录日志的相关函数:

logging.debug(msg, *args, **kwargs)    # 添加一条日志级别为 DEBUG 的日志记录
logging.info(msg, *args, **kwargs)     # 添加一条日志级别为 INFO 的日志记录
logging.warning(msg, *args, **kwargs)  # 添加一条日志级别为 WARNING 的日志记录 
logging.error(msg, *args, **kwargs)    # 添加一条日志级别为 ERROR 的日志记录
logging.critical(msg, *args, **kwargs) # 添加一条日志级别为 CRITICAL 的日志记录 

logging.log(level, *args, **kwargs)    # 添加一条日志级别为 level 的日志记录

主要参数

  • msg (str):日志信息
  • level:日志级别,可为 logging.DEBUGlogging.INFOlogging.WARNINGlogging.ERRORlogging.log

其他参数:

  • exc_info (bool): 默认值为 False。如果设为 True,则会将异常信息添加到日志消息中。如果没有异常信息则添加 None 到日志信息中。
  • stack_info (bool): 默认值为 False。如果设为 True,程序运行的栈信息将会被添加到日志信息中。
  • extra (dict):用来自定义消息格式中所包含的字段,但是它的 key 不能与 logging 模块定义的字段冲突。

代码实例 1: 添加日志

import logging

logging.debug("This is a debug log.")
logging.info("This is a info log.")
logging.warning("This is a warning log.")
logging.error("This is a error log.")
logging.critical("This is a critical log.")

# 也可以这样写
logging.log(logging.DEBUG, "This is a debug log.")
logging.log(logging.INFO, "This is a info log.")
logging.log(logging.WARNING, "This is a warning log.")
logging.log(logging.ERROR, "This is a error log.")
logging.log(logging.CRITICAL, "This is a critical log.")

# Output: WARNING:root:This is a warning log.
# Output: ERROR:root:This is a error log.
# Output: CRITICAL:root:This is a critical log.

代码实例 2: exc_infoexc_infoextra 参数测试

logging.basicConfig(
    level = logging.DEBUG, 
    format = "%(asctime)s - %(levelname)s - %(user)s[%(ip)s] - %(message)s",
    datefmt = "%Y-%m-%d %H:%M:%S")

logging.warning(
    "Some one delete the log file.", 
    exc_info = True, 
    stack_info = True, 
    extra = {'user': 'Tom', 'ip':'47.98.53.222'})

2 日志格式配置

2.1 logging.basicConfig() 函数

函数用于指定“要记录的日志级别”、“日志格式”、“日志输出位置”、“日志文件的打开模式” 等信息

注意:logging.basicConfig() 函数是一个一次性的简单配置工具使,也就是说只有在第一次调用该函数时会起作用,后续再次调用该函数时完全不会产生任何操作的,多次调用的设置并不是累加操作。

主要参数

  • filename:指定日志输出目标文件的文件名,指定该设置项后日志信息就不会被输出到控制台了

  • filemode:指定日志文件的打开模式,默认为 'a' (追加模式)。只有设置了 filename 参数时才有效

  • format:指定日志格式字符串,即指定日志输出时所包含的字段信息以及它们的顺序。

  • datefmt:指定日期/时间格式。只有在 format 中包含时间字段 %(asctime)s 时才有效

  • level:指定日志器的日志级别

  • stream:指定日志输出目标 stream,如 sys.stdout、sys.stderr 以及网络 stream。

    • 注意:streamfilename 参数不能同时提供,否则会引发 ValueError 异常
  • style:指定 format 格式字符串的风格,可取值为 '%''{''$',默认为 '%'

  • handlers:该选项如果被指定,它应该是一个创建了多个 Handler 的可迭代对象,这些 handler 将会被添加到 root logger。

    • 注意: filenamestreamhandlers 这三个参数只能有一个存在,不能同时出现 2 个或 3 个,否则会引发 ValueError 异常。

2.1.1 format 日志格式设置

字段/属性名称 使用格式 描述
asctime %(asctime)s 日志事件发生的时间--人类可读时间,如:2003-07-08 16:49:45,896
created %(created)f 日志事件发生的时间--时间戳,就是当时调用 time.time() 函数返回的值
relativeCreated %(relativeCreated)d 日志事件发生的时间相对于logging模块加载时间的相对毫秒数(目前还不知道干嘛用的)
msecs %(msecs)d 日志事件发生事件的毫秒部分
levelname %(levelname)s 该日志记录的文字形式的日志级别('DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL')
levelno %(levelno)s 该日志记录的数字形式的日志级别(10, 20, 30, 40, 50)
name %(name)s 所使用的日志器名称,默认是'root',因为默认使用的是 rootLogger
message %(message)s 日志记录的文本内容,通过 msg % args计算得到的
pathname %(pathname)s 调用日志记录函数的源码文件的全路径
filename %(filename)s pathname 的文件名部分,包含文件后缀
module %(module)s filename 的名称部分,不包含后缀
lineno %(lineno)d 调用日志记录函数的源代码所在的行号
funcName %(funcName)s 调用日志记录函数的函数名
process %(process)d 进程ID
processName %(processName)s 进程名称
thread %(thread)d 线程ID
threadName %(thread)s 线程名称

实例

logging.basicConfig(
    filename = 'test.log', 
    level = logging.DEBUG, 
    format = "%(asctime)s - %(levelname)s - %(message)s",
    datefmt = "%Y-%m-%d %H:%M:%S")
    
logging.debug("This is a debug log.")
logging.info("This is a info log.")
logging.warning("This is a warning log.")
logging.error("This is a error log.")
logging.critical("This is a critical log.")

3. 日志流处理流程

3.1 logging日志模块的四大组件

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

参考资料

Python之日志处理(logging模块), 博客园, site

posted @ 2022-05-31 09:23  veager  阅读(170)  评论(0)    收藏  举报