logging模組詳解以及常見程式碼
阿新 • • 發佈:2018-11-16
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