Django日志logging的配置和自定義添加方式
一、日志的概念
日志是一種可以追蹤某些軟件運(yùn)行時(shí)所發(fā)生事件的方法。開發(fā)者可以在代碼中調(diào)用日志記錄相關(guān)的方法來表明發(fā)生了某些事情。
一個(gè)事件可以用一個(gè)可包含可選變量數(shù)據(jù)的消息來描述,事件有嚴(yán)重性級(jí)別(level)。
二、Django日志
Django使用python內(nèi)建的logging模塊打印日志,logging配置由:記錄器(Logger)、處理器(Handler)、過濾器(Filter)、格式化(Formatter)。
1.logging模塊默認(rèn)定義了以下幾個(gè)日志等級(jí)
級(jí)別 | 值 | 描述 |
CRITICAL/FATAL | 50 | 關(guān)鍵錯(cuò)誤/消息 |
ERROR | 40 | 錯(cuò)誤 |
WARNING | 30 | 警告消息 |
INFO | 20 | 通知消息 |
DEBUG | 10 | 調(diào)試 |
NOTSET | 0 | 無級(jí)別 |
日志等級(jí):DEBUG < INFO < WARNING < ERROR < CRITICAL,而日志的信息量是依次減少的。
當(dāng)為某個(gè)應(yīng)用程序指定一個(gè)日志級(jí)別后,應(yīng)用程序會(huì)記錄所有日志級(jí)別大于或等于指定日志級(jí)別的日志信息,而不是僅僅記錄指定級(jí)別的日志信息。
2. logging模塊的使用方式介紹
logging模塊提供了兩種記錄日志的方式:
第一種方式是使用logging提供的模塊級(jí)別的函數(shù)
第二種方式是使用Logging日志系統(tǒng)的四大組件
logging所提供的模塊級(jí)別的日志記錄函數(shù)也是對(duì)logging日志系統(tǒng)相關(guān)類的封裝而已。
三、Logging提供的模塊級(jí)別的函數(shù)
函數(shù) | 說明 |
logging.debug(msg, args, *kwargs) | 創(chuàng)建一條嚴(yán)重級(jí)別為DEBUG的日志記錄 |
logging.info(msg, args, *kwargs) | 創(chuàng)建一條嚴(yán)重級(jí)別為INFO的日志記錄 |
logging.warning(msg, args, *kwargs) | 創(chuàng)建一條嚴(yán)重級(jí)別為WARNING的日志記錄 |
logging.error(msg, args, *kwargs) | 創(chuàng)建一條嚴(yán)重級(jí)別為ERROR的日志記錄 |
logging.critical(msg, args, *kwargs) | 創(chuàng)建一條嚴(yán)重級(jí)別為CRITICAL的日志記錄 |
logging.log(level, args, *kwargs) | 創(chuàng)建一條嚴(yán)重級(jí)別為level的日志記錄 |
logging.basicConfig(**kwargs) | 對(duì)root logger進(jìn)行一次性配置 |
四、Logging日志模塊四大組件
組件名稱 | 對(duì)應(yīng)類名 | 功能描述 |
記錄器 | Logger | 提供了應(yīng)用程序可一直使用的接口 |
處理器 | Handler | 將logger創(chuàng)建的日志記錄發(fā)送到合適的目的輸出 |
過濾器 | Filter | 提供了更細(xì)粒度的控制工具來決定輸出哪條日志記錄,丟棄哪條日志記錄 |
格式器 | Formatter | 決定日志記錄的最終輸出格式 |
logging模塊就是通過這些組件來完成日志處理的,logging模塊級(jí)別的函數(shù)也是通過這些組件對(duì)應(yīng)的類來實(shí)現(xiàn)的。這些組件之間的關(guān)系描述:
記錄器(logger)需要通過處理器(handler)將日志信息輸出到目標(biāo)位置,如:文件、sys.stdout、網(wǎng)絡(luò)等;
不同的處理器(handler)可以將日志輸出到不同的位置;
記錄器(logger)可以設(shè)置多個(gè)處理器(handler)將同一條日志記錄輸出到不同的位置;
每個(gè)處理器(handler)都可以設(shè)置自己的過濾器(filter)實(shí)現(xiàn)日志過濾,從而只保留感興趣的日志;
每個(gè)處理器(handler)都可以設(shè)置自己的格式器(formatter)實(shí)現(xiàn)同一條日志以不同的格式輸出到不同的地方。
簡單點(diǎn)說就是:記錄器(logger)是入口,真正干活兒的是處理器(handler),處理器(handler)還可以通過過濾器(filter)和格式器(formatter)對(duì)要輸出的日志內(nèi)容做過濾和格式化等處理操作。
1.Logger日志記錄器
Logger 是日志系統(tǒng)的入口。每個(gè) logger 都是命名了的 bucket, 消息寫入 bucket 以便進(jìn)一步處理。每一條寫入 logger 的消息都是一條日志記錄。
每一條日志記錄也包含日志級(jí)別,代表對(duì)應(yīng)消息的嚴(yán)重程度。日志記錄還包含有用的元數(shù)據(jù),來描述被記錄的事件細(xì)節(jié)。當(dāng) logger 處理一條消息時(shí),會(huì)將自己的日志級(jí)別和這條消息的日志級(jí)別做對(duì)比。
如果消息的日志級(jí)別匹配或者高于 logger 的日志級(jí)別,它就會(huì)被進(jìn)一步處理。否則這條消息就會(huì)被忽略掉。
當(dāng) logger 確定了一條消息需要處理之后,會(huì)把它傳給 Handler。
Django內(nèi)置記錄器
類 | 類功能描述 |
django.request | 請(qǐng)求處理相關(guān)的日志消息。5xx響應(yīng)被提升為錯(cuò)誤消息;4xx響應(yīng)被提升為警告消息。 |
django.server | 由RunServer命令調(diào)用的服務(wù)器所接收的請(qǐng)求的處理相關(guān)的日志消息。HTTP 5XX響應(yīng)被記錄為錯(cuò)誤消息,4XX響應(yīng)被記錄為警告消息,其他一切都被記錄為INFO。 |
django.template | 與模板呈現(xiàn)相關(guān)的日志消息 |
django.db.backends | 有關(guān)代碼與數(shù)據(jù)庫交互的消息。例如,請(qǐng)求執(zhí)行的每個(gè)應(yīng)用程序級(jí)SQL語句都在調(diào)試級(jí)別記錄到此記錄器 |
2.logging處理器
類名 | 功能描述 |
logging.StreamHandler | 類似與sys.stdout或者sys.stderr的任何文件對(duì)象(file object)輸出信息 |
logging.FileHandler | 將日志消息寫入文件filename。 |
logging.handlers.DatagramHandler(host,port) | 發(fā)送日志消息給位于制定host和port上的UDP服務(wù)器。使用UDP協(xié)議,將日志信息發(fā)送到網(wǎng)絡(luò) |
logging.handlers.HTTPHandler(host, url) | 使用HTTP的GET或POST方法將日志消息上傳到一臺(tái)HTTP 服務(wù)器。 |
logging.handlers.RotatingFileHandler(filename) | 將日志消息寫入文件filename。如果文件的大小超出maxBytes制定的值,那么它將被備份為filenamel。 |
logging.handlers.SocketHandler | 使用TCP協(xié)議,將日志信息發(fā)送到網(wǎng)絡(luò)。 |
logging.handlers.SysLogHandler | 日志輸出到syslog |
logging.handlers.NTEventLogHandler | 遠(yuǎn)程輸出日志到Windows NT/2000/XP的事件日志 |
logging.handlers.SMTPHandler | 遠(yuǎn)程輸出日志到郵件地址 |
logging.handlers.MemoryHandler | 日志輸出到內(nèi)存中的制定buffer |
3.Filter過濾器
在日志從 logger 傳到 handler 的過程中,使用 Filter 來做額外的控制。
默認(rèn)情況下,只要級(jí)別匹配,任何日志消息都會(huì)被處理。不過,也可以通過添加 filter 來給日志處理的過程增加額外條件。例如,可以添加一個(gè) filter 只允許某個(gè)特定來源的 ERROR 消息輸出。
Filter 還被用來在日志輸出之前對(duì)日志記錄做修改。例如,可以寫一個(gè) filter,當(dāng)滿足一定條件時(shí),把日志記錄從 ERROR 降到 WARNING 級(jí)別。
Filter 在 logger 和 handler 中都可以添加;多個(gè) filter 可以鏈接起來使用,來做多重過濾操作。
4.Formatter格式器
日志記錄最終是需要以文本來呈現(xiàn)的。Formatter 描述了文本的格式。
一個(gè) formatter 通常由包含 LogRecord attributes 的 Python 格式化字符串組成,不過你也可以為特定的格式來配置自定義的 formatter。
格式 | 描述 |
---|---|
%(name)s | 記錄器 logger 的名字 |
%(levelno)s | 數(shù)據(jù)形式的日志記錄級(jí)別 |
%(levelname)s | 文本形式的日志記錄級(jí)別 |
%(filename)s | 執(zhí)行日志記錄調(diào)用的源文件的文件名 |
%(pathname)s | 執(zhí)行日志記錄調(diào)用的源文件的 全路徑+文件名 |
%(funcName)s | 執(zhí)行日志記錄調(diào)用的函數(shù)名稱 |
%(module)s | 調(diào)用的模塊名稱,django是 app 的名稱 |
%(lineno)d | 記錄調(diào)用的行號(hào) |
%(created)s | 執(zhí)行日志記錄的時(shí)間 |
%(asctime)s | 日期時(shí)間 |
%(msecs)s | 毫秒部分 |
%(thread)s | 線程ID |
%(threadName)s | 線程名稱 |
%(process)d | 進(jìn)程ID |
%(message)s | 記錄的消息,自定義內(nèi)容 |
五、Django中添加logging
1.在項(xiàng)目setting.py 文件中配置logginger 日志
# 日志配置 # 給ADMINS發(fā)送郵件需要配置 ADMINS = ( ('admin_name', 'your@gmail.com'), ) MANAGERS = ADMINS # 創(chuàng)建log文件的文件夾 LOG_DIR = os.path.join(BASE_DIR, "logs") # 基本配置,可以復(fù)用的 LOGGING = { "version": 1, "disable_existing_loggers": False, "filters": {"require_debug_false": {"()": "django.utils.log.RequireDebugFalse"}}, "formatters": { # 定義了兩種日志格式 "verbose": { # 標(biāo)準(zhǔn) "format": "%(levelname)s %(asctime)s %(module)s " "%(process)d %(thread)d %(message)s" }, 'simple': { # 簡單 'format': '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s' }, }, "handlers": { # 定義了三種日志處理方式 "mail_admins": { # 只有debug=False且Error級(jí)別以上發(fā)郵件給admin "level": "ERROR", "filters": ["require_debug_false"], "class": "django.utils.log.AdminEmailHandler", }, 'file': { # Info級(jí)別以上保存到日志文件 'level': 'INFO', 'class': 'logging.handlers.RotatingFileHandler', # 保存到文件,根據(jù)文件大小自動(dòng)切 'filename': os.path.join(LOG_DIR, "info.log"), # 日志文件 'maxBytes': 1024 * 1024 * 10, # 日志大小 10M 'backupCount': 2, # 備份數(shù)為 2 'formatter': 'simple', # 簡單格式 'encoding': 'utf-8', }, "console": { # 打印到終端console "level": "DEBUG", "class": "logging.StreamHandler", "formatter": "verbose", }, }, "root": {"level": "INFO", "handlers": ["console"]}, "loggers": { "django.request": { # Django的request發(fā)生error會(huì)自動(dòng)記錄 "handlers": ["mail_admins"], "level": "ERROR", "propagate": True, # 向不向更高級(jí)別的logger傳遞 }, "django.security.DisallowedHost": { # 對(duì)于不在 ALLOWED_HOSTS 中的請(qǐng)求不發(fā)送報(bào)錯(cuò)郵件 "level": "ERROR", "handlers": ["console", "mail_admins"], "propagate": True, }, }, }
2.admin.py配置后臺(tái)管理操作日志
from django.contrib import admin @admin.register(admin.models.LogEntry) class LogEntryAdmin(admin.ModelAdmin): """ 該類用于顯示 admin 內(nèi)置的 django_admin_log 表。 其中,content_type 是指用戶修改的 Model 名 """ list_display = ['action_time', 'user', 'content_type', '__str__'] list_display_links = ['action_time'] list_filter = ['action_time', 'content_type', 'user'] list_per_page = 50 readonly_fields = ['action_time', 'user', 'content_type', 'object_id', 'object_repr', 'action_flag', 'change_message']
六、自定義日志
1.現(xiàn)在setting.py日志配置增加配置項(xiàng)
"handlers": { ...... 'user': { # 專門定義一個(gè)收集特定信息的日志 'level': 'INFO', 'class': 'logging.handlers.RotatingFileHandler', # 保存到文件,自動(dòng)切 'filename': os.path.join(BASE_DIR+'/logs/', "demo.log"), 'maxBytes': 1024 * 1024 * 50, # 日志大小 50M 'backupCount': 5, 'formatter': 'verbose', 'encoding': "utf-8" }, ...... } "loggers": { ...... 'user_log': { # 名為 'demo'的logger還單獨(dú)處理 'handlers': ['user'], "propagate": True, 'level': 'INFO', }, ...... }
2.在view.py中簡單添加自定義日志配置項(xiàng)
# 調(diào)用setting.py中創(chuàng)建額user_log的logger實(shí)例 logger = logging.getLogger('user_log') def test(request): logger.info(request.user.username+',添加成功' ) return Httpresponse('Success')
3.在setting.py下配置日志文件為logs/demo.log
發(fā)送請(qǐng)求后去對(duì)應(yīng)的目錄既可查看到日志
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
python數(shù)據(jù)結(jié)構(gòu)之棧、隊(duì)列及雙端隊(duì)列
在上一章的學(xué)習(xí)中,我們主要學(xué)習(xí)了怎么去衡量一個(gè)算法的好壞,比較常見的方式是使用大O記法,就是所謂的時(shí)間復(fù)雜度,這一章節(jié)我來學(xué)習(xí)基本的數(shù)據(jù)結(jié)構(gòu),如棧、隊(duì)列和雙端隊(duì)列等等。感興趣的小伙伴可以參考一下2021-12-12詳解python中Numpy的屬性與創(chuàng)建矩陣
這篇文章給大家分享了關(guān)于python中Numpy的屬性與創(chuàng)建矩陣的相關(guān)知識(shí)點(diǎn)內(nèi)容,有興趣的朋友們可以學(xué)習(xí)參考下。2018-09-09解決Python下json.loads()中文字符出錯(cuò)的問題
今天小編就為大家分享一篇解決Python下json.loads()中文字符出錯(cuò)的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-12-12pandas?Dataframe實(shí)現(xiàn)批量修改值的方法
這篇文章主要介紹了pandas?Dataframe實(shí)現(xiàn)批量修改值的方法,在使用dataframe的時(shí)候?有時(shí)候會(huì)碰到需要批量修改數(shù)據(jù)的時(shí)候,下面文章主要說明兩種情況使用iloc對(duì)某幾行某幾列進(jìn)行全部修該和對(duì)數(shù)據(jù)進(jìn)行判定后,相互+/-/*某個(gè)數(shù),使用內(nèi)置函數(shù),需要的朋友可以參考一下2022-06-06Python3實(shí)現(xiàn)飛機(jī)大戰(zhàn)游戲
這篇文章主要為大家詳細(xì)介紹了Python3實(shí)現(xiàn)飛機(jī)大戰(zhàn)游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-04-04基于Python實(shí)現(xiàn)股票數(shù)據(jù)分析的可視化
在購買股票的時(shí)候,可以使用歷史數(shù)據(jù)來對(duì)當(dāng)前的股票的走勢(shì)進(jìn)行預(yù)測(cè),這就需要對(duì)股票的數(shù)據(jù)進(jìn)行獲取并且進(jìn)行一定的分析。本文將介紹如何通過Python實(shí)現(xiàn)股票數(shù)據(jù)分析的可視化,需要的可以參考一下2021-12-12Python數(shù)據(jù)可視化之基于pyecharts實(shí)現(xiàn)的地理圖表的繪制
今天給大家?guī)淼氖荘ython的相關(guān)知識(shí),文章圍繞著pyecharts繪制地理圖表展開,文中有非常詳細(xì)的代碼示例及介紹,需要的朋友可以參考下2021-06-06Python實(shí)現(xiàn)PDF到Word文檔的高效轉(zhuǎn)換
這篇文章主要為大家詳細(xì)介紹了如何使用Python編程語言,結(jié)合庫和工具,將PDF文件轉(zhuǎn)換為可編輯的Word文檔,使文檔的編輯變得方便高效,需要的可以參考下2024-01-01