1. 程式人生 > >django日誌配置

django日誌配置

前言

在web系統的開發環境以及生產環境中,經常要檢視日誌。記錄日誌的方法有很多(輕易不要使用print),在django中,我們可以通過 import logging 直接使用Python內建的logging模組來實現.

理解logging

網上關於logging的資料有不少,大多也都是圍繞官方文件來寫的,我們可以參考。如果看別人寫的文件覺得發懵,那就需要先系統瞭解一下logging,請看官方文件。穩妥起見,請確認你檢視的文件與使用的django版本一致。

快速瞭解
logging機制中,有四個主要的部分:

  • Loggers
  • Handlers
  • Filters
  • Formatters

Loggers
Loggers中的logger是整個日誌機制的入口,一個logger對應一種型別的日誌。logger通過設定日誌級別(level屬性),來配置logger的觸發條件。Python中定義了5種日誌級別:
由低到高分別為:DEBUG -> INFO -> WARNING -> ERROR -> CRITICAL
程式碼中通過 logger = logging.getLogger('django') 獲得一個logger的例項,’django’是一種型別的日誌。
當一條日誌資訊發給logger時,日誌資訊的log level會和logger的log level對比。如果日誌資訊的log level達到或者是超過logger的log level的級別,這條資訊會被髮往handler去處理。否則,這條資訊會被忽略。一旦logger決定資訊要進一步被處理,這條資訊會被傳給給Handler(logger的handler屬性).
所以,logger更像是一個日誌處理的分發器。

Handlers
handler是實際上來處理日誌記錄的地方。它說明的是一個特殊的記錄行為,比如,將這個資訊寫在螢幕上、寫到一個檔案或者寫到一個Network socket中去。這一點是通過handler的class屬性來配置的。
與logger一樣,handler也有日誌級別(level)屬性,如果logger傳來的記錄級別沒有handler高,那麼這條記錄也會被忽略。

為什麼logger和handler都要設定level?
因為一個logger可以有多個handler,且每個handler可以有不同的log level。這樣一來,一個logger可以接受一類日誌的多個級別的資訊,並且將不同級別的資訊進行不同的處理。

Filters
filters是在資訊從logger傳遞到handler的過程中實施一些過濾行為。
如果filters屬性沒有被設定,即視為預設情況。預設情況下,任何達到log level的日誌資訊都會被處理。
如果配置了filter,你可以在logging過程中新增一些額外的過濾功能。比如,只允許某個指定的來源的ERROR資訊發給handler.
filters也可以修改日誌記錄的級別。比如,你可以寫一個Filter, 設定在一些特殊情況,能夠將ERROR級別的日誌記錄降級為WARNING級別。
filters可以在Loggers和handlers裡面設定。多個filters可以同時作用於一個地方,起到多重過濾的作用。

Formatters
一條日誌記錄需要以文字的形式展現出來,Formatters定義了文字的格式。一個格式化器一般由python的格式字串組成。不過,你也可以自定義格式。

使用Logging

使用logging的標準方法如下:

# import the logging library
import logging

# Get an instance of a logger
logger = logging.getLogger(__name__)

def my_view(request, arg1, arg):
    ...
    if bad_mojo:
        # Log an error message
        logger.error('Something went wrong!')

每當bad_mojo條件滿足,都會發送一個error級別的日誌記錄。例項程式碼中的__name__代表logger的名稱。
如果logger的定義如下,那麼__name__就是’django’或’django.request’。

'loggers': {
    ...
    'django': {
        'handlers': ['console'],
        'level': os.getenv('DJANGO_LOG_LEVEL', 'DEBUG'),
        'propagate': True,
    },
    'django.request': {
        'handlers': ['file', 'mail_admins'],
        'level': 'WARNING',
        'propagate': False,
    },
    ...
}

logger的命名規則使用”.”(dot)來標識層級關係,上例中,’django’是’django.request’的上級。這種層級關係的設計,使得低層次logger接收到的日誌資訊,也可以被上級logger收到。實踐中,我們可以定義一個頂級的logger,用來接收所有下級logger的日誌資訊。
這種傳播可以在每個logger基礎上進行控制。如果你不想讓特定的logger傳播到它的上級,可以關閉這個行為。通過設定'propagate': False,來實現。

記錄日誌

根據上述日誌的5各級別,記錄日誌也有5個對應的方法。

  • logger.debug()
  • logger.info()
  • logger.warning()
  • logger.error()
  • logger.critical()

