Python攻克之路-logging模块
logging模块
记录日志是追踪事件的一种手段。通过添加日志,开发者可以清楚地了解发生了哪些事件,包括出现了哪些错误。logging 模块提供了一系列便捷的函数,用于简单的日志记录。它们分别是 debug(), info(), warning(), error() 和 critical()。

In [1]: import logging
1.日志级别分析
描述:debug,info并没有输出,因为级别不够,但是可以内部设置,日志有两种形式:直接标准输出到屏幕和写入到文件中
In [2]: logging.debug('debug msg')
In [3]: logging.info('info msg')
In [4]: logging.warning('warning msg')
WARNING:root:warning msg
In [5]: logging.error('error msg')
ERROR:root:error msg
In [6]: logging.critical('critical msg')
CRITICAL:root:critical msg
2.配置日志输出
a.配置参数
basicConfig: logging的基本配置方法,只能对写文件或打印屏幕二选一
level: 日志级别,有五个级别,默认的是warnging,可以多输出几个,从debug开始
format: 自定义日志格式,%()的是变量,actime是时间,filename记录的日志文件名称,lineno程序在第几行记录,levelname级别名称,message记录的内容
datefmt: 返回时间格式
filename: 日志文件名称
filemode: 文件模式,日志有打印到屏幕和文件中两种,现在要写成日志的形式,所以filemode='w'表现日志内容只写日志不打印到屏幕,
w是写,现在写的会覆盖之前的,如果要追加使用a,默认是a
stream: 用指定的stream创建StreamHandler,可以指定输了到sys.stderr,sys.stdout或者文件,默认为sys.stderr.若同时列出了filename和
stream两个参数,则stream参数会被忽略
format参数中可能用到的格式化串:
%(name)s Logger的名字
%(levelno)s 数字形式的日志级别
%(levelname)s 文本形式的日志级别
%(filename)s 调用日志输出函数模块的文件名
%(pathname)s 调用日志输出函数模块的完整路径名,可能没有
%(module)s 调用日志输出函数模块名
%(funcName)s 调用日志输出函数的函数名
%(lineno)d 调用日志输出函数语句所在的代码行
%(created)f 当前时间,用UNIX标准的表示时间浮点数表示
%(relativeCreated)d 输出日志信息时,自Logger创建以来毫秒数
%(asctime)s 字符串形式的当们时间.默认格式j "2008-07-07 13:33:44,323" 逗号后面是毫秒
%(thread)d 线程ID,可能没有
%(threadName)s 线程名,可能没有
%(process)d 进程ID,可能没有
%(message)s 用户输出的的消息
b.配置日志输出
[root@python3 day18]# cat logging_module.py
#!/usr/local/python3/bin/python3
import logging
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
datefmt='%a,%d %b %Y %H:%M:%S',
filename='log.log',
filemode='w')
logging.info('info msg')
logging.warning('warning msg')
logging.error('error msg')
logging.critical('critical msg')
logging.critical('critical msg')
[root@python3 day18]# tail log.log
Tue,27 Mar 2018 20:44:39 logging_module.py[line:8] INFO info msg
Tue,27 Mar 2018 20:44:39 logging_module.py[line:9] WARNING warning msg
Tue,27 Mar 2018 20:44:39 logging_module.py[line:10] ERROR error msg
Tue,27 Mar 2018 20:44:39 logging_module.py[line:11] CRITICAL critical msg
asctime filename lineno levelname message
c.配置打印屏幕
[root@python3 day18]# cat logging_module.py
#!/usr/local/python3/bin/python3
import logging
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
datefmt='%a,%d %b %Y %H:%M:%S')
#filename='log.log', ##不写日志
#filemode='a')
logging.info('info msg')
logging.warning('warning msg')
logging.error('error msg')
logging.critical('critical msg')
[root@python3 day18]# python3 logging_module.py
Tue,27 Mar 2018 21:04:15 logging_module.py[line:8] INFO info msg
Tue,27 Mar 2018 21:04:15 logging_module.py[line:9] WARNING warning msg
Tue,27 Mar 2018 21:04:15 logging_module.py[line:10] ERROR error msg
Tue,27 Mar 2018 21:04:15 logging_module.py[line:11] CRITICAL critical msg
3.logger的使用
描述: 还有一个模块级别的函数(功能强大)是logging.getLogger([name])(返回一个logger对象,如果没有指定名字将返回root logger)
灵活定义日志输出的方式

[root@python3 day18]# cat logger.py
#!/usr/local/python3/bin/python3
import logging
logger = logging.getLogger()
#取得一个logger对象, 创建一个handler,用于写入日志文件
fh = logging.FileHandler('log.log')
# 再创建一个handler,filehandler是一个文件输出流的对象,就是通过fh调用就放在文件中
ch = logging.StreamHandler()
# 屏幕的一个标准输出流的对象
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
# 格式,定义成formatter去接收,以上把每个都封装成一个对象
fh.setFormatter(formatter)
# 有了4个对象,4个对象就开始工作,fh是一个文件输出,文件输出需要一个格式,所以传入formatter作参数
# setFormatter是创建一个格式,得到formatter,就表示fh有标准输出格式
ch.setFormatter(formatter)
# 屏幕输出与fh的表示一样
logger.addHandler(fh)
# addHandler增加输出方式,logger是最终的一个日志对象,fh文件输出
logger.addHandler(ch)
# 增加屏幕输出方式
# 以上的操作是创建对象过程
# 以下是生成信息
logger.debug('debug msg')
logger.info('info msg')
logger.warning('warning msg')
logger.error('error msg')
logger.critical('critical msg')
[root@python3 day18]# python3 logger.py #默认是warning,所以waring后面都可以打印
2018-03-28 07:44:12,637 - root - WARNING - warning msg
2018-03-28 07:44:12,638 - root - ERROR - error msg
2018-03-28 07:44:12,638 - root - CRITICAL - critical msg
[root@python3 day18]# cat log.log
2018-03-28 07:44:12,637 - root - WARNING - warning msg
2018-03-28 07:44:12,638 - root - ERROR - error msg
2018-03-28 07:44:12,638 - root - CRITICAL - critical msg
4.设置日志级别
描述:使用logger.setLevel(logging.DEBUG)方式来设置日志级别,默认使用WARNING,所以只能输出大于WARNING的级别
[root@python3 day18]# cat logger.py
#!/usr/local/python3/bin/python3
import logging
logger = logging.getLogger()
fh = logging.FileHandler('log.log')
ch = logging.StreamHandler()
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter)
ch.setFormatter(formatter)
#logger.addHandler(fh) ##不写文件
logger.addHandler(ch)
logger.setLevel(logging.DEBUG) ####设置级别
logger.debug('debug msg')
logger.info('info msg')
logger.warning('warning msg')
logger.error('error msg')
logger.critical('critical msg')
[root@python3 day18]# python3 logger.py
2018-03-28 08:04:13,810 - root - DEBUG - debug msg
2018-03-28 08:04:13,810 - root - INFO - info msg
2018-03-28 08:04:13,811 - root - WARNING - warning msg
2018-03-28 08:04:13,811 - root - ERROR - error msg
2018-03-28 08:04:13,811 - root - CRITICAL - critical msg

浙公网安备 33010602011771号