可能我们经常会使用 print 来输出信息到窗口, 但当我们有很多个 py 文件需要运行, 项目比
较庞大的到时候, print 简直就是太 low 了点了那么我们可以使用强大的 logging 模块, 把
输出到指定的本地 pc 某个路径的文件中
一 logging 的框架
1 Loggers: 可供程序直接调用的接口, app 通过调用提供的 api 来记录日志
2 Handlers: 决定将日志记录分配至正确的目的地
3 Filters: 对日志信息进行过滤, 提供更细粒度的日志是否输出的判断
4 Formatters: 制定最终记录打印的格式布局
二 Log 级别
系统默认有 6 个级别, 优先级:
- CRITICAL 50
- ERROR 40
- WARNING 30
- INFO 20
- DEBUG 10
- NOTSET 0
设置要打印的 log 时只需要设置优先级, 比如设置打印 INFO, 那么比 INFO 优先级高的 WARNING/ERROR/CRITICAL 都将被打印
三 正常的打印
这里只输出了 ERROR 和 WARNING 的信息, 是因为 logging 默认的输出级别是 WARNING
四 输出到指定文件
来看看这样写的代码:
- import logging
- import unittest
- class lgtest(unittest.TestCase):
- logging.basicConfig(filename=../LOG/+__name__+.log,format=[%(asctime)s-%(filename)s-%(levelname)s:%(message)s], level = logging.DEBUG,filemode=a,datefmt=%Y-%m-%d %I:%M:%S %p)
- def test(self):
- logging.error("这是一条 error 信息的打印")
- logging.info("这是一条 info 信息的打印")
- logging.warning("这是一条 warn 信息的打印")
- logging.debug("这是一条 debug 信息的打印")
- if __name__==__main__:
- unittest.main()
使用 logging.basicConfig 来指定要输出的文件以及 log 的输出形式包括时间格式日志级别等等
Filename: 指定路径的文件这里使用了 + name + 是将 log 命名为当前 py 的文件名
Format: 设置 log 的显示格式 (即在文档中看到的格式) 分别是时间 + 当前文件名 + log 输出级别 + 输出的信息
Level: 输出的 log 级别, 优先级比设置的级别低的将不会被输出保存到 log 文档中
Filemode: log 打开模式
a: 代表每次运行程序都继续写 log 即不覆盖之前保存的 log 信息
w: 代表每次运行程序都重新写 log 即覆盖之前保存的 log 信息
五 最终的 log 文档
文件名与 py 文件名相同, 因为 basicConfig 里面使用了 name 来获取的
我们来看看内容, 这是运行了两次 py 文件的内容:
[2018-02-10 02:29:57 PM-Logout.py-ERROR: 这是一条 error 信息的打印]
[2018-02-10 02:29:57 PM-Logout.py-INFO: 这是一条 info 信息的打印]
[2018-02-10 02:29:57 PM-Logout.py-WARNING: 这是一条 warn 信息的打印]
[2018-02-10 02:29:57 PM-Logout.py-DEBUG: 这是一条 debug 信息的打印]
[2018-02-10 02:39:32 PM-Logout.py-ERROR: 这是一条 error 信息的打印]
[2018-02-10 02:39:32 PM-Logout.py-INFO: 这是一条 info 信息的打印]
[2018-02-10 02:39:32 PM-Logout.py-WARNING: 这是一条 warn 信息的打印]
[2018-02-10 02:39:32 PM-Logout.py-DEBUG: 这是一条 debug 信息的打印]
运行一次会有 4 个信息打印出来, 因为 filemode 设置成了 a, 所以再次运行时不会覆盖
之前的 log 信息, 就有 8 条信息了
Ok,log 输出到文档就这么简单当然大家如果弄熟了可以自己写记录器过滤器等
来源: http://www.bubuko.com/infodetail-2494117.html