1. 程式人生 > >python logging 模塊

python logging 模塊

eth bee 負責 python logging模塊 時間 行程 增加 str

日誌模塊

python的logging模塊提供了標準的日誌接口,你可以通過它存儲各種格式的日誌,logging的日誌可以分為 debug(), info(), warning(), error() and critical() 5個級別。

同時將日誌輸出到文件和stdout。

import logging

#create logger object.
logger = logging.getLogger() #創建logger對象,用來記錄日誌
logger.setLevel(logging.DEBUG)

# create console handler and set level to debug
console_handler = logging.StreamHandler() #創建控制臺日誌對象 console_handler.setLevel(logging.DEBUG) #設置控制臺日誌級別 # create file handler and set level to warning file_handler = logging.FileHandler("test.log",‘a‘,encoding=‘utf8‘) #創建file日誌對象 file_handler.setLevel(logging.WARNING) #創建file日誌對象級別 # create log format.
formatter = logging.Formatter(%(asctime)s || %(filename)s || [line:%(lineno)d] || %(levelname)s || %(message)s) #創建日誌格式 formatter.datefmt = %a,%d %b %Y %H:%M:%S # add formatter to ch and file_handler console_handler.setFormatter(formatter) #這裏都調用相同的日誌級別 file_handler.setFormatter(formatter) # add ch and file_handler to logger
logger.addHandler(console_handler) #記錄控制臺日誌 logger.addHandler(file_handler) #記錄file日誌 # 調用logger生成測試日誌 logger.debug(debug message) logger.info(info message) logger.warn(warn message) logger.error(error message) logger.critical(critical message)

日誌級別:

LevelWhen it’s used
DEBUG Detailed information, typically of interest only when diagnosing problems.
INFO Confirmation that things are working as expected.
WARNING An indication that something unexpected happened, or indicative of some problem in the near future (e.g. ‘disk space low’). The software is still working as expected.
ERROR Due to a more serious problem, the software has not been able to perform some function.
CRITICAL A serious error, indicating that the program itself may be unable to continue running.

日誌格式:

%(name)s Logger的名字
%(levelno)s 數字形式的日誌級別
%(levelname)s 文本形式的日誌級別
%(pathname)s 調用日誌輸出函數的模塊的完整路徑名,可能沒有
%(filename)s 調用日誌輸出函數的模塊的文件名
%(module)s 調用日誌輸出函數的模塊名
%(funcName)s 調用日誌輸出函數的函數名
%(lineno)d 調用日誌輸出函數的語句所在的代碼行
%(created)f 當前時間,用UNIX標準的表示時間的浮 點數表示
%(relativeCreated)d 輸出日誌信息時的,自Logger創建以 來的毫秒數
%(asctime)s 字符串形式的當前時間。默認格式是 “2003-07-08 16:49:45,896”。逗號後面的是毫秒
%(thread)d 線程ID。可能沒有
%(threadName)s 線程名。可能沒有
%(process)d 進程ID。可能沒有
%(message)s 用戶輸出的消息

Python 使用logging模塊記錄日誌涉及四個主要類:

  logger 提供了應用程序可以直接使用的接口;
  handler 將(logger創建的)日誌記錄發送到合適的目的輸出;
  filter 提供了細度設備來決定輸出哪條日誌記錄;
  formatter 決定日誌記錄的最終輸出格式。

logger
  每個程序在輸出信息之前都要獲得一個Logger。

  Logger通常對應了程序的模塊名,比如聊天工具的圖形界面模塊可以這樣獲得它的Logger:
  LOG=logging.getLogger(”chat.gui”)


  而核心模塊可以這樣:
  LOG=logging.getLogger(”chat.kernel”)

  Logger.setLevel(lel):
    指定最低的日誌級別,低於lel的級別將被忽略。debug是最低的內置級別,critical為最高
  Logger.addFilter(filt)、Logger.removeFilter(filt):
    添加或刪除指定的filter
  Logger.addHandler(hdlr)、Logger.removeHandler(hdlr):
    增加或刪除指定的handler
  Logger.debug()、Logger.info()、Logger.warning()、Logger.error()、Logger.critical():
    可以設置的日誌級別

handler
  handler對象負責發送相關的信息到指定目的地。Python的日誌系統有多種Handler可以使用。有些Handler可以把信息輸出到控制臺,有些Logger可以把信息輸出到文件,還有些 Handler可以把信息發送到網絡上。如果覺得不夠用,還可以編寫自己的Handler。可以通過addHandler()方法添加多個多handler。

  Handler.setLevel(lel):
    指定被處理的信息級別,低於lel級別的信息將被忽略
  Handler.setFormatter():
    給這個handler選擇一個格式
  Handler.addFilter(filt)、Handler.removeFilter(filt):
    新增或刪除一個filter對象


