前言
Django對于日志輸出的信息是很完善的,request的信息,setting配置,trackback的信息,一應(yīng)俱全,足夠我們調(diào)試了。但是在線上環(huán)境,如果讓用戶看到這些信息,是很不安全的(暴露代碼)。所以在線上我們要關(guān)閉Debug,但是又不能扔掉這些調(diào)試信息,這就要用到logging模塊。
logging模塊其實是Python的模塊,在Django中有很多本地化的支持。
理解Logger
首先要理解logging的工作,這里面主要有四個東西:格式器formatter,過濾器filter,處理器handler,日志實例logger。
處理流程
1
2
3
|
formatter logger ----> handler ----------------> files, emails filter |
處理流程是這樣的。首先,在代碼中。我們拿到的是logger實例,通過這個實例來記錄信息。
1
2
3
4
5
6
7
8
9
10
11
|
# import the logging library import logging # Get an instance of a logger logger = logging.getLogger( 'django' ) def my_view(request, arg1, arg): ... if bad_mojo: # Log an error message logger.error( 'Something went wrong!' ) |
然后,名字是django的這個logger就會把信息交給相應(yīng)的handler,handler把信息用formater和filter處理一下,提交log(保存到文件,數(shù)據(jù)庫,或者發(fā)送郵件)。
一般來說,handler可以是send_email,error_file等負責處理的方式,在logger中可以重復(fù)使用handler。例如我們的django處理器使用了send_email, error_file 這兩個處理器,request處理器使用error_file,info_file兩個處理器,logger和handler可以理解成多對多的關(guān)系,嘻嘻。
配置方式
Python中可以使用多種格式配置logging,比如.conf, .ini等。
在Django中,我們是把有關(guān)logging的配置寫到settings里面。相應(yīng)的配置及解釋如下(僅供參考)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
#管理員郵箱 ADMINS = ( ( 'laixintao' , '*******@163.com' ), ) #非空鏈接,卻發(fā)生404錯誤,發(fā)送通知MANAGERS SEND_BROKEN_LINK_EMAILS = True MANAGERS = ADMINS #Email設(shè)置 EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' EMAIL_HOST = 'smtp.163.com' #QQ郵箱SMTP服務(wù)器(郵箱需要開通SMTP服務(wù)) EMAIL_PORT = 25 #QQ郵箱SMTP服務(wù)端口 EMAIL_HOST_USER = '**********@163.com' #我的郵箱帳號 EMAIL_HOST_PASSWORD = '**************' #授權(quán)碼 EMAIL_SUBJECT_PREFIX = 'website' #為郵件標題的前綴,默認是'[django]' EMAIL_USE_TLS = True #開啟安全鏈接 DEFAULT_FROM_EMAIL = SERVER_EMAIL = EMAIL_HOST_USER #設(shè)置發(fā)件人 #logging日志配置 LOGGING = { 'version' : 1 , 'disable_existing_loggers' : True , 'formatters' : { #日志格式 'standard' : { 'format' : '%(asctime)s [%(threadName)s:%(thread)d] [%(name)s:%(lineno)d] [%(module)s:%(funcName)s] [%(levelname)s]- %(message)s' } }, 'filters' : { #過濾器 'require_debug_false' : { '()' : 'django.utils.log.RequireDebugFalse' , } }, 'handlers' : { #處理器 'null' : { 'level' : 'DEBUG' , 'class' : 'logging.NullHandler' , }, 'mail_admins' : { #發(fā)送郵件通知管理員 'level' : 'ERROR' , 'class' : 'django.utils.log.AdminEmailHandler' , 'filters' : [ 'require_debug_false' ], # 僅當 DEBUG = False 時才發(fā)送郵件 'include_html' : True , }, 'debug' : { #記錄到日志文件(需要創(chuàng)建對應(yīng)的目錄,否則會出錯) 'level' : 'DEBUG' , 'class' : 'logging.handlers.RotatingFileHandler' , 'filename' : os.path.join(BASE_DIR, "log" , 'debug.log' ), #日志輸出文件 'maxBytes' : 1024 * 1024 * 5 , #文件大小 'backupCount' : 5 , #備份份數(shù) 'formatter' : 'standard' , #使用哪種formatters日志格式 }, 'console' :{ #輸出到控制臺 'level' : 'DEBUG' , 'class' : 'logging.StreamHandler' , 'formatter' : 'standard' , }, }, 'loggers' : { #logging管理器 'django' : { 'handlers' : [ 'console' ], 'level' : 'DEBUG' , 'propagate' : False }, 'django.request' : { 'handlers' : [ 'debug' , 'mail_admins' ], 'level' : 'ERROR' , 'propagate' : True , }, # 對于不在 ALLOWED_HOSTS 中的請求不發(fā)送報錯郵件 'django.security.DisallowedHost' : { 'handlers' : [ 'null' ], 'propagate' : False , }, } } |
以上的配置文件中,有三個日志處理器。分別是:
- ‘django.request':django的request發(fā)生error會自動記錄,然后使用debug將信息記錄到文件,還有mail_admins將信息通過郵件發(fā)送給管理員。這里郵件的功能非常棒!并不是一個純文本信息,而是一個html文件,和我們在瀏覽器看到的錯誤頁面一模一樣!要正常使用郵件功能需要像我一樣配置一下上面的郵件發(fā)件人信息。我是直接去網(wǎng)易申請了一個郵箱。要格外注意三點:1.一定要去郵件服務(wù)商開啟SMTP服務(wù);2.不同的郵件服務(wù)商可能有一些特殊的設(shè)置,比如網(wǎng)易,會給你一個客戶端授權(quán)碼,這個才是密碼,而不是網(wǎng)頁的登錄密碼。3 注意服務(wù)商有沒有對發(fā)信頻率的限制。
- ‘django':使用console處理器,將信息輸出。在開發(fā)的時候就可以使用這個處理器(什么?print? 太low了!)
- 最后一個處理器見注釋。
最后,不要忘了給日志的路徑響應(yīng)的權(quán)限。比如Apache2服務(wù)器,就需要給www-data寫權(quán)限:
1
2
|
sudo chown - R [yourname]:www - data [log] sudo chmod - R g + s [log] |
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。