此外,還有兩種日誌方法

  • logger.log() 手動記錄一個日誌,隨便你想記錄什麼都行
  • logger.exception() 為了捕獲某些異常,建立一個ERROR級別的日誌

配置日誌

logger的配置都是在settings.py中進行的。看下栗子:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'verbose': {
            'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s'
        },
        'simple': {
            'format': '%(levelname)s %(message)s'
        },
    },
    'filters': {
        'special': {
            '()': 'project.logging.SpecialFilter',
            'foo': 'bar',
        },
        'require_debug_true': {
            '()': 'django.utils.log.RequireDebugTrue',
        },
    },
    'handlers': {
        'console': {
            'level': 'INFO',
            'filters': ['require_debug_true'],
            'class': 'logging.StreamHandler',
            'formatter': 'simple'
        },
        'mail_admins': {
            'level': 'ERROR',
            'class': 'django.utils.log.AdminEmailHandler',
            'filters': ['special']
        }
    },
    'loggers': {
        'django': {
            'handlers': ['console'],
            'propagate': True,
        },
        'django.request': {
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': False,
        },
        'myproject.custom': {
            'handlers': ['console', 'mail_admins'],
            'level': 'INFO',
            'filters': ['special']
        }
    }
}

所有與日誌有關的配置預設在LOGGING ={}中,distConfig格式。如果我們沒有進行特別配置,Django會執行預設的日誌配置。

預設配置

  • DEBUG = True
    ‘django’這個logger以及其(除了django.server之外的)所有下級的INFO以上的日誌,都會被StreamHandler處理(輸出到console)
  • DEBUG = Flase
    ‘django’這個logger以及其(除了django.server之外的)所有下級的ERROR和CRITICAL的日誌,都會被AdminEmailHandler處理(傳送至指定郵件)

如果我們不想使用預設的配置,可以將LOGGING中的'disable_existing_loggers'設定為True(預設也是True),這樣一來,預設的配置就會被禁用。但是設定'disable_existing_loggers': True,必須要非常小心,因為可能產生一些令人意外的結果(官網這麼說的,還沒試過),所以比較建議的方法是'disable_existing_loggers': False,然後重寫部分或者全部的預設logger。

檔案形式輸出日誌

以下程式碼是將日誌檔案輸出到檔案的例子,如果需要參照,注意把'filename'換成自己的檔案路徑和檔名。

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'file': {
            'level': 'DEBUG',
            'class': 'logging.FileHandler',
            'filename': '/path/to/django/debug.log',
        },
    },
    'loggers': {
        'django': {
            'handlers': ['file'],
            'level': 'DEBUG',
            'propagate': True,
        },
    },
}

在控制檯中輸出日誌

這種方式在本地開發環境進行除錯時比較有幫助,很直觀,需要的時候馬上就能看到輸出,不必切換到檔案或者查收郵件。不過在生產環境下最好不要輸出到控制檯。預設情況下,只有在DEBUG = True的時候才會將日誌輸出到控制檯,而且只處理INFO以上級別的日誌。預設情況下,這種日誌並不會輸出很多資訊,如果你想看到操作資料庫的細節,可以在logger的level中設定'level': os.getenv('DJANGO_LOG_LEVEL', 'DEBUG'),這樣就可以了。不過這樣產生的日誌也有點太多了。

import os

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console': {
            'class': 'logging.StreamHandler',
        },
    },
    'loggers': {
        'django': {
            'handlers': ['console'],
            'level': os.getenv('DJANGO_LOG_LEVEL', 'INFO'),
        },
    },
}

再回頭看看第一段例子程式碼,這裡再拿出來晒一次

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'verbose': {
            'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s'
        },
        'simple': {
            'format': '%(levelname)s %(message)s'
        },
    },
    'filters': {
        'special': {
            '()': 'project.logging.SpecialFilter',
            'foo': 'bar',
        },
        'require_debug_true': {
            '()': 'django.utils.log.RequireDebugTrue',
        },
    },
    'handlers': {
        'console': {
            'level': 'INFO',
            'filters': ['require_debug_true'],
            'class': 'logging.StreamHandler',
            'formatter': 'simple'
        },
        'mail_admins': {
            'level': 'ERROR',
            'class': 'django.utils.log.AdminEmailHandler',
            'filters': ['special']
        }
    },
    'loggers': {
        'django': {
            'handlers': ['console'],
            'propagate': True,
        },
        'django.request': {
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': False,
        },
        'myproject.custom': {
            'handlers': ['console', 'mail_admins'],
            'level': 'INFO',
            'filters': ['special']
        }
    }
}