常用的Handler:
1) logging.StreamHandler
  它的構造函數是:StreamHandler([strm])。

  使用這個Handler可以向類似與sys.stdout或者sys.stderr的任何文件對象(file object)輸出信息。其中strm參數是一個文件對象。默認是sys.stderr。

2) logging.FileHandler
  它的構造函數是:FileHandler(filename[,mode])。


  與StreamHandler類似,用於向一個文件輸出日誌信息。不過FileHandler會幫你打開這個文件。filename是文件名,必須指定一個文件名。mode是文件的打開方式。參見Python內置函數open()的用法。默認是’a‘,即添加到文件末尾。

3) logging.handlers.RotatingFileHandler
  它的構造函數是:RotatingFileHandler( filename[, mode[, maxBytes[, backupCount]]])。

  這個Handler類似於上面的FileHandler,但是它可以管理文件大小。當文件達到一定大小之後,它會自動將當前日誌文件改名,然後創建 一個新的同名日誌文件繼續輸出。比如日誌文件是chat.log。當chat.log達到指定的大小之後,RotatingFileHandler自動把 文件改名為chat.log.1。不過,如果chat.log.1已經存在,會先把chat.log.1重命名為chat.log.2。。。最後重新創建 chat.log,繼續輸出日誌信息。

  其中filename和mode兩個參數和FileHandler一樣。
  maxBytes用於指定日誌文件的最大文件大小。如果maxBytes為0,意味著日誌文件可以無限大,這時上面描述的重命名過程就不會發生。
  backupCount用於指定保留的備份文件的個數。比如,如果指定為2,當上面描述的重命名過程發生時,原有的chat.log.2並不會被更名,而是被刪除。

4) logging.handlers.TimedRotatingFileHandler
  它的構造函數是:TimedRotatingFileHandler( filename [,when [,interval [,backupCount]]])

  這個Handler和RotatingFileHandler類似,不過,它沒有通過判斷文件大小來決定何時重新創建日誌文件,而是間隔一定時間就 自動創建新的日誌文件。重命名的過程與RotatingFileHandler類似,不過新的文件不是附加數字,而是當前時間。

  其中filename參數和backupCount參數和RotatingFileHandler具有相同的意義。
  interval是時間間隔。
  when參數是一個字符串。表示時間間隔的單位,不區分大小寫。它有以下取值:
  S 秒
  M 分
  H 小時
  D 天
  W 每星期 (interval==0時代表星期一)
  midnight 每天淩晨

實現一個每天晚上rotate一個日誌文件

import logging
from logging import handlers
import time

logger = logging.getLogger(__name__,level=logging.DEBUG)
# logger 名字是__name__,就是運行程序的名字。 # logger.setLevel(logging.DEBUG)
#設置日誌級別 log_filename = "test_rotate" #設置日誌的文件名 # file_handler = handlers.RotatingFileHandler(filename=log_file,maxBytes=10,backupCount=3) # 每10bytes一個日誌文件,保留最新3份日誌文件 # file_handler = handlers.TimedRotatingFileHandler(filename=log_file,when="S",interval=5,backupCount=3) #每5秒一個日誌文件,保留最新3份日誌文件 file_handler = handlers.TimedRotatingFileHandler(filename=log_filename,when="S",interval=1,backupCount=3,encoding=‘utf-8‘) # 每1秒一個日誌文件,保留三份。 # file_handler.suffix = "%Y-%m-%d_%H_%M_%S.log" # 設置日誌文件名後綴 %Y-%m-%d_%H_%M_%S.log # file_handler = handlers.TimedRotatingFileHandler(filename=log_file,when="midnight",interval=1) # 設置淩晨開始一個新文件 # formatter = logging.Formatter( "{‘date‘:‘%(asctime)s‘,‘filename‘:‘%(filename)s‘,line‘:‘%(lineno)d‘,‘level‘:‘%(levelname)s‘,‘message‘:‘%(message)s‘}" ) file_handler.setFormatter(formatter) logger.addHandler(file_handler) # 生成日誌 for i in range(13): # 生成13秒的日誌 logger.debug(debug message) logger.info(info message) logger.warn(warn message) logger.error(error message) logger.critical(critical message) time.sleep(1) #每秒一次日誌記錄

python logging 模塊