最近开始养成为代码运行添加日志记录的习惯,写篇博客记录一下。先放上logging整体使用代码:
import logging
# 基本设置
logging.basicConfig(level = logging.DEBUG)
# 创建日志器
logger = logging.getLogger('mylogger')
logger.setLevel(logging.DEBUG)
# 创建控制台处理器并设置日志级别
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
# 创建格式器
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
# 将格式器添加到处理器
ch.setFormatter(formatter)
# 将处理器添加到日志器
logger.addHandler(ch)
# 日志输出
logger.debug('Debug message')
logger.info('Info message')
logger.warning('Warning message')
logger.error('Error message')
logger.critical('Critical message')
流程说明
- 在获取一个基础logger后(指定了logger名),设置当前logger的日志记录级别。更高级别的日志信息,会同时打印比它级别低的信息。但使用更低级别的日志,不会打印高级别日志信息。
- 配置相应的处理器及记录级别。当处理机记录级别和logger不同时,低于logger级别的不会被记录,低于handler级别的不会被处理。
- 添加相应的格式器(非必须)
- 具体代码行选择相应的日志输出级别
basicConfig参数
- filename:指定日志文件名,如'app.log'。如果不指定,默认会输出到sys.stderr。
- filemode:日志文件打开模式,'a'表示追加模式,'w'表示可写模式。默认为'a'。
- format:指定日志格式字符串,格式参考Formatter的定义。默认为"%(levelname)s:%(name)s:%(message)s"。
- datefmt:指定日期/时间格式字符串,格式参考Formatter。默认为"%Y-%m-%d %H:%M:%S"。
- level:指定日志级别,如logging.DEBUG、logging.INFO等。默认是logging.WARNING。
- stream:指定输出流,如sys.stdout,sys.stderr等。默认是sys.stderr。如果同时指定filename,则同时输出到文件和流中。
- force:设置为True时会强制覆盖同名文件的旧日志。默认是False。
basicConfig提供了一个非常便捷的方式来完成logging模块的基本配置,适用于简单的日志使用场景。也可以用更灵活的方式进行自定义日志配置。
日志级别
名称 | 描述 | 适用场景 | 打印优先度 |
---|---|---|---|
DEBUG | 调试信息,程序内部详细信息 | 程序开发调试,记录所有的详细内部信息 | 5 |
INFO | 运行信息,记录重要的运行事件 | 生产环境,记录运行过程中的重要信息 | 4 |
WARNING | 警告信息,可能会出现问题 | 记录可能会出现的问题,可以提前优化 | 3 |
ERROR | 错误信息,程序错误导致的问题 | 需要程序员关注和修复的错误信息 | 2 |
CRITICAL | 严重错误,程序可能无法继续运行 | 录会导致程序停止的严重错误 | 1 |
Handler
名称 | 作用 |
---|---|
StreamHandler | 日志输出到流,如标准输出、错误输出 |
NullHandler | 不输出日志的空 |
FileHandler | 日志输出到文件 |
BaseRotatingHandler | 基本的日志回滚方式 |
RotatingFileHandler | 日志回滚方式,支持日志文件最大数量和日志文件回滚 |
TimeRotatingHandler | 日志回滚方式,在一定时间区域内回滚日志文件 |
SocketHandler | 远程输出日志到TCP/IP sockets |
DatagramHandler | 远程输出日志到UDP sockets |
SMTPHandler | 远程输出日志到邮件地址 |
SysLogHandler | 日志输出到syslog |
NTEventLogHandler | 远程输出日志到Windows NT/2000/XP的事件日志 |
MemoryHandler | 日志输出到内存中的指定buffer |
HTTPHandler | 通过”GET”或者”POST”远程输出到HTTP服务器 |
注:由于StreamHandler和FileHandler是常用的日志处理方式,所以直接包含在logging模块中,而其他方式则包含在logging.handlers模块中
添加多个handler的主要作用是:
- 可以同时将日志输出到不同的地方,比如同时输出到文件和控制台。
- 可以设置不同的日志级别,在不同的handler输出不同级别的日志。
- 可以设置不同的日志格式,在不同的handler中进行格式化。
Formatter
若添加了formatter,在输出日志时extra参数需传入对应的变量字典,对于缺失的key以空字符串代替,对于额外的key则忽略
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logger.info('Test Log Message', extra={'name': 'John'})
format的部分参数
%(levelno)s | 打印日志级别的数值。 |
---|---|
%(levelname)s | 打印日志级别的名称 |
%(pathname)s | 打印当前执行程序的路径,其实就是sys.argv[0] |
%(filename)s | 打印当前执行程序名 |
%(funcName)s% | 打印日志的当前函数 |
%(lineno)d | 打印日志的当前行号 |
%(asctime)s | 打印日志的时间 |
%(thread)d | 打印线程ID |
%(threadName)s | 打印线程名称 |
%(process)d | 打印进程ID |
%(processName)s | 打印线程名称 |
%(module)s | 打印模块名称 |
%(message)s | 打印日志信 |