這個例子相比之前的會稍微複雜一些。
formatters中有兩個格式的配置,'verbose''simple',這裡'simple'定義的輸出格式很簡單,因為只是用來輸出一些INFO資訊,並不是重要的日誌,因此也並不需要複雜的格式。'verbose'輸出的資訊就比較豐富了,可以用在ERROR或CRITICAL日誌的輸出。具體的格式請參考這裡

學習例子程式碼,不僅僅是學習用法,更重要的是領會意圖

handlers中定義了兩個handler:'console''mail_admins''console'配置'class': 'logging.StreamHandler',這個我們不用過多去說。重點看看'mail_admins',配置'class': 'django.utils.log.AdminEmailHandler',那麼既然要配置為通過郵件傳送日誌,那麼是不是有必要設定一下發送和接收的郵件呢?
郵箱的配置也在settings.py中:

# 郵件配置
EMAIL_HOST = 'smtp.maildomain.com'  # SMTP地址
EMAIL_PORT = 25  # SMTP埠
EMAIL_HOST_USER = '[email protected]'  # 傳送郵件的郵箱
EMAIL_HOST_PASSWORD = '******'  # 我的郵箱密碼
EMAIL_SUBJECT_PREFIX = u'[prefix]'  # 為郵件Subject-line字首,預設是'[django]'
EMAIL_USE_TLS = True  # 與SMTP伺服器通訊時,是否啟動TLS連結(安全連結)。預設是false
# 管理員站點
SERVER_EMAIL = '[email protected]'  # The email address that error messages come from, such as those sent to ADMINS and MANAGERS.
ADMINS = (('receiver', '[email protected]'),)  # 接收郵件的郵箱(或郵件組)

Loggers

Django提供了一些內建的logger,比如上面例子中的'django'

django

'django'只是一個最上級的logger,但實際上並不接收什麼實際的資訊,所有的資訊都是通過下級logger接收。

django.request

django.request是要受理關於請求(request)的日誌記錄。如果response是5XX,則被認為是ERROR級別的日誌資訊,4XX則是WARNING級別。

django.server

django.server是要受理關於伺服器端處理請求的結果的日誌記錄。如果response是5XX,則被認為是ERROR級別的日誌資訊,4XX則是WARNING級別,其他的都是INFO級別。

django.template

django.template受理關於模板(templates)的資訊。語法錯誤是DEBUG級別,未被捕獲的異常會產生WARNING。

django.db.backends

django.db.backends受理程式碼與資料庫互動過程產生的日誌資訊。只記錄application級別的SQL操作資訊,並且都會產生DEBUG級別的資訊。資訊中包含耗時、SQL語句、引數資訊。此logger只能在DEBUG = True時才有效。
這個logger並不記錄framework-level的資訊,如SET TIMEZONE,也不記錄事務管理相關的查詢,如BEGIN、COMMIT、ROLLBACK等。想知道這方面的資訊,只有去查資料庫的日誌了,Django並不提供。

以上是摘取的例子,其他logger,請自行查閱

Filters

未完

相關推薦

django 日誌配置和使用

我用的django的版本是1.5,聽聞django可以配置日誌模組,不用自己單獨寫,於是一陣狂搜加看官方文件解決了我的需求。 我的需求是需要配置多個日誌檔案,網上搜出來大部分是一個的,所以給大家一個我的例子做參考。 1.在setting.py裡面配置如下: # m

django日誌配置

前言 在web系統的開發環境以及生產環境中,經常要檢視日誌。記錄日誌的方法有很多(輕易不要使用print),在django中,我們可以通過 import logging 直接使用Python內建的logging模組來實現. 理解logging 網上關於

[轉]django 日誌logging的配置以及處理

handler mat exc 管理 系統 critical bdn ecs 自己的 http://davidbj.blog.51cto.com/4159484/1433741 日誌在程序開發中是少不了的,通過日誌我們可以分析到錯誤在什麽地方,有什麽異常。在生產環境

django開發日誌配置

做django開發離不開 日誌,這用於儲存我門的伺服器的日誌資訊,便於開發人員的維護。 直接上程式碼: 在setting.py檔案裡直接配置即可 LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'fo

Django 日誌模組 logging 的配置

