本文是以 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
来源: http://www.bubuko.com/infodetail-3298842.html