1. 程式人生 > 其它 >Django logging日誌模組詳解(日誌記錄模板配置)

Django logging日誌模組詳解(日誌記錄模板配置)

一.Django日誌
Django使用python內建的logging模組列印日誌,Python的logging配置由四個部分組成:

1>.記錄器(Logger)

2>.處理程式(Handler)

3>.過濾器(Filter)

4>.格式化(Formatter)

二、Logger 記錄器
Logger 是日誌系統的入口。每個 logger 都是命名了的 bucket, 訊息寫入 bucket 以便進一步處理。

Logger 可以配置 日誌級別。日誌級別描述了由該 logger 處理的訊息的嚴重性。Python 定義了下面幾種日誌級別:

DEBUG:排查故障時使用的低級別系統資訊
INFO:一般的系統資訊
WARNING:描述系統發生了一些小問題的資訊
ERROR:描述系統發生了大問題的資訊
CRITICAL:描述系統發生嚴重問題的資訊
每一條寫入 logger 的訊息都是一條 日誌記錄。每一條日誌記錄也包含 日誌級別,代表對應訊息的嚴重程度。日誌記錄還包含有用的元資料,來描述被記錄的事件細節,例如堆疊跟蹤或者錯誤碼。

當 logger 處理一條訊息時,會將自己的日誌級別和這條訊息的日誌級別做對比。如果訊息的日誌級別匹配或者高於 logger 的日誌級別,它就會被進一步處理。否則這條訊息就會被忽略掉。

當 logger 確定了一條訊息需要處理之後,會把它傳給 Handler。

Django 內建記錄器
類 類功能描述
django.request 請求處理相關的日誌訊息。5xx響應被提升為錯誤訊息;4xx響應被提升為警告訊息。
django.server 由RunServer命令呼叫的伺服器所接收的請求的處理相關的日誌訊息。HTTP 5XX響應被記錄為錯誤訊息,4XX響應被記錄為警告訊息,其他一切都被記錄為INFO。
django.template 與模板呈現相關的日誌訊息
django.db.backends 有關程式碼與資料庫互動的訊息。例如,請求執行的每個應用程式級SQL語句都在除錯級別記錄到此記錄器。
三、Handler 處理程式
Handler 是決定如何處理 logger 中每一條訊息的引擎。它描述特定的日誌行為,比如把訊息輸出到螢幕、檔案或網路 socket。

和 logger 一樣,handler 也有日誌級別的概念。如果一條日誌記錄的級別不匹配或者低於 handler 的日誌級別,對應的訊息會被 handler 忽略。

一個 logger 可以有多個 handler,每一個 handler 可以有不同的日誌級別。這樣就可以根據訊息的重要性不同,來提供不同格式的輸出。例如,你可以新增一個 handler 把 ERROR 和 CRITICAL 訊息發到尋呼機,再新增另一個 handler 把所有的訊息(包括 ERROR 和 CRITICAL 訊息)儲存到檔案裡以便日後分析。

Logging 自身攜帶Handler
logging模組提供了一些處理器,可以通過各種方式處理日誌訊息。

類名 功能描述
logging.StreamHandler 類似與sys.stdout或者sys.stderr的任何檔案物件(file object)輸出資訊
logging.FileHandler 將日誌訊息寫入檔案filename。
logging.handlers.DatagramHandler(host,port) 傳送日誌訊息給位於制定host和port上的UDP伺服器。使用UDP協議,將日誌資訊傳送到網路
logging.handlers.HTTPHandler(host, url) 使用HTTP的GET或POST方法將日誌訊息上傳到一臺HTTP 伺服器。
logging.handlers.RotatingFileHandler(filename) 將日誌訊息寫入檔案filename。如果檔案的大小超出maxBytes制定的值,那麼它將被備份為filenamel。
logging.handlers.SocketHandler 使用TCP協議,將日誌資訊傳送到網路。
logging.handlers.SysLogHandler 日誌輸出到syslog
logging.handlers.NTEventLogHandler 遠端輸出日誌到Windows NT/2000/XP的事件日誌
logging.handlers.SMTPHandler 遠端輸出日誌到郵件地址
logging.handlers.MemoryHandler 日誌輸出到記憶體中的制定buffer
注意:由於內建處理器還有很多,如果想更深入瞭解。可以檢視官方手冊。

四、Filter過濾器
在日誌從 logger 傳到 handler 的過程中,使用 Filter 來做額外的控制。

預設情況下,只要級別匹配,任何日誌訊息都會被處理。不過,也可以通過新增 filter 來給日誌處理的過程增加額外條件。例如,可以新增一個 filter 只允許某個特定來源的 ERROR 訊息輸出。

Filter 還被用來在日誌輸出之前對日誌記錄做修改。例如,可以寫一個 filter,當滿足一定條件時,把日誌記錄從 ERROR 降到 WARNING 級別。

Filter 在 logger 和 handler 中都可以新增;多個 filter 可以連結起來使用,來做多重過濾操作。

