1. 程式人生 > >logging模組詳解以及常見程式碼

logging模組詳解以及常見程式碼

1.在django中獲取客戶端IP地址:

if 'HTTP_X_FORWARDED_FOR' in request.META:
	ip = request.META['HTTP_X_FORWARDED_FOR']
else:
	ip = request.META['REMOTE_ADDR']

2.logging模組日誌級別:

DEBUG:最詳細的日誌資訊,典型應用場景是問題診斷;
INFO:資訊詳細程度僅次於DEBUG,通常只記錄關鍵節點資訊;
WARNING:當某些不期望的事情發生時記錄的資訊,
如:磁碟可用空間較低,但是此時應用程式還是正常執行的;
ERROR:由於一個更嚴重的問題導致某些功能不能正常執行時記錄的資訊;
CRITICAL:當發生嚴重錯誤,導致應用程式不能繼續執行時記錄的資訊.
應用上線或部署生產環境時,應該使用WARNING或ERROR或CRITICAL級別的
日誌來降低機器的I/O壓力和提高獲取錯誤日誌資訊的效率.

3.logging模組提供了兩種記錄日誌的方式:

第一種方式是使用logging提供的模組級別的函式;

第二種方式是使用Logging日誌系統的四大元件.

4.模組級別的常見程式碼:

import logging
LOG_FORMAT = "%(asctime)s %(levelname)s %(pathname)s %(message)s "#配置輸出日誌格式
DATE_FORMAT = '%Y-%m-%d  %H:%M:%S %a ' #配置輸出時間的格式,注意月份和天數不要搞亂了
logging.basicConfig(level=logging.DEBUG,
                    format=LOG_FORMAT,
                    datefmt = DATE_FORMAT ,
                    filename=r"d:\test\test.log"
                    )
logging.debug("msg1")
logging.info("msg2")
logging.warning("msg3")
logging.error("msg4")
logging.critical("msg5")

5.日誌流處理--常見程式碼:

def set_log(level, filename='minic_down.log',filedir='/data/update/'):
    log_file = os.path.join(filedir, filename)

    if not os.path.isdir(filedir):
        os.makedirs(filedir)
    if not os.path.isfile(log_file):
        os.mknod(log_file)

    log_level_total = {'debug': logging.DEBUG, 'info': logging.INFO, 'warning': logging.WARN, 'error': logging.ERROR,
                       'critical': logging.CRITICAL}
    logger_f = logging.getLogger()
    logger_f.setLevel(logging.DEBUG)
    
	fh = logging.FileHandler(log_file)
    fh.setLevel(log_level_total.get(level, logging.DEBUG))
    formatter = logging.Formatter('%(asctime)s - %(filename)s - %(levelname)s - %(message)s')
    fh.setFormatter(formatter)
    
	logger_f.addHandler(fh)
    return logger_f

# 日誌記錄器
logger = set_log('debug')

6.說明

Logger類:

1.嚮應用程式程式碼暴露幾個方法,使應用程式可以在執行時記錄日誌訊息;
2.將日誌訊息傳送給所有感興趣的日誌handlers.
我們通常用logging.getLogger()方法建立一個Logger類的例項,
有一個可選引數name,該引數表示將要返回的日誌器的名稱標識,
如果不提供該引數,則其值為'root'.
注意不能建立多個logger,否則會出現重複輸出日誌現象,
Logger.setLevel():設定日誌器處理日誌訊息的最低嚴重級.

Handler類:

Handler物件的作用是(基於日誌訊息的level)將訊息分發到handler指定的位置(檔案、網路、郵件等).
Logger物件可以通過addHandler()方法為自己新增0個或者更多個handler物件.
比如一個應用程式可能想要實現以下幾個日誌需求:
1.把所有日誌都發送到一個日誌檔案中;
2.把所有嚴重級別大於等於error的日誌傳送到stdout(標準輸出);
3.把所有嚴重級別為critical的日誌傳送到一個email郵件地址.這種場景就需要3個不同的handlers,
每個handler負責傳送一個特定級別的日誌到一個特定的位置.
Handler.setLevel():指定被處理的資訊級別,低於lel級別的資訊將被忽略;
Handler.setFormatter():給這個handler選擇一個格式.
logging.StreamHandler--將日誌訊息傳送到輸出到Stream
logging.FileHandler--將日誌訊息傳送到磁碟檔案

7.日誌流處理簡要流程:

1.建立一個logger
2.設定下logger的日誌的等級
3.建立合適的Handler(FileHandler要有路徑)
4.設定下每個Handler的日誌等級
5.建立下日誌的格式
6.向Handler中新增上面建立的格式
7.將上面建立的Handler新增到logger中
8.列印輸出logger.warning\logger.error\logger.critical
如果出現重複寫日誌,則使用前先判斷是否有相同的handler物件
如果logger.handlers列表為空,則新增;否則,直接去寫日誌
def my_logger(logger_name):
    logger = logging.getLogger(logger_name)
    logger.setLevel(logging.INFO)
    if not logger.handlers:
		fh = logging.FileHandler('hehe.log')
		formatter = logging.Formatter(
			'%(asctime)s - %(name)s - %(levelname)s - %(message)s ')
		fh.setFormatter(formatter)

		logger.addHandler(fh)

    return logger

8.捕獲 Traceback

try:
    result = 10 / 0
except Exception:
    logger.error('Faild to get result', exc_info=True)
logger.info('Finished')

參考地址:https://cuiqingcai.com/6080.html

參考地址:https://www.cnblogs.com/liujiacai/p/7804848.html

參考地址:https://www.cnblogs.com/Nicholas0707/p/9021672.html