python中logging模块上篇
本文分为
- 引言
- 日志输出格式
- 日志名称
- 日志等级
引言
日志让我们可以监测程序运行的状态,如果运行过程中出现问题,日志可以帮助我们定位问题出现的位置和时间、了解问题出现的原因,让我们知道程序黑箱中发生了什么事情。
当然,很多时候用print
也可以完成,但是学过会发现,用专门的日志模块会更加省力。下面我们开始logging模块的学习。
提示:logging模块不要在Jupyter或者交互模式下学习,要写在一个单独文件夹中,用命令行运行整个文件
我们先来看一段日志代码
import logging
logging.basicConfig(level=logging.INFO,
format='%(asctime)s %(levelname)s %(message)s')
logging.info('this is a info')
输出结果为
2018-07-01 18:49:36,170 INFO this is a info
这里的logging.info
是print
的功能,输出日志信息。前面初始化了日志输出的格式,后面代码中只需要写内容(对应message),时间等信息都会自动带上,这就是logging
比print
方便的地方。
日志的输出就是这么简单,先指定输出格式,然后像print
一样使用即可。接下来,我们来详细介绍其中的细节即更多功能。
日志输出格式
我们先关注上面代码中的format
参数,里面有一些固定用法,总结如下
`%(asctime)s` 表示当前时间,格式为`2018-07-01 19:08:41,050`,逗号后面是毫秒
`%(levelname)s` 表示日志级别名称
`%(message)s` 表示日志内容
`%(name)s` 表示日志名称(未指定则为roots)
`%(lineno)d` 表示输出日志的代码所在行数
`%(levelno)s` 表示数字形式的日志级别
`%(pathname)s` 表示程序执行路径,相当于`sys.argv[0]`
`%(filename)s` 表示所在文件名称
`%(funcName)s` 表示所在函数名称
`%(thread)d` 表示当前线程ID
`%(threadName)s` 表示当前线程名称
`%(process)d` 表示当前进程ID
`%(processName)s`表示当前进程名称
`%(module)s` 表示当前模块名称
`%(created)f` 表示UNIX标准时间浮点数表示
其中日志等级、日志名称后面会讲,其他的读者可以自己尝试。
除此之外,logging.basicConfig
函数还有一些参数可以对格式进行修改
1.datefmt
对时间格式进行修改
使用例子如下
import logging
logging.basicConfig(level=logging.INFO,
format='%(asctime)s %(message)s',
datefmt='%a, %d %b %Y %H:%M:%S +0000')
logging.info('this is a info')
输出结果如下
Sun, 01 Jul 2018 19:19:00 +0000 this is a info
datefmt
的格式可以参考官网表格
2.style
默认为%
,可选{
和$
,他们的使用方法分别如下
# %
import logging
logging.basicConfig(level=logging.INFO,
format='%(asctime)s %(message)s',
datefmt='%a, %d %b %Y %H:%M:%S +0000',
style='%')
logging.info('this is a info')
# {
import logging
logging.basicConfig(level=logging.INFO,
format='{asctime} {message}',
datefmt='%a, %d %b %Y %H:%M:%S +0000',
style='{')
logging.info('this is a info')
# $
import logging
logging.basicConfig(level=logging.INFO,
format='$asctime $message',
datefmt='%a, %d %b %Y %H:%M:%S +0000',
style='$')
logging.info('this is a info')
日志名称
还有一种常见的初始化日志的方式是这样的
import logging
logging.basicConfig(level=logging.INFO,
format='%(name)s %(asctime)s %(message)s',
datefmt='%a, %d %b %Y %H:%M:%S +0000')
logger = logging.getLogger('mylogger')
logger.info('this is a info')
通过getLogger
指定logger的名称,名称可以在format
中用%(name)s
格式化输出。
指定logger名称有一个好处是,在同一个程序的不同文件中引用相同名称的logger对应的是同一个实例,这有利于logging的跨文件调用。
日志等级
logging模块中日志等级分为如下几种
等级 数值
CRITICAL 50
FATAL 50
ERROR 40
WARNING 30
WARN 30
INFO 20
DEBUG 10
NOTSET 0
当我们指定一个输出级别后,只有该级别和级别更高(数值更大)的日志会输出,每个级别都对应一个输出函数,如下所示
import logging
logger = logging.getLogger(__name__)
logger.critical('Critical 50')
logger.error('Error 40')
logger.warning('Warning 30')
logger.info('Info 20')
logger.debug('Debug 10')
输出结果如下
Critical 50
Error 40
Warning 30
默认情况下只能输出warning
及以上的级别(其实这里可以省去logger
这一步,导入库后直接调用logging.info
等)
我们也可以自己设置level
import logging
logging.basicConfig(level=logging.INFO,
format='%(asctime)s %(message)s',
datefmt='%a, %d %b %Y %H:%M:%S +0000')
logging.critical('Critical 50')
logging.error('Error 40')
logging.warning('Warning 30')
logging.info('Info 20')
logging.debug('Debug 10')
输出结果如下
Sun, 01 Jul 2018 20:04:40 +0000 Critical 50
Sun, 01 Jul 2018 20:04:40 +0000 Error 40
Sun, 01 Jul 2018 20:04:40 +0000 Warning 30
Sun, 01 Jul 2018 20:04:40 +0000 Info 20
通过日志等级对日志进行分类,可以在不同位置输出不同级别的日志。
更多使用请见下一篇文章
专栏信息
专栏主页:python编程
专栏目录:目录
版本说明:软件及包版本说明