1. 程式人生 > >django日誌設定

django日誌設定

# 首先了解一下日誌的基礎知識:

我們使用的是python自帶的logging模組進行的。 

重點在於生成和處理日誌訊息。每條訊息由一些文字和指示其嚴重性的相關級別組成。級別包含符號名稱和數字值。

=>日誌等級

級別 描述
CRITICAL 50 關鍵錯誤/訊息
ERROR 40 錯誤
WARNING 30 警告訊息
INFO 20 通知訊息
DEBUG 10 除錯
NOTSET 0 無級別,只要是資訊都會寫入,這樣日誌將會很大,沒必要

=> 內建處理器

    logging模組提供了一些處理器,可以通過各種方式處理日誌訊息。使用addHandler()方法將這些處理器新增給Logger物件。另外還可以為每個處理器配置它自己的篩選和級別。

    handlers.DatagramHandler(host,port):傳送日誌訊息給位於制定host和port上的UDP伺服器。

      handlers.FileHandler(filename):將日誌訊息寫入檔案filename。

      handlers.HTTPHandler(host, url):使用HTTP的GET或POST方法將日誌訊息上傳到一臺HTTP 伺服器。

      handlers.RotatingFileHandler(filename):將日誌訊息寫入檔案filename。如果檔案的大小超出maxBytes制定的值,那麼它將被備份為filename1。

    由於內建處理器還有很多,如果想更深入瞭解。可以檢視官方手冊。

# 在django中的基礎使用

首先在setting檔案裡面設定:

#匯入模組
import logging
import django.utils.log
import logging.handlers


#logging_setting
# 為了將日誌檔案按天儲存,
rq = time.strftime('%Y%m%d', time.localtime(time.time()))
# 日誌檔案路徑
BASE_LOG_DIR = os.path.join(BASE_DIR, "logs")
# 日誌logging的基礎配置,分四步走,第一步格式化日誌內容
LOGGING = {
    'version': 1,  # 保留字
    'disable_existing_loggers': False,  # 禁用已經存在的logger例項
    # 日誌檔案的格式
    'formatters': {
        # 詳細的日誌格式
        'standard': {
            'format': '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]''[%(levelname)s][%(message)s]'
        },
        # 簡單的日誌格式
        'simple': {
            'format': '[%(asctime)s][%(levelname)s][%(filename)s:%(lineno)d]%(message)s'
        },
    },
    # 第二步:過濾器
    'filters': {
    },
    # 第三步 自定義處理器
    'handlers': {
        # 日誌等級CRITICAL > ERROR > WARNING > INFO > DEBUG
        'console': {
            'level': 'INFO',
            'class': 'logging.StreamHandler', #原生的sql語句會列印至日誌,會導致檔案很大。所以最好註釋掉
            'stream' : 'ext://sys.stdout',
            # 檔案重定向的配置,將列印到控制檯的資訊都重定向出去 python manage.py runserver >> /home/aea/log/test.log
             'formatter': 'standard'
             # 制定輸出的格式,注意 在上面的formatters配置裡面選擇一個,否則會報錯
             },
         'file': {
             'level': 'INFO',
             'class': 'logging.FileHandler',
             'filename': os.path.join(BASE_LOG_DIR, f"{rq}_info.log"),
             #這是將普通日誌寫入到日誌檔案中的方法,
              'formatter': 'standard' },

        # 預設的
        'default': {
            'level': 'INFO',
            'class': 'logging.handlers.RotatingFileHandler',  # 儲存到檔案,自動切
            'filename': os.path.join(BASE_LOG_DIR, f"{rq}_info.log"),  # 日誌檔案
            'maxBytes': 1024 * 1024 * 50,  # 日誌大小 50M
            'backupCount': 3,  # 最多備份幾個
            'formatter': 'standard',
            'encoding': 'utf-8',
        },
        # 專門用來記錯誤日誌
        'error': {
            'level': 'ERROR',
            'class': 'logging.handlers.RotatingFileHandler',  # 儲存到檔案,自動切
            'filename': os.path.join(BASE_LOG_DIR, f"{rq}_err.log"),  # 日誌檔案
            'maxBytes': 1024 * 1024 * 50,  # 日誌大小 50M
            'backupCount': 5,
            'formatter': 'standard',
            'encoding': 'utf-8',
        },
    },
  # 註冊日誌的處理器
    'loggers': {
        'django': {
            'handlers': ['console', 'file'],
            # 這裡直接輸出到控制檯只是請求的路由等系統console,當使用重定向之後會把所有內容輸出到log日誌
            'level': 'INFO', 'propagate': True, },

        'django.request ': {
            'handlers': ['console', 'file'],
            'level': 'INFO',
             # 配合上面的將警告log寫入到另外一個檔案 'propagate': True,
            },
       # 預設的logger
        '': {
            'handlers': ['default', 'error'],
            'level': 'INFO',
            'propagate': True,  # 向不向更高級別的logger傳遞
        },
        'Server.web.views': {
            'handlers': ['default', 'error'],
            'level': 'INFO',
            'propagate': True
        },
    },
}

以上是基本設定,註冊了這個之後,開起來就好了,自定義的時候只需要在目標頁面建立一個logger 就好了。

自定義: logger = logging.getLogger('Server.web.views') 裡面的是註冊的然後使用就好了。

上面的level後面的必須是大寫,否則會報錯。無法識別的等級。