python使用logging模塊方法 教程

logging模塊是Python內置的標準模塊,主要用於輸出運行日誌,可以設置輸出日誌的等級、日誌保存路徑、日誌文件回滾等;相比print,具備如下優點:

可以通過設置不同的日誌等級,在release版本中只輸出重要信息,而不必顯示大量的調試信息;
print將所有信息都輸出到標準輸出中,嚴重影響開發者從標準輸出中查看其它數據;logging則可以由開發者決定將信息輸出到什麼地方,以及怎麼輸出;

  1. logging模塊的日誌級別

logging模塊默認定義了以下幾個日誌等級,它允許開發人員自定義其他日誌級別,但是這是不被推薦的,尤其是在開發供別人使用的庫時,因爲這會導致日誌級別的混亂。

日誌等級(level) 描述

DEBUG   最詳細的日誌信息,典型應用場景是 問題診斷
INFO    信息詳細程度僅次於DEBUG,通常只記錄關鍵節點信息,用於確認一切都是按照我們預期的那樣進行工作
WARNING 當某些不期望的事情發生時記錄的信息(如,磁盤可用空間較低),但是此時應用程序還是正常運行的
ERROR   由於一個更嚴重的問題導致某些功能不能正常運行時記錄的信息
CRITICAL    當發生嚴重錯誤,導致應用程序不能繼續運行時記錄的信息
開發應用程序或部署開發環境時,可以使用DEBUG或INFO級別的日誌獲取儘可能詳細的日誌信息來進行開發或部署調試;應用上線或部署生產環境時,應該使用WARNING或ERROR或CRITICAL級別的日誌來降低機器的I/O壓力和提高獲取錯誤日誌信息的效率。日誌級別的指定通常都是在應用程序的配置文件中進行指定的。

說明:

上面列表中的日誌等級是從上到下依次升高的,即:DEBUG < INFO < WARNING < ERROR < CRITICAL,而日誌的信息量是依次減少的;
當爲某個應用程序指定一個日誌級別後,應用程序會記錄所有日誌級別大於或等於指定日誌級別的日誌信息,而不是僅僅記錄指定級別的日誌信息,nginx、php等應用程序以及這裏要提高的python的logging模塊都是這樣的。同樣,logging模塊也可以指定日誌記錄器的日誌級別,只有級別大於或等於該指定日誌級別的日誌記錄纔會被輸出,小於該等級的日誌記錄將會被丟棄。

1.輸出到日誌裏,詳細見如下代碼:

#!/usr/bin/python
# -*- coding: utf-8 -*-

import logging

# 第一步
# 創建一個logger
terLog = logging.getLogger('__nginx__')
# 設置logger級別 log等級總開關
terLog.setLevel(level=logging.INFO)

# 第二步
# 輸出到file名稱
fileLog = logging.FileHandler('nginxLog.txt')
# 輸出到file的log等級開關
fileLog.setLevel(logging.INFO)

# 第三步定義handler輸出格式
deFormat = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fileLog.setFormatter(deFormat)

# 第四步 將fileLog添加到terLog裏面
terLog.addHandler(fileLog)

# 日誌
terLog.info("Start print log 123 魏若愚")
terLog.debug("Do something debug魏若愚")
terLog.warning("Something maybe fail.warning魏若愚")
terLog.info("Finish info魏若愚")

2只輸出到屏幕

3同時輸出到屏幕,並且輸出到日誌裏,如下代碼:

#!/usr/bin/python
# -*- coding: utf-8 -*-

import logging

# 第一步
# 創建一個logger
terLog = logging.getLogger('__nginx__')
# 設置logger級別 log等級總開關
terLog.setLevel(level=logging.INFO)

# 第二步
# 輸出到file名稱
fileLog = logging.FileHandler('nginxLog.txt')
# 輸出到file的log等級開關
fileLog.setLevel(logging.INFO)

#同時輸出到屏幕
outputConsole = logging.StreamHandler()
outputConsole.setLevel(logging.INFO)

# 第三步定義handler輸出格式
deFormat = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fileLog.setFormatter(deFormat)
# 同時設置輸出屏幕格式
outputConsole.setFormatter(deFormat)

# 第四步 將fileLog添加到terLog裏面
terLog.addHandler(fileLog)

# 同時輸出到屏幕東中
terLog.addHandler(outputConsole)

# 日誌
terLog.info("Start print log 123 魏若愚")
terLog.debug("Do something debug魏若愚")
terLog.warning("Something maybe fail.warning魏若愚")
terLog.info("Finish info魏若愚")

輸出屏幕結果:

2019-03-11 16:55:16,066 - __nginx__ - INFO - Start print log 123 魏若愚
2019-03-11 16:55:16,086 - __nginx__ - WARNING - Something maybe fail.warning魏若愚
2019-03-11 16:55:16,086 - __nginx__ - INFO - Finish info魏若愚
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章