1、logging等级
logging模块将日志分为了五个等级:
DEBUG:调试信息,通常在诊断问题的时候用得着;
INFO:普通信息,确认程序安装预期运行;
WARNING:警告信息,表示发生了意想不到的事情,或者指示接下来可能会出现一些问题,但是程序还是继续运行;
ERROR:错误信息,程序运行中出现了一些问题,一些功能没有执行;
CRITICAL:危险信息,一个严重的错误,导致程序无法继续运行。
上述的五个等级的日志信息分别使用:logging模块的debug()、info()、warning()、error()、critical()方法来实现。
默认情况下,logging使用的日志级别是warning,这表示只有在这个级别及其以上级别的日志信息才会被记录,所以默认情况下debug信息和info信息都不会被显示出来。
我们来测试一下:
Python中怎么记录程序日志
import logging
logging.basicConfig(filename= 'test.log', level= logging.INFO)
logging.debug('debug message')
logging.info("info message")
logging.warning('warn message')
logging.error("error message")
logging.critical('critical message')
运行代码,控制台会显示:
INFO:root:info message
WARNING:root:warn message
ERROR:root:error message
CRITICAL:root:critical message
注意:
- logging.INFO 使用logging模块的basicConfig()方法,修改一个日志输出等级为INFO
- 能够将其写入文件中。同样是使用basicConfig()方法进行设置,运行程序,会生成一个名为test.log的文本文件
- 日志信息会追加在test.log文件的内容后面:
如果不想 日志信息会追加怎么办,同样在basicConfig()方法中使用filemode参数进行设置:filemode = ‘w’
2、logging支持的格式
%(asctime)s:日志创建时的普通时间;
%(created)f:日志创建时的时间(由time.time()返回);
%(filename)s:文件名;
%(funcName)s:调用日志记录的函数;
%(levelname)s:日志消息的文本级别;
%(levelno)s:日志消息的数字级别;
%(lineno)d:调用日志消息的行号;
%(msecs)d:创建时间的毫秒部分;
%(message)s:日志消息;
%(name)s:日志器的名称;
%(pathname)s:记录日志的源文件的路径名;
%(process)d:进程ID;
%(processName)s:进程名;
%(thread)d:线程ID;
%(threadName)s:线程名;
%(relativeCreated)d:创建日志记录的时间(以毫秒为单位)
我们先来了解一下 logging 中的几个概念:
Logger:日志记录器,是应用程序中可以直接使用的接口。
Handler:日志处理器,用以表明将日志保存到什么地方以及保存多久。
Formatter:格式化,用以配置日志的输出格式。
上述三者的关系是:一个 Logger 使用一个 Handler,一个 Handler 使用一个 Formatter。那么概念我们知道了,该如何去使用它们呢?我们的 logging 中有很多种方式来配置文件,简单的就用上面面所说的 basicConfig,对于比较复杂的我们可以将日志的配置保存在一个配置文件中,然后在主程序中使用 fileConfig 读取配置文件。
日志文件保存所有 debug 及其以上级别的日志,每条日志中要有打印日志的时间,日志的级别和日志的内容。
import logging
logging.basicConfig(
level= logging.DEBUG,
format = '%(asctime)s : %(levelname)s : %(message)s',
filename= "test.log"
)
logging.debug('debug message')
logging.info("info message")
logging.warning('warning message')
logging.error("error message")
logging.critical('critical message')
3、配置文件日志格式
对于比较复杂的我们可以将日志的配置保存在一个配置文件中,然后在主程序中使用 fileConfig 读取配置文件。下面我们就来看一个典型的日志配置文件(配置文件名为 logging.conf):
[loggers]
keys = root
[handlers]
keys = logfile
[formatters]
keys = generic
[logger_root]
handlers = logfile
[handler_logfile]
class = handlers.TimedRotatingFileHandler
args = ('test.log', 'midnight', 1, 10)
level = INFO
formatter = generic
[formatter_generic]
format = %(asctime)s %(levelname)-5.5s [%(name)s:%(lineno)s] %(message)s
在上述的日志配置文件中,首先我们在 [loggers] 中声明了一个叫做 root 的日志记录器(logger),在 [handlers] 中声明了一个叫 logfile 的日志处理器(handler),在 [formatters] 中声明了一个名为 generic 的格式化(formatter)。之后在 [logger_root] 中定义 root 这个日志处理器(logger) 所使用的日志处理器(handler) 是哪个,在 [handler_logfile] 中定义了日志处理器(handler) 输出日志的方式、日志文件的切换时间等。最后在 [formatter_generic] 中定义了日志的格式,包括日志的产生时间,级别、文件名以及行号等信息。
有了上述的配置文件以后,我们就可以在主代码中使用 logging.conf 模块的 fileConfig 函数加载日志配置:
import logging
import logging.config
logging.config.fileConfig('logging.conf')
logging.debug('debug message')
logging.info("info message")
logging.warn('warn message')
logging.error("error message")
logging.critical('critical message')