五、Formatters格式化器
日誌記錄最終是需要以文字來呈現的。Formatter 描述了文字的格式。一個 formatter 通常由包含 LogRecord attributes 的 Python 格式化字串組成,不過你也可以為特定的格式來配置自定義的 formatter。

格式 描述
%(name)s 記錄器 logger 的名字
%(levelno)s 資料形式的日誌記錄級別
%(levelname)s 文字形式的日誌記錄級別
%(filename)s 執行日誌記錄呼叫的原始檔的檔名
%(pathname)s 執行日誌記錄呼叫的原始檔的 全路徑+檔名
%(funcName)s 執行日誌記錄呼叫的函式名稱
%(module)s 呼叫的模組名稱,django是 app 的名稱
%(lineno)d 記錄呼叫的行號
%(created)s 執行日誌記錄的時間
%(asctime)s 日期時間
%(msecs)s 毫秒部分
%(thread)s 執行緒ID
%(threadName)s 執行緒名稱
%(process)d 程序ID
%(message)s 記錄的訊息,自定義內容
時間格式引數:

格式 描述
'S' Seconds
'M' Minutes
'H' Hours
'D' Days
'W0' - 'W6' Weekday (0=Monday)
'midnight' Roll over at midnight
六:Django 整合日誌logginger 模組

1、在專案setting.py 檔案中,配置logginger 日誌, 核心程式碼如下:

# 日誌配置
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'verbose': {
'format': '{levelname} {asctime} {module} {process:d} {thread:d} {message}',
'style': '{',
},
'simple': {
'format': '{levelname} {message}',
'style': '{',
},
"default": {
"format": '%(asctime)s %(name)s %(pathname)s:%(lineno)d %(module)s:%(funcName)s '
'%(levelname)s- %(message)s',
"datefmt": "%Y-%m-%d %H:%M:%S"
},
},
'handlers': {
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
'formatter': 'default'
},
'file': {
'level': 'DEBUG',
'class': 'logging.handlers.TimedRotatingFileHandler',
'filename': os.path.join(BASE_DIR, 'logs/debug.log'),
'when': "D",
'interval': 1,
'formatter': 'default'
},
"request": {
'level': 'DEBUG',
'class': 'logging.FileHandler',
'filename': os.path.join(BASE_DIR, 'logs/request.log'),
'formatter': 'default'
},
"server": {
'level': 'DEBUG',
'class': 'logging.FileHandler',
'filename': os.path.join(BASE_DIR, 'logs/server.log'),
'formatter': 'default'
},
"root": {
'level': 'DEBUG',
'class': 'logging.FileHandler',
'filename': os.path.join(BASE_DIR, 'logs/root.log'),
'formatter': 'default'
},

"db_backends": {
'level': 'DEBUG',
'class': 'logging.FileHandler',
'filename': os.path.join(BASE_DIR, 'logs/db_backends.log'),
'formatter': 'default'
},
"autoreload": {
'level': 'INFO',
'class': 'logging.FileHandler',
'filename': os.path.join(BASE_DIR, 'logs/autoreload.log'),
'formatter': 'default'
}
},
'loggers': {
# 應用中自定義日誌記錄器
'mylogger': {
'level': 'DEBUG',
'handlers': ['console', 'file'],
'propagate': True,
},
"django": {
"level": "DEBUG",
"handlers": ["console", "file"],
'propagate': False,
},
"django.request": {
"level": "DEBUG",
"handlers": ["request"],
'propagate': False,
},
"django.server": {
"level": "DEBUG",
"handlers": ["server"],
'propagate': False,
},
"django.db.backends": {
"level": "DEBUG",
"handlers": ["db_backends"],
'propagate': False,
},
"django.utils.autoreload": {
"level": "INFO",
"handlers": ["autoreload"],
'propagate': False,
}
},
'root': {
"level": "DEBUG",
"handlers": ["root"],
}
}
2、應用中新增logginger 日誌記錄

1、在應用的views.py 檔案中新增logging 模組依賴,並在相關方法中輸出相關日誌記錄

import logging

# 日誌輸出常量定義
logger = logging.getLogger('mylogger')

# json 資料提交,並轉換為實體,執行入庫操作
def insertJSON(request):
logger.info("post request body 請求資料提交")
json_str = request.body
json_str = json_str.decode() # python3.6及以上不用這一句程式碼
dict_data = json.loads(json_str) # loads把str轉換為dict,dumps把dict轉換為str

item = Book()
objDictTool.to_obj(item, **dict_data)
print("名稱: {}, 價格: {}, 作者: {}".format(item.name, item.price, item.author))
# 執行資料庫插入
item.save()
return response_success(message="資料入庫成功")
注意:在logginer 配置檔案中,定義自定義記錄器mylogger 對應例項化物件就是views.py 檔案中例項的logging物件。

3、日誌記錄結果展示:


原文連結:https://blog.csdn.net/zhouzhiwengang/article/details/119606262