首頁 > 軟體

Django logging紀錄檔模組範例詳解(紀錄檔記錄模板設定)

2022-08-21 14:00:45

一.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、紀錄檔記錄結果展示:

總結

到此這篇關於Django logging紀錄檔模組的文章就介紹到這了,更多相關Django logging紀錄檔模組內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com