本文將通過一個實際的例子來說明如何配置 logging 模組。更多資訊可以參考 Django 的官網文件。 配置資訊需要在 setting.py 檔案中進行新增。 setting.py DEBUG = True # 通過這種方式可以開啟 DEBUG 模式 L

tomcat6 日誌配置說明

ref code directory resolv ffi host name 應用 style 一、tomcat 中應用記錄日誌的三種方式 abc 1、開啟請求訪問日誌 access.log日誌方法(默認關閉) 修改如下配置文件 tomcat/conf/server.xm

Python之路58-Django安裝配置及一些基礎知識點

python目錄一、安裝Django二、創建工程三、創建app四、靜態文件五、模板路徑六、設置settings七、定義路由八、定義視圖九、渲染模板十、運行Django是一款Python的web框架一、安裝Djangopip3 install django安裝完成後C:\Python35\Script下面會生成

日誌配置詳解

lin XML html表格 記錄 文件中 對齊方式 oca read val #①配置根Logger,其語法為: # #log4j.rootLogger = [level],appenderName,appenderName2,... #level是日誌記錄的優先級,分為

Nginx 訪問日誌配置

cte 4.0 clr live get ide onf 定義 window [[email protected]/* */ conf]# cat nginx.conf worker_processes 1; error_log logs/error

springBoot(4):日誌配置-logback

springboot 日誌配置-logback和log4j2 一、簡介支持日誌框架:Java Util Logging, Log4J2 and Logback,默認是使用logbacklogback配置方式spring boot默認會加載classpath:logback-spring.xml或者cl

CentOS 6.6 sudo日誌配置

centos 6.6 linux sudo日誌配置 系統管理 CentOS 6.6 sudo日誌配置查詢syslog和sudo軟件是否已安裝[[email protected]/* */ ~]# rpm-qa|egrep "sudo|syslog"rsyslog-5.8.10-8.

Linux下安裝Python3的django配置mysql作為django默認數據庫(轉載)

make lba del log pri ica www src rim 我的操作系統為centos6.5 1 首先選擇django要使用什麽數據庫。django1.10默認數據庫為sqlite3,本人想使用mysql數據庫,但為了測試方便順便要安裝一下sqlite開發

log4j2日誌配置

當前 core 大於 web 例如 2.7 random ces ltr log4j2日誌配置 背景   log4j2相對於log4j 1.x有了脫胎換骨的變化,其官網宣稱的優勢有多線程下10幾倍於log4j 1.x和logback的高吞吐量、可配置的審計型日誌、基於插

Django 環境配置

blog 回車 sta list images -c clas site ont 開始 —— 搜索——輸入 “cdm”——回車確認進入 2 如果文件在 d:\tools\123 3 輸入 c:>d: 回車 4 輸入 d:>c

mybatis打印sql日誌配置

ati log ron log4j 查詢語句 日誌配置 -- imp myba <settings> <!-- 打印查詢語句 --> <setting name="logImpl" value="ST

Spring Boot中實現logback多環境日誌配置

cati feature gprof 配置 color app config 現在 ng- 在Spring Boot中,可以在logback.xml中的springProfile標簽中定義多個環境logback.xml: <springProfile name=

nginx日誌配置

nginx日誌配置nginx的log日誌分為access log 和 error log其中access log 記錄了哪些用戶,哪些頁面以及用戶瀏覽器、ip和其他的訪問信息error log 則是記錄服務器錯誤日誌錯誤日誌的形式如下:10.1.1.1 - - [22/Aug/2014:16:48:14 +0

django media配置

rom csdn 輸入12 root os.path 什麽 absolute ase import 一 media是幹什麽的   media是指用戶上傳的文件,比如model裏的FileField,ImageField上傳的文件。 二 如何設置   在settings

Log4J日誌配置詳解

append tar 行號 中間 註意 -h 控制 復制代碼 #### 一、Log4j簡介Log4j有三個主要的組件:Loggers(記錄器),Appenders (輸出源)和Layouts(布局)。這裏可簡單理解為日誌類別,日誌要輸出的地方和日誌以何種形式輸出。綜合使用這

centos7+nginx+python3+django+uwsgi配置

blank def 目的 micode django nco stat erer 啟動 學了一下python3,於是租了阿裏雲服務器,玩一玩。後來我才發現玩一玩裝個VirtualBox就夠了:https://ninghao.net/blog/1566,關鍵虛擬機可以任意裝玩