Django日志配置包括下面4個部分:
以上4個部分的具體說明及含義,可參見另一篇文章:python日志模塊 -- logging
下面我們來就具體看看怎么配置:
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'verbose': {
'format': '%(levelname)s %(asctime)s %(pathname)s %(module)s %(lineno)s %(process)d %(thread)d %(message)s'
}
},
'loggers': {
'django': {
'handlers': ['default'],
'propagate': True,
'level': 'DEBUG',
'filters': ['special']
}
},
'handlers': {
'default': {
'level': 'DEBUG',
'class': 'logging.handlers.RotatingFileHandler',
'filename': '/var/logs/django/default.log',
'maxBytes': 1024 * 1024 * 5,
'backupCount': 5,
'formatter': 'verbose',
'filters': ['special']
}
},
'filters': { # 過濾器
'special': { # 使用自定義的web.my_logging.ContextFilter,別名special,可以接受其他的參數(shù)
'()': 'web.my_logging.ContextFilter'
}
},
}
配置分析說明:
version
保留字。
disable_existing_loggers
是否禁用已經(jīng)存在的logger實例。
如果LOGGING 中的disable_existing_loggers 鍵為True(默認值),那么默認配置中的所有l(wèi)ogger 都將禁用。Logger 的禁用與刪除不同;logger 仍然存在,但是將默默丟棄任何傳遞給它的信息,也不會傳播給上一級logger。所以,你應該非常小心使用'disable_existing_loggers': True;它可能不是你想要的。你可以設置disable_existing_loggers 為False,并重新定義部分或所有的默認loggers;或者你可以設置LOGGING_CONFIG 為 None,并 自己處理logging 配置。
Logging 的配置屬于Django setup() 函數(shù)的一部分。所以,你可以肯定在你的項目代碼中l(wèi)ogger 是永遠可用的。
formatters
定義輸出的日志格式。
常用的格式化屬性:
%(name)s Logger的名字
%(levelname)s 文本形式的日志級別
%(message)s 用戶輸出的消息
%(asctime)s 字符串形式的當前時間。默認格式是 “2003-07-08 16:49:45,896”。逗號后面的是毫秒
%(levelno)s 數(shù)字形式的日志級別
%(pathname)s 調(diào)用日志輸出函數(shù)的模塊的完整路徑名,可能沒有
%(filename)s 調(diào)用日志輸出函數(shù)的模塊的文件名
%(module)s 調(diào)用日志輸出函數(shù)的模塊名
%(funcName)s 調(diào)用日志輸出函數(shù)的函數(shù)名
%(lineno)d 調(diào)用日志輸出函數(shù)的語句所在的代碼行
%(created)f 當前時間,用UNIX標準的表示時間的浮 點數(shù)表示
%(relativeCreated)d 輸出日志信息時的,自Logger創(chuàng)建以 來的毫秒數(shù)
%(thread)d 線程ID??赡軟]有
%(threadName)s 線程名??赡軟]有
%(process)d 進程ID??赡軟]有
其他格式化屬性請參 LogRecord attributes
handlers
處理器。
'handlers': {
'default': {
'level': 'DEBUG',
'class': 'logging.handlers.RotatingFileHandler',
'filename': '/var/logs/django/default.log',
'maxBytes': 1024 * 1024 * 5,
'backupCount': 5,
'formatter': 'verbose',
'filters': ['special']
}
}
key為處理器名,values為處理器配置。
level:日志處理級別。
formatter: 這個參數(shù)對應formatters。
filters: 對應后面的 filters。
class:處理類。常用的有:NullHandler(無任何操作,相當于丟棄日志),FileHandler(輸出到磁盤文件)等。其他處理類請看 https://docs.python.org/3/library/logging.handlers.html
filename:記錄日志的文件名。
maxBytes:文件最大字節(jié)數(shù)。
backupCount:最大擴展數(shù)。這個是和maxBytes一起使用的。例如當日志文件 pro.log 達到最大字節(jié)數(shù),那么就會擴展一個文件pro.log.1文件繼續(xù)記錄日志, 依次擴展,達到backupCount的設定值,例如為5,那么到pro.log.5后,后面的日志會再次記入 pro.log文件,相當于輪詢。
loggers
定義logger實例。
'loggers': {
'django': {
'handlers': ['default'],
'propagate': True,
'level': 'DEBUG',
'filters': ['special']
}
}
handlers:對應的handles對象列表。
level:logger實例輸出的日志級別,但是這個級別并不是最終輸出日志的級別,還有根據(jù)handlers的級別進行判斷,兩個level中取級別高的。DEBUG < INFO < WARNING < ERROR < CRITICAL
propagate:日志是否向上級傳遞。True 向上級傳,F(xiàn)alse 不向上級傳。默認為True。
filters: 對應后面的 filters。
更詳細說明請參照:https://docs.python.org/3/library/logging.html#logrecord-attributes
filters
過濾器。過濾器用來對傳遞給 Logger 或者 Handler 的日志信息提供附加的控制。
默認情況下,所有滿足級別的日志信息都會被處理,但是我們可以通過 filter 來過濾掉 CRITICAL 級別的日志,然后僅允許 ERROR 級別的日志通過。
filter 也可以被用來對前面被忽略掉的日志進行修改,例如,我們可以在一定條件下將 ERROR 日志降級為 WARNING 日志。
過濾器可以安裝在 logger 或者 handler 上,多個過濾器可以形成一個鏈來接連產(chǎn)生作用。
配置:
'filters': { # 過濾器
'special': { # 使用自定義的web.my_logging.ContextFilter,別名special,可以接受其他的參數(shù)
'()': 'web.my_logging.ContextFilter'
}
}
自定義Filter:
import logging
from random import choice
class ContextFilter(logging.Filter):
"""
This is a filter which injects contextual information into the log.
Rather than use actual contextual information, we just use random
data in this demo.
"""
USERS = ['jim', 'fred', 'sheila']
IPS = ['123.231.231.123', '127.0.0.1', '192.168.0.1']
def filter(self, record):
record.ip = choice(ContextFilter.IPS)
record.user = choice(ContextFilter.USERS)
return True
可以不定義類,直接定義函數(shù),返回True表示
詳情請看:https://docs.python.org/3/library/logging.html#filter-objects