Python logging模塊

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章