Python 使用logging記錄日誌
python的logging模塊
導入logging模塊,調用debug、info、warning、error、critical等函數記錄日誌。默認情況下,logging將日誌打印到屏幕終端,只有日誌級別比WARNING高的日誌纔會被顯示。
import logging
logging.debug("debug message")
logging.info("info message")
logging.warning('warn message')
logging.error('error message')
logging.critical('critical message')
logging模塊基礎概念
在典型的使用場景中,一個日誌記錄器使用一個日誌處理器,一個日誌處理器使用一個日誌格式化。
Logger:日誌記錄器,是應用程序中能直接使用的接口
Handler:日誌處理器,用以表明將日誌保存到什麼地方以及保存多久
Formatter:格式化,用以配置日誌的輸出格式。
配置日誌格式
通過basicConfig方法對日誌進行簡單配置,會在當前目錄下產生一個app.log文件。日誌會保存所有WARN級別及以上級別的日誌。每一條日誌包含了打印日誌的時間、日誌的級別和日誌的內容。
import logging
logging.basicConfig(level=logging.WARN,
format='%(asctime)s : %(name)s : %(levelname)s :%(filename)s : [%(lineno)d]: %(message)s',
datefmt='%Y-%m-%d %H:%M:%S',
filename='app.log',
filemode='a'
)
logging.debug("debug message")
logging.info("info message")
logging.warning('warn message')
logging.error('error message')
logging.critical('critical message')
logging.basicConfig(**kwargs)參數設置
格式 | 描述 |
---|---|
filename | 指定文件名 |
filemode | ‘r’、‘w’、’a’ ,默認爲a |
datefmt | 使用time.strftime()所接受的指定日期/時間格式 |
level | 默認生成的root logger的level是logging.WARNING,低於該級別的就不輸出了,級別排序:CRITICAL>ERROR>WARNING>INFO>DEBUG |
LogRecord屬性
屬性名稱 | 格式 | 描述 |
---|---|---|
args | 參數組成的元組合併到msg中以生成消息或dict | |
asctime | %(asctime)s | 創建日誌記錄的時間 |
created | %(created)f | 創建日誌記錄的時間由time.time()函數返回時間戳 |
filename | %(filename)s | 路徑名的文件名部分 |
funcName | %(funcName)s | 包含日誌記錄調用的函數的名稱 |
levelname | %(levelname)s | 消息的文本日誌級別 |
levelno | %(levelno)s | 消息的數字日誌級別(NOTSET-0、DEBUG-10、INFO-20、WARNING-30、ERROR-40、CRITICAL-50) |
lineno | %(lineno)d | 發出日誌調用的源行號 |
message | %(message)s | 已記錄的消息 |
module | %(module)s | 模塊(文件名的名稱部分) |
msg | 在原始日誌記錄調用中傳遞的格式字符串。與args合併以生成消息或任意對象 | |
name | %(name)s | 用於記錄調用的日誌程序的名稱 |
pathname | %(pathname)s | 發出日誌調用的源文件的完整路徑名 |
process | %(process)d | 進程ID |
processName | %(processName)s | 進程名 |
示例
將日誌同時保存到文件和打印到屏幕上
import logging
def set_logger(log_file="./monitor.log"):
root_logger = logging.getLogger()
root_logger.setLevel(logging.INFO)
# 在屏幕上輸出
sh = logging.StreamHandler()
# 保存到文件
fh = logging.FileHandler(log_file,mode='w')
# 設置日誌級別
sh.setLevel(logging.WARN)
fh.setLevel(logging.WARN)
# 設置日誌顯示的格式
formatters = logging.Formatter("%(asctime)s : %(name)s : %(levelname)s :%(filename)s : [%(lineno)d]: %(message)s")
sh.setFormatter(formatters)
fh.setFormatter(formatters)
# 把對象加到logger裏
root_logger.addHandler(sh)
root_logger.addHandler(fh)
return root_logger
log = set_logger()
log.debug("debug message")
log.info("info message")
log.warning('warn tttsage')
log.error('error message')
log.critical('critical message')