[ Python入門教程 ] Python中日志記錄模塊logging使用實例


 python中的logging模塊用於記錄日志。用戶可以根據程序實現需要自定義日志輸出位置、日志級別以及日志格式。

將日志內容輸出到屏幕

  一個最簡單的logging模塊使用樣例,直接打印顯示日志內容到屏幕。

import logging

logging.critical("critical log")
logging.error("error log")
logging.warning("warning log")
logging.info("info log")
logging.debug("debug log")

  輸出結果如下:

CRITICAL:root:critical log
ERROR:root:error log
WARNING:root:warning log

  說明:默認情況下python的logging模塊將日志打印到標准輸出,並且只顯示大於等於warning級別的日志(critical > error > warning > info > debug)。

將日志內容輸出到文件

    將日志事件記錄到文件是一種非常常見的情況,方便出現問題時快速定位問題。在logging模塊默認配置條件下,記錄日志內容,代碼如下:

import logging

logging.basicConfig(filename='example.log',level=logging.DEBUG)
logging.debug('This message should go to the log file')
logging.info('So should this')
logging.warning('And this, too')

  輸出結果如下:

D:\pycharm\work>type example.log  
DEBUG:root:This message should go to the log file
INFO:root:So should this
WARNING:root:And this, too

 說明:type為dos窗口下查看文件內容命令。

定制日志內容(日志級別、日志格式)

  根據程序運行對日志記錄的要求,通常需要自定義日志顯示格式、輸出位置以及日志顯示級別。可以通過logging.basicConfig()定制滿足自己要求的日志輸出格式。

import logging

logging.basicConfig(format='[%(asctime)s %(filename)s line:%(lineno)d] %(levelname)s: %(message)s',
                    level=logging.DEBUG, filename="log.txt", filemode="w")
logging.debug('This message should appear on the console')
logging.info('So should this')
logging.warning('And this, too')

  輸出結果如下:

D:\pycharm\work>type log.txt
[2020-02-02 10:31:42,994 json_pro.py line:5] DEBUG: This message should appear on the console
[2020-02-02 10:31:42,995 json_pro.py line:6] INFO: So should this
[2020-02-02 10:31:42,995 json_pro.py line:7] WARNING: And this, too

  通過修改logging.basicConfig()函數中參數取值來定制日志顯示。函數參數定義及含義如下:

  filename 指定日志寫入文件名。

  filemode 文件打開方式,默認值為"a"

  format 設置日志顯示格式

  dateft 設置日期時間格式

  level 設置顯示日志級別

  stream 指定stream創建StreamHandler。可以指定輸出到sys.stderr,sys.stdout或者文件。默認為sys.stderr。

  format參數用到的格式化字符串如下:

  %(asctime)s 字符串形式的當前時間。默認格式是 “2003-07-08 16:49:45,896”。逗號后面的是毫秒

  %(filename)s 調用日志輸出函數的模塊的文件名

  %(levelname)s 文本形式的日志級別

  %(funcName)s 調用日志輸出函數的函數名

  %(lineno)d 調用日志輸出函數的語句所在的代碼行

  %(message)s 用戶輸出的消息

  %(module)s 調用日志輸出函數的模塊名

多模塊記錄日志

  如果開發的程序包含多個模塊,就需要考慮日志間的記錄方式。基本樣例如下:

主程序文件:

# myapp.py
import logging
import mylib

def main():
    logging.basicConfig(format='[%(asctime)s %(filename)s line:%(lineno)d] %(levelname)s: %(message)s',
                    level=logging.DEBUG, filename="log.txt", filemode="w")
    logging.info('Started')
    mylib.do_something()
    logging.info('Finished')

if __name__ == '__main__':
    main()

 模塊mylib.py的代碼如下:

import logging

def do_something():
    logging.info('Doing something')

輸出結果如下:

D:\pycharm\work>type log.txt
[2020-02-02 10:54:52,074 json_pro.py line:8] INFO: Started
[2020-02-02 10:54:52,074 mylib.py line:4] INFO: Doing something
[2020-02-02 10:54:52,074 json_pro.py line:10] INFO: Finished

日志同時輸出屏幕和寫入文件

  logging模塊可以通過FileHander和StreamHandler分別制定向文件和屏幕輸出。

import logging

logger = logging.getLogger()  # 不加名稱設置root logger
logger.setLevel(logging.DEBUG)
formatter = logging.Formatter(
    '%(asctime)s - %(name)s - %(levelname)s: - %(message)s',
    datefmt='%Y-%m-%d %H:%M:%S')

# 使用FileHandler輸出到文件
fh = logging.FileHandler('log.txt')
fh.setLevel(logging.DEBUG)
fh.setFormatter(formatter)

# 使用StreamHandler輸出到屏幕
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
ch.setFormatter(formatter)

# 添加兩個Handler
logger.addHandler(ch)
logger.addHandler(fh)
logger.info('this is info message')
logger.warning('this is warn message')

  控制台輸出如下:

[2020-02-02 10:58:16 json_pro.py line:22] INFO: this is info message
[2020-02-02 10:58:16 json_pro.py line:23] WARNING: this is warn message

  日志文件內容如下:

D:\pycharm\work>type log.txt
[2020-02-02 10:58:55 json_pro.py line:22] INFO: this is info message
[2020-02-02 10:58:55 json_pro.py line:23] WARNING: this is warn message

 小結

  本文介紹了記錄日志模塊logging基本場景使用實例。如果需要更好、更靈活的使用logging模塊查看官方幫助文檔:https://docs.python.org/zh-cn/3/howto/logging.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM