Python/ target=_blank class=infotextkey>Python logging模塊使用
在開發和維護Python應用程序時,日志記錄是一項非常重要的任務。Python提供了內置的logging模塊,它可以幫助我們方便地記錄應用程序的運行時信息、錯誤和調試信息。本文將介紹如何使用Python logging模塊進行日志記錄。
獲取更多技術資料,請點擊!
logging模塊
logging是Python自帶的用于記錄程序運行日志的模塊,它將日志分為5個等級,分別是:
- DEBUG
- INFO
- WARNING
- ERROR
- CRITICAL
同時也可以將日志輸出到控制臺或者寫入到日志文件中。
logging中的常用對象
- Logger:日志記錄器,是應用程序中可以直接使用的接口。
- Handler:日志處理器,用以表明將日志保存到什么地方以及保存多久。
- Formatter:格式化,用以配置日志的輸出格式。
三者關系為,一個 Logger 使用一個 Handler,一個 Handler 使用一個 Formatter。
日志輸出到控制臺
import logging
# 創建logger實例
logger = logging.getLogger('example')
# 設置日志級別
logger.setLevel(logging.DEBUG)
# 創建控制臺處理器,將日志輸出到控制臺
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.DEBUG)
# 創建日志格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
# 將日志格式應用到處理器
console_handler.setFormatter(formatter)
# 將處理器添加到logger實例中
logger.addHandler(console_handler)
# 記錄日志信息
logger.debug('debug')
logger.info('info')
logger.warning('warning')
logger.error('error')
logger.critical('critical')
運行代碼,控制臺輸出如下:
2023-06-29 11:04:29,242 - example - DEBUG - debug
2023-06-29 11:04:29,242 - example - INFO - info
2023-06-29 11:04:29,242 - example - WARNING - warning
2023-06-29 11:04:29,242 - example - ERROR - error
2023-06-29 11:04:29,242 - example - CRITICAL - critical
日志輸出到文件
更多時候,我們需要將日志保存起來,所以我們可以指定將日志輸出到日志文件中,代碼如下:
import logging
filename = "{}.log".format(__file__)
fmt = "%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s"
logging.basicConfig(
level=logging.DEBUG,
filename=filename,
filemode="w",
format=fmt
logging.info("info")
logging.debug("debug")
logging.warning("warning")
logging.error("error")
logging.critical("critical")
日志文件內容如下圖:
同時輸出到文件和控制臺
import logging
# 創建logger對象
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG) # log等級總開關
# log輸出格式
formatter = logging.Formatter("%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s")
# 控制臺handler
stream_handler = logging.StreamHandler()
stream_handler.setLevel(logging.INFO) # log等級的開關
stream_handler.setFormatter(formatter)
# 文件handler
file_handler = logging.FileHandler("logging.log")
file_handler.setLevel(logging.WARNING) # log等級的開關
file_handler.setFormatter(formatter)
# 添加到logger
logger.addHandler(stream_handler)
logger.addHandler(file_handler)
# 輸出日志
logger.info("info")
logger.debug("debug")
logger.warning("warning")
logger.error("error")
logger.critical("critical")
logging.conf配置文件
我們可以通過logging.conf來配置日志的輸出,logging.conf名稱是固定的。
[loggers]
keys = root
[handlers]
keys = logfile
[formatters]
keys = generic
[logger_root]
handlers = logfile
[handler_logfile]
class = handlers.TimedRotatingFileHandler
args = ('demo.log', 'midnight', 1, 10)
level = DEBUG
formatter = generic
[formatter_generic]
format = %(asctime)s %(levelname)-3.5s [%(name)s:%(lineno)s] %(message)s
import logging.config
logging.config.fileConfig('logging.conf')
logging.debug('debug message')
logging.info("info message")
logging.warning('warning message')
logging.error("error message")
logging.critical('critical message')
運行結果如下:
循環覆蓋式日志處理
隨著程序逐漸運行,日志規模會越來越大,我們就需要刪除掉之前的日志,也可以設置單個日志的大小,當日志大小達到限定值時,會自動開始寫入新的日志文件。
import logging
from logging.handlers import RotatingFileHandler
logger = logging.getLogger("root")
# 設置logger等級
logger.setLevel(logging.DEBUG)
# 設置日志格式
formatter = logging.Formatter(
fmt='%(asctime)s - %(pathname)s - %(name)s - %(levelname)s: - %(message)s',
datefmt='%Y-%m-%d %H:%M:%S')
# 設置日志回滾 # 單個日志文件最大為1k,
# 最多保存4份日志文件(除了當前寫入的文件外)
# 日志文件編碼格式為utf-8
handler = RotatingFileHandler("logging.log", maxBytes=1024 * 1, backupCount=4, encoding='utf-8')
handler.setFormatter(formatter)
# 給logger添加handler
logger.addHandler(handler)
# 測試主模塊
for i in range(100):
logger.debug("測試日志mAIn %d", i)
總結
通過使用Python的logging模塊,我們可以方便地進行日志記錄并獲得應用程序的運行時信息。我們可以設置不同的日志級別,根據需要記錄調試信息、警告、錯誤等。此外,我們還可以將日志記錄到文件中,以供后續查看和分析。
使用logging模塊進行日志記錄可以幫助我們更好地理解應用程序的運行狀況,并幫助我們快速定位和解決問題。建議在開發和維護Python應用程序時,充分利用logging模塊進行日志記錄。