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,關鍵虛擬機可以任意裝玩