python——logging模块基础篇

Posted SsoZh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python——logging模块基础篇相关的知识,希望对你有一定的参考价值。

本文是以python官方文档howto logging 翻译附带部分自己改的代码

1.Basic Logging Tutorial

Logging 就是在软件运行时,追踪事件的发生。软件开发人员通过调用logging来确认特定事件的发生。开发者用一个消息来描述某个时间,具体描述可以包含变量数据(因为每次事件发生,变量可能是不同的)。另外不同的事件重要程度也不同,而重要性可以通过 level或者severity来描述。

1.1. When to use logging

Logging库为简单的logging提供了一组方便的函数,其中包括debug(),info(),warning(),error()和critical()。下表说明了何时使用什么函数来logging:

Task you want to perform The best tool for the task
在命令行显示一个程序(或脚本)的常规使用方法 print()
报告在程序中一个常规事件(操作)的发生 logging.info() (or logging debug())
针对特定事件发出警告 logging.warning() (or warnings.warn())
报告有关特定运行时事件的错误 raise an exception
在不引发异常时候报告对错误的抑制 logging.error(),logging.exception(),logging.critical()

logging函数是根据他们的level命名的,具体描述如下:

Level When it‘s used
DEBUG 详细信息,通常只有在诊断问题时才感兴趣。
INFO 确认一切正常
WARNING 表示发生了意想不到的事情,或者表示在不久的将来出现了某个问题(例如“磁盘空间不足”)。该软件仍按预期工作
ERROR 由于一个更严重的问题,软件无法执行一些功能
CRITICAL 严重错误,指示程序本身可能无法继续运行。

其中,WARNING是默认的level,这意味着只有高于或等于这个level的事件会被跟踪。
另外,跟踪事件的最简单方法是打印到控制台,另一种常见的方法是将他们写入日志文件。

1.2. A simple example

import logging 
logging.warning('Watch out!')  # will be display on the console
logging.info('I told you so')  # won't be display by default 

1.3. Logging to a file

另外一种非常常见的情况是在文件中记录日志文件,下面让我们来看一下。注意一定要重新开启一个python解释器,而不要接着上面的代码继续写。

import logging
import os
# 先删除过去的日志文件,否则会追加在后面
if os.path.isfile('./example.log'):
    print('delete the last example.log')
    os.remove('./example.log')
print('create a new example.log')
logging.basicConfig(filename='example.log',level=logging.DEBUG)
logging.debug('This message should go to the log file')  # all don't display on the console
logging.info('So should this')
logging.warning('And this, too')   # this is the highest level debug < info < waring < error < critical

这个例子还向我们展示了如何设置level阈值(threshold),在这个例子中阈值设置为DEBUG,所以将所有消息都打印出来。另外你可以在命令行设置这个阈值:
--log=INFO

具体的代码写法如下:

# 学习通过args输入loglevel来进行日志判别。
# assuming loglevel is bound to the string value obtained from the
# command line argument. Convert to upper case to allow the user to
# specify --log=DEBUG or --log=debug
parser = argparse.ArgumentParser(description='logging usage:')
parser.add_argument('-l', '--log', default='WARING', type=str,
                    help='input loglevel')
args = parser.parse_args()
loglevel=args.log
# getattr(obj,param1,param2)  获取obj中param1(可以是方法也可以是属性,其中方法后面+括号即可使用),如果没有就返回param2
numeric_level = getattr(logging,loglevel.upper(),None)  # 将DEBUG这些字符串level转化为数字50level,否则输出None
if not isinstance(numeric_level, int):
    raise ValueError('Invalid log level:%s'%loglevel)
logging.basicConfig(level=numeric_level)

另外函数调用basicConfig应该在debug(),info()这些之前。因为他是一个一次性的简单配置工具,所以只有第一个调用会实际执行任何操作,后续调用是无操作的。
如果你多次运行脚本,example.log中的消息是追加的,如果你希望每次都重新开始(如我上面的写法),也可以按照下面的做:

logging.basicConfig(filename='example.log',filemode='w',level=logging.DEBUG) 

1.4. Logging from multiple modules

如果你的程序包括多个模块,下面这个例子告诉你如何组织logging:
在myapp.py文件中,代码如下:

# myapp.py
import logging
import mylib

def main():
    logging.basicConfig(filename='myapp.log',level=logging.DEBUG)
    logging.info('Started!')
    mylib.do_something()
    logging.info('Finished!')

if __name__ == '__main__':
    main()

在mylib.py文件中(也就是模块B),代码如下:

# mylib.py
import logging
def do_something():
    logging.info('Doing something!')

最后会在myapp.log中打印:

INFO:root:Started!
INFO:root:Doing something!
INFO:root:Finished!

上面这种简单的用法,你只能知道打印了Doing something,却不知道这个INFO是哪个model打印的。后面的Advanced logging tutorial会讲。

1.5. Logging variable data

logging模块是可以打印变量的,使用方法就是str.format({}.format类型)和str.Template(%s%d%f类型)。

1.6. Changing the format of displayed messages

关于logging打印的格式,也是在basicConfig中改变的使用关键词format=,具体例如如下:

logging.basicConfig(format='%(filename)s,%(levelname)s:%(message)s',level=logging.DEBUG)
logging.debug('this message should appear on the console')
logging.info('So should this!')
logging.warning('And this, too')

打印结果如下:

howto_logging.py,DEBUG:this message should appear on the console
howto_logging.py,INFO:So should this!
howto_logging.py,WARNING:And this, too

另外其他的logging模型常用的format格式说明如下:

format格式 格式说明
%(levelno)s 打印日志级别的数值
%(levelname)s 打印日志级别名称
%(pathname)s 打印当前执行程序的路径,其实就是sys.argv[0]
%(filename)s 打印当前执行程序名
%(funcName)s 打印日志的当前函数
%(lineno)d 打印日志的当前行号
%(asctime)s 打印日志的时间
%(thread)d 打印线程ID
%(threadName)s 打印线程名称
%(process)d 打印进程ID
%(message)s 打印日志信息

以上就是简单的logging基础教程,本教程基本遵循官方文档howto logging,加上一点点自己的代码和注释。

官方文档:https://docs.python.org/3.5/howto/logging.html

以上是关于python——logging模块基础篇的主要内容,如果未能解决你的问题,请参考以下文章

Python学习笔记——基础篇第六周——logging模块

Python基础篇-day6

Python学习—基础篇之常用模块

Python学习笔记——基础篇第六周——模块

Python学习之旅 —— 基础篇模

常用python日期日志获取内容循环的代码片段