日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Django?logging日志模塊實例詳解(日志記錄模板配置)_python

作者:在奮斗的大道 ? 更新時間: 2022-10-17 編程語言

一.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

欄目分類
最近更新