logging.getLogger(name)
。getLogger()
具有相同名稱的多次調用將始終返回對同一Logger對象的引用。
所以在頂層的manage.py中實例化之後,後面直接使用該方法獲取Looger對象即可。
用於便捷記錄日誌且線程安全的模塊,簡單使用:
logging通常配合traceback模塊來使用,使用traceback.format_exc()可以獲取到字符串格式的異常信息,再用logging進行記錄
1、單文件日誌
import logging
logging.basicConfig(filename='log.log',
format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s',
datefmt='%Y-%m-%d %H:%M:%S %p',
level=10)
logging.debug('debug')
logging.info('info')
logging.warning('warning')
logging.error('error')
logging.critical('critical')
logging.log(10,'log')
日誌等級:
CRITICAL = 50
FATAL = CRITICAL
ERROR = 40
WARNING = 30
WARN = WARNING
INFO = 20
DEBUG = 10
NOTSET = 0
注:只有【當前寫等級】大於【日誌等級】時,日誌文件才被記錄。
日誌記錄格式:
2、多文件日誌
對於上述記錄日誌的功能,只能將日誌記錄在單文件中,如果想要設置多個日誌文件,logging.basicConfig將無法完成,需要自定義文件和日誌操作對象。
日誌一:
# 定義文件
file_1_1 = logging.FileHandler('l1_1.log', 'a', encoding='utf-8')
fmt = logging.Formatter(fmt="%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s")
file_1_1.setFormatter(fmt)
file_1_2 = logging.FileHandler('l1_2.log', 'a', encoding='utf-8')
fmt = logging.Formatter()
file_1_2.setFormatter(fmt)
# 定義日誌
logger1 = logging.Logger('s1', level=logging.ERROR)
logger1.addHandler(file_1_1)
logger1.addHandler(file_1_2)
# 寫日誌
logger1.critical('1111')
# 日誌二:
# 定義文件
file_2_1 = logging.FileHandler('l2_1.log', 'a')
fmt = logging.Formatter()
file_2_1.setFormatter(fmt)
# 定義日誌
logger2 = logging.Logger('s2', level=logging.INFO)
logger2.addHandler(file_2_1)
如上述創建的兩個日誌對象
- 當使用【logger1】寫日誌時,會將相應的內容寫入 l1_1.log 和 l1_2.log 文件中
- 當使用【logger2】寫日誌時,會將相應的內容寫入 l2_1.log 文件中
import logging
class Logger:
__instance = None
def __init__(self, filename):
# 創建一個logger並設置日誌等級
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
# 創建一個handler用於寫入日誌文件
handle = logging.FileHandler(filename)
handle.setLevel(logging.DEBUG)
# 定義handler的輸出格式(formatter)
fmt = logging.Formatter("%(asctime)s - %(levelname)s - %(message)s")
# 給handler添加formatter
handle.setFormatter(fmt)
# 給logger添加handler
logger.addHandler(handle)
self.logger = logger
def info(self, msg):
self.logger.info(msg)
logging模塊各個類分析:
Loggers:提供接口
Handlers:用於將日誌發送到相應的目標
Filters:提供更精細的日誌輸出
Formatters:格式化日誌輸出,以一種標準格式輸出
官方文檔:https://docs.python.org/3.6/library/logging.html?highlight=logging#module-logging
Logger:
通過logging.getLogger(name) 來進行實例化,多次調用具有相同名稱的getLogger() 將始終返回對同一個Logger對象的引用。
記錄日誌:
debug
(msg, *args, **kwargs)
addFilter
(filter)
Adds the specified filter filter to this logger.
removeFilter
(filter)
Removes the specified filter filter from this logger.
findCaller
(stack_info=False):
查找調用者的源文件名和行號。 以4元素元組的形式返回文件名,行號,函數名稱和堆棧信息。 堆棧信息返回爲None,除非stack_info爲True。
logger和handler都擁有setLevel方法,但是優先級有所不同:
logging.basicConfig < handler.setLevel < logger.setLevel
1.腳本中沒有配置logger.setLevel會使用handler.setLevel
2.腳本中沒有配置logger.setLevel和handler.setLevel會使用logging.basicConfig中的Level等級(默認WARNING)
Logger永遠不會直接實例化,而是始終通過模塊級函數實例化logging.getLogger(name)
logging.handlers.SocketHandler(IP,PORT) 默認使用TCP協議將日誌內容推送到主機
在日誌中使用變量:
FORMAT = '%(asctime)-15s %(clientip)s %(user)-8s %(message)s'
logging.basicConfig(format=FORMAT)
d = {'clientip': '192.168.0.1', 'user': 'fbloggs'}
logger = logging.getLogger('tcpserver')
logger.warning('Protocol problem: %s', 'connection reset', extra=d)
會印出類似的東西
2006-02-08 22:20:02,165 192.168.0.1 fbloggs Protocol problem: connection reset