Django logging 配置

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_loggersFalse,并重新定義部分或所有的默認loggers;或者你可以設置LOGGING_CONFIGNone,并 自己處理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

參考文檔:
python 官方文檔 logging
django 1.8 官方文檔翻譯:logging

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • From:Python之日志處理(logging模塊) - 云游道士 - 博客園 https://www.cnbl...
    vigny的先生閱讀 2,805評論 3 5
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,569評論 19 139
  • 本篇文章主要對 python logging 的介紹加深理解。更主要是 討論在多進程環(huán)境下如何使用logging ...
    doudou0o閱讀 41,415評論 52 42
  • [轉(zhuǎn) http://davidbj.blog.51cto.com/4159484/1433741][1] 日志在程...
    孤雁100閱讀 642評論 0 0
  • 結(jié)婚的人真幸福,心愛的姑娘。 生活不止是工作,工作只是生活的一個重要組成部分,請過好其他部分。
    琴鴉閱讀 224評論 0 0

友情鏈接更多精彩內(nèi)容