Python日志系统logging使用入门

2023-08-07 10:56:05 浏览数 (2)

背影

Python标准库提供了一个日志记录系统,可以很方便的在python项目中添加日志记录。本文将详细介绍如何使用python的 logging 模块来记录日志。

日志级别

主要包括了5种日志级别,代表5种严重级别(严重程度由低到高):

  • • DEBUG:提供详细的详细
  • • INFO:程序运行的关键步骤信息
  • • WARNING:警告信息
  • • ERROR:程序错误,某个功能无法执行
  • • CRITICAL:严重错误,可能整个程序无法执行

Logger提供了一个默认的记录器,称为root Logger。

代码语言:javascript复制
import logging

logging.debug('Debug 级别日志信息')
logging.info('Info 级别日志信息')
logging.warning('Warning 级别日志信息')
logging.error('Error 级别日志信息')
logging.critical('Critical 级别日志信息')

输出结果如下:

代码语言:javascript复制
WARNING:root:Warning 级别日志信息
ERROR:root:Error 级别日志信息
CRITICAL:root:Critical 级别日志信息

基本配置

可以使用basicConfig(**kwargs)方法对日志系统进行配置。常用参数如下:

  • • level: 指定严重级别。
  • • filename: 指定文件。
  • • filemode: 如果指定了filename,则以该模式打开文件。默认是a,表示追加。
    • • a:追加
    • • w:覆盖
  • • format:日志信息的格式。默认levelname, name和message属性,用冒号分隔。

注意:basicConfig函数只能被调用一次。

level参数可以设置要记录的日志消息的严重级别

代码语言:javascript复制

import logging

logging.basicConfig(level=logging.DEBUG)

logging.debug('Debug 级别日志信息')
logging.info('Info 级别日志信息')
logging.warning('Warning 级别日志信息')
logging.error('Error 级别日志信息')
logging.critical('Critical 级别日志信息')

输出结果如下

代码语言:javascript复制
DEBUG:root:Debug 级别日志信息
INFO:root:Info 级别日志信息
WARNING:root:Warning 级别日志信息
ERROR:root:Error 级别日志信息
CRITICAL:root:Critical 级别日志信息

保存日志到文件

代码语言:javascript复制

import logging

logging.basicConfig(filename='test.log', filemode='w', format='%(name)s - %(levelname)s - %(message)s')
logging.debug('Debug 级别日志信息')
logging.info('Info 级别日志信息')
logging.warning('Warning 级别日志信息')
logging.error('Error 级别日志信息')
logging.critical('Critical 级别日志信息')

输出结果如下:

代码语言:javascript复制
root - WARNING - Warning 级别日志信息
root - ERROR - Error 级别日志信息
root - CRITICAL - Critical 级别日志信息

格式化输出

format 参数用于格式化输出设置,除了默认设置levelname, name和message属性:

属性名

使用格式

描述

asctime

%(asctime)s

时间,默认格式为 ‘2003-07-08 16:49:45,896’

created

%(created)f

时间戳

relativeCreated

%(relativeCreated)d

相对于加载日志模块的时间(以毫秒为单位)。

msecs

%(msecs)d

日志创建时间的毫秒部分

filename

%(filename)s

脚本文件名称

funcName

%(funcName)s

调用日志记录的函数名称

module

%(module)s

脚本模块名

pathname

%(pathname)s

脚本文件绝对路径名

name

%(name)s

记录器名称,默认logger名为root

levelname

%(levelname)s

文本类型的日志级别 ('DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL').

levelno

%(levelno)s

数字类型的日志级别 (10, 20, 30, 40, 50).

lineno

%(lineno)d

日志调用的代码所在行号

message

%(message)s

日志信息

process

%(process)d

进程ID

processName

%(processName)s

进程名称

thread

%(thread)d

线程ID

threadName

%(threadName)s

线程名

其中 asctime 时间格式可以使用 datefmt 属性更改,语法格式与python datetime模块的格式化函数相同,例如:

代码语言:javascript复制
import logging

logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(message)s', datefmt='%Y%m%d-%H:%M:%S')

logging.debug('Debug 级别日志信息')
logging.info('Info 级别日志信息')
logging.warning('Warning 级别日志信息')
logging.error('Error 级别日志信息')
logging.critical('Critical 级别日志信息')

输出结果如下:

代码语言:javascript复制
20230716-15:59:17 - Debug 级别日志信息
20230716-15:59:17 - Info 级别日志信息
20230716-15:59:17 - Warning 级别日志信息
20230716-15:59:17 - Error 级别日志信息
20230716-15:59:17 - Critical 级别日志信息

除了以上属性外,还支持自定义属性,使用 extra 参数传递

代码语言:javascript复制

import logging

FORMAT = '%(asctime)s - %(clientip)s - %(message)s'
logging.basicConfig(format=FORMAT)
clientip = '192.168.0.1'
d = {'clientip':clientip}

logging.info('Info 级别日志信息')
logging.warning('Warning 级别日志信息', extra=d)

捕获异常信息

设置 exc_info 参数为 True 可以输出信息报错信息:

代码语言:javascript复制
import logging

try:
  res = 1 / 0
except Exception as e:
  logging.error(e, exc_info=True

输出结果

代码语言:javascript复制
ERROR:root:division by zero
Traceback (most recent call last):
  File "c:UsersAdministratorDesktoptmp716a.py", line 4, in <module>
    res = 1 / 0
          ~~^~~
ZeroDivisionError: division by zero

也可以使用 logging.exception() 方法,效果一样

代码语言:javascript复制
logging.exception(e)

另外,stack_info 参数设置为 True 是可以打印堆栈信息。

0 人点赞