很早之前就想使用log替代print輸出調試信息,簡單使用后一直覺得程序中添加的log代碼是硬代碼,不能隨時全盤調整輸出日志的level。原來之前一直沒有成功的原因是。。。根本沒有仔細了解logging模塊到底有哪些組建和功能。
今天終於學會了如何將python的日志功能應用到工程中,可以將日志按照不同級別輸出到日志文件和開發工具的控制台console上。
參考文章:https://blog.csdn.net/langb2014/article/details/53397307
使用logging模塊的基本套路和原理看上面的文章就行,下文只列出工程目錄、效果、腳本及注意事項
一、目錄結構
二、運行效果
logdemo.log文件:
2019-06-21 16:21:39,332 - root - DEBUG - debug8 + 12 message:20 2019-06-21 16:21:39,332 - root - INFO - info8 + 12 message:20 2019-06-21 16:21:39,332 - root - WARNING - warning message 2019-06-21 16:21:39,332 - root - ERROR - error8 + 12 message:20 2019-06-21 16:21:39,333 - root - CRITICAL - critical message 2019-06-21 16:21:39,333 - root - INFO - Started 2019-06-21 16:21:39,333 - root - INFO - Doing something 2019-06-21 16:21:39,333 - root - INFO - Finished
Sublime運行的console輸出:
三、腳本
1、log.conf --logs目錄下的logging模塊的配置文件
[loggers] keys=root,main [handlers] keys=consoleHandler,fileHandler [formatters] keys=fmt [logger_root] level=DEBUG handlers=consoleHandler,fileHandler [logger_main] level=DEBUG qualname=main handlers=fileHandler [handler_consoleHandler] class=StreamHandler level=INFO formatter=fmt args=(sys.stdout,) [handler_fileHandler] class=logging.handlers.RotatingFileHandler level=DEBUG formatter=fmt args=('../logs/logdemo.log','a',20000,5,) [formatter_fmt] format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
2、run_test_excel.py --項目入口,主運行文件,調用小弟1號協助產生日志
1 # run_test_excel.py 2 import time,sys 3 import logging 4 from logging import config 5 from logs.myapp import main 6 7 class run_testcase: 8 def __init__(self): 9 logging.config.fileConfig("../logs/log.conf",disable_existing_loggers=False) 10 logger = logging.getLogger("simpleExample") 11 def add(self,d1,d2): 12 logging.debug('debug%s + %s message:%s'%(d1,d2,d1+d2)) 13 logging.info('info%s + %s message:%s'%(d1,d2,d1+d2)) 14 logging.warning('warning message') 15 logging.error('error%s + %s message:%s'%(d1,d2,d1+d2)) 16 logging.critical('critical message') 17 main() 18 return d1+d2 19 if __name__ == '__main__': 20 run = run_testcase() 21 run.add(8,12)
3、myapp.py --協助多模塊日志輸出功能的小弟1號,調用小弟2號協助產生日志
1 # myapp.py 2 import logging 3 from logging import config 4 from logs import mylib 5 6 def main(): 7 logging.info('Started') 8 mylib.do_something() 9 logging.info('Finished') 10 11 if __name__ == '__main__': 12 main()
4、mylib.py --協助多模塊日志輸出功能的小弟2號
1 # mylib.py 2 import logging 3 4 def do_something(): 5 logging.info('Doing something')
注意事項:
1、日志檢索異常raise KeyError(key),KeyError: 'formatters'
原因:很有可能是主函數logging.config.fileConfig("../logs/log.conf",xxx)時,log.conf路徑錯誤,找不到配置文件,會報此錯誤
2、本文只是個簡單Demo,如果涉及到多線程,可能會產生日志輸出和保存異常,本Demo暫時驗證不了。
總之:以上就是 Python使用logging模塊,在項目中多模塊調用產生日志同時輸入到1個日志文件且輸出到編輯工具console上的全部內容。