首发于python编程
python中logging模块上篇

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.infoprint的功能,输出日志信息。前面初始化了日志输出的格式,后面代码中只需要写内容(对应message),时间等信息都会自动带上,这就是loggingprint方便的地方。

日志的输出就是这么简单,先指定输出格式,然后像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编程

专栏目录:目录

版本说明:软件及包版本说明

发布于 2018-07-01 22:31

文章被以下专栏收录