Python标準庫logging常用的日志實作類有:StreamHandler和TimeRotatingFileHandler,
這兩者組合,可以實作按天記錄日志及實作了日志控制台上的輸出,在我們日志工作中已經
夠用了,不過Python在日志實作上,還提供了其他的Handler,具體前往logging.handlers檢視。
下面是一段代碼,結合代碼我們介紹logging的用法:
from logging.handlers import TimedRotatingFileHandler
file_handler = TimedRotatingFileHandler(filename=LOG_FILE, when="MIDNIGHT", interval=1, backupCount=30)
console_handler = logging.StreamHandler() # 輸出到控制台
file_handler.setLevel('INFO') # 定義日志等級,這裡INFO以上才輸出到檔案
console_handler.setLevel('INFO') # 定義日志等級,這裡INFO以上才輸出到控制台
上面分别定義了檔案和控制台的日志記錄handler,日志級别是INFO,日志級别定義大家非
常熟悉,跟Java是一樣的,但這裡有幾個參數非常重要:
- interval:日志滾動周期
- when:時間間隔類型,具體類型請參考下表。
- backupCount:該參數決定了能留幾個日志檔案。
舉例:
when='D',interval=2,backupCount=30
就是每2天生成一個日志檔案,保留30個日志檔案。
when="MIDNIGHT", interval=1, backupCount=30
表示每天0點為更新點,每天生成一個檔案。
下面這段代碼是日志格式定義:
fmt = '[%(asctime)s] [%(process)d] [%(levelname)s] - %(module)s.%(funcName)s (%(filename)s:%(lineno)d) - %(message)s'
formatter = logging.Formatter(fmt)
file_handler.setFormatter(formatter)
# filename="mylog" suffix設定,會生成檔案名為mylog.2020-02-25.log
file_handler.suffix = "%Y-%m-%d.log"
# extMatch是編譯好正規表達式,用于比對日志檔案名字尾
# 需要注意的是suffix和extMatch一定要比對的上,如果不比對,過期日志不會被删除。
file_handler.extMatch = re.compile(r"^\d{4}-\d{2}-\d{2}.log#34;)
console_handler.setFormatter(formatter)
logger = logging.getLogger(__file__)
logger.setLevel('INFO')
logger.addHandler(file_handler)
logger.addHandler(console_handler)
format格式字元串定義說明:
- %(asctime)s | 日志事件發生的時間,如:2003-07-08 16:49:45,896
- %(created)f | 日志事件發生的時間。
- %(msecs)d | 日志事件發生事件的毫秒部分
- %(levelname)s | 日志級别('DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL')
- %(name)s | 日志器名稱,預設是'root'
- %(message)s | 日志記錄的文本内容
- %(pathname)s | 調用日志記錄函數的源碼檔案的全路徑
- %(filename)s | pathname的檔案名部分,包含檔案字尾
- %(module)s | filename的名稱部分,不包含字尾
- %(lineno)d | 調用日志記錄函數的源代碼所在的行号
- %(funcName)s | 調用日志記錄函數的函數名
- %(process)d | ID
- %(processName)s | 程序名稱,Python 3.1新增
- %(thread)d | 線程ID
- %(thread)s | 線程名稱
生成的日志:
完整Demo:
from logging.handlers import TimedRotatingFileHandler
LOG_FILE = '/tmp/car.log'
file_handler = TimedRotatingFileHandler(filename=LOG_FILE, when="MIDNIGHT", interval=1, backupCount=30)
console_handler = logging.StreamHandler() # 輸出到控制台
file_handler.setLevel('INFO') # 定義日志等級,這裡INFO以上才輸出到檔案
console_handler.setLevel('INFO') # 定義日志等級,這裡INFO以上才輸出到控制台
# 定義日志顯示格式
fmt = '[%(asctime)s] [%(process)d] [%(levelname)s] - %(module)s.%(funcName)s (%(filename)s:%(lineno)d) - %(message)s'
formatter = logging.Formatter(fmt)
file_handler.setFormatter(formatter)
# filename="mylog" suffix設定,會生成檔案名為mylog.2020-02-25.log
file_handler.suffix = "%Y-%m-%d.log"
# extMatch是編譯好正規表達式,用于比對日志檔案名字尾
# 需要注意的是suffix和extMatch一定要比對的上,如果不比對,過期日志不會被删除。
file_handler.extMatch = re.compile(r"^\d{4}-\d{2}-\d{2}.log#34;)
console_handler.setFormatter(formatter)
logger = logging.getLogger(__file__)
logger.setLevel('INFO')
logger.addHandler(file_handler)
logger.addHandler(console_handler)
logger.info('hello,Python logging你好。')
——END——