一个好的程序必定会有一个好的log模块,这是软件设计的重点之一。一个好的log模块可以让你快速定位问题所在,让维护的感到神清气爽,编写便赞叹。“さすが、先輩です”
话不多说,言归正传。一起来探索一下python 的logging 模块。
先从简单的来说起。
import logging
def main():
# config the logging module
logging.basicConfig(
level=logging.ERROR,
format="%(asctime)s %(levelname)-8s %(name)-15s %(message)s"
)
hostname = 'www.python.org'
item = 'spam'
filename = 'data.csv'
mode = 'r'
logging.critical("Host %s is unknown", hostname)
logging.error("Couldn't find %s", item)
logging.warning("Feature is deprecated.")
logging.info("opening file %r mode=%r", filename, mode)
logging.debug("Got here")
if __name__ == "__main__":
main()
运行结果如下:
2020-05-30 17:07:24,341 CRITICAL root Host www.python.org is unknown
2020-05-30 17:07:24,341 ERROR root Couldn’t find spam
上面是python的logging库最简单使用案例。没有更简单的了。
这里重点说一下logging模块的格式,python 有很多内置的格式,可以使用。传送门logging Format
这种方式有没有感觉到很不好用的地方,每次都要不停修改logging配置部分,如何过这个python文件被打包成exe文件,是不是,logging相关的配置就完全不能改了,是不是很坑?那要怎么解决呢,当然是配置文件。
下面是logconfig.conf文件的内容。 具体如何去写一个logconfig.conf可以参考夏下边的文章
如何写logging configure 文件
[loggers]
keys=root
[handlers]
keys=defaultHandler
[formatters]
keys=defaultFormatter
[logger_root]
level=INFO
handlers=defaultHandler
qualname=root
[handler_defaultHandler]
class=FileHandler
formatter=defaultFormatter
args=('app.log', 'a')
[formatter_defaultFormatter]
format=%(levelname)s:%(name)s:%(message)s
接下来是主程序的逻辑
import logging
import logging.config
def main():
# config the logging module
logging.config.fileConfig('logconfig.ini')
hostname = 'www.python.org'
item = 'spam'
filename = 'data.csv'
mode = 'r'
logging.critical("Host %s is unknown", hostname)
logging.error("Couldn't find %s", item)
logging.warning("Feature is deprecated.")
logging.info("opening file %r mode=%r", filename, mode)
logging.debug("Got here")
if __name__ == "__main__":
main()
最终log会被打印到app.log文件中。
今天先到这里,logging模块还有及其丰富的配置,这里只讲到非常非常一般的情况。后续有时间再来深度挖掘一下。