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')
这个例子还向我们展示了如何设置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