Django?logging日志模塊實(shí)例詳解(日志記錄模板配置)
一.Django日志
Django使用python內(nèi)建的logging模塊打印日志,Python的logging配置由四個(gè)部分組成:
1>.記錄器(Logger)
2>.處理程序(Handler)
3>.過(guò)濾器(Filter)
4>.格式化(Formatter)
二、Logger 記錄器
Logger 是日志系統(tǒng)的入口。每個(gè) logger 都是命名了的 bucket, 消息寫入 bucket 以便進(jìn)一步處理。
Logger 可以配置 日志級(jí)別。日志級(jí)別描述了由該 logger 處理的消息的嚴(yán)重性。Python 定義了下面幾種日志級(jí)別:
DEBUG
:排查故障時(shí)使用的低級(jí)別系統(tǒng)信息INFO
:一般的系統(tǒng)信息WARNING
:描述系統(tǒng)發(fā)生了一些小問(wèn)題的信息ERROR
:描述系統(tǒng)發(fā)生了大問(wèn)題的信息CRITICAL
:描述系統(tǒng)發(fā)生嚴(yán)重問(wèn)題的信息
每一條寫入 logger 的消息都是一條 日志記錄。每一條日志記錄也包含 日志級(jí)別,代表對(duì)應(yīng)消息的嚴(yán)重程度。日志記錄還包含有用的元數(shù)據(jù),來(lái)描述被記錄的事件細(xì)節(jié),例如堆棧跟蹤或者錯(cuò)誤碼。
當(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ù)庫(kù)交互的消息。例如,請(qǐng)求執(zhí)行的每個(gè)應(yīng)用程序級(jí)SQL語(yǔ)句都在調(diào)試級(jí)別記錄到此記錄器。 |
三、Handler 處理程序
Handler 是決定如何處理 logger 中每一條消息的引擎。它描述特定的日志行為,比如把消息輸出到屏幕、文件或網(wǎng)絡(luò) socket。
和 logger 一樣,handler 也有日志級(jí)別的概念。如果一條日志記錄的級(jí)別不匹配或者低于 handler 的日志級(jí)別,對(duì)應(yīng)的消息會(huì)被 handler 忽略。
一個(gè) logger 可以有多個(gè) handler,每一個(gè) handler 可以有不同的日志級(jí)別。這樣就可以根據(jù)消息的重要性不同,來(lái)提供不同格式的輸出。例如,你可以添加一個(gè) handler 把 ERROR
和 CRITICAL
消息發(fā)到尋呼機(jī),再添加另一個(gè) handler 把所有的消息(包括 ERROR
和 CRITICAL
消息)保存到文件里以便日后分析。
Logging 自身攜帶Handler
logging模塊提供了一些處理器,可以通過(guò)各種方式處理日志消息。
類名 | 功能描述 |
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 |
注意:由于內(nèi)置處理器還有很多,如果想更深入了解??梢圆榭垂俜绞謨?cè)。
四、Filter過(guò)濾器
在日志從 logger 傳到 handler 的過(guò)程中,使用 Filter 來(lái)做額外的控制。
默認(rèn)情況下,只要級(jí)別匹配,任何日志消息都會(huì)被處理。不過(guò),也可以通過(guò)添加 filter 來(lái)給日志處理的過(guò)程增加額外條件。例如,可以添加一個(gè) filter 只允許某個(gè)特定來(lái)源的 ERROR
消息輸出。
Filter 還被用來(lái)在日志輸出之前對(duì)日志記錄做修改。例如,可以寫一個(gè) filter,當(dāng)滿足一定條件時(shí),把日志記錄從 ERROR
降到 WARNING
級(jí)別。
Filter 在 logger 和 handler 中都可以添加;多個(gè) filter 可以鏈接起來(lái)使用,來(lái)做多重過(guò)濾操作。
五、Formatters格式化器
日志記錄最終是需要以文本來(lái)呈現(xiàn)的。Formatter 描述了文本的格式。一個(gè) formatter 通常由包含 LogRecord attributes 的 Python 格式化字符串組成,不過(guò)你也可以為特定的格式來(lái)配置自定義的 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)容 |
時(shí)間格式參數(shù):
格式 | 描述 |
---|---|
'S' | Seconds |
'M' | Minutes |
'H' | Hours |
'D' | Days |
'W0' - 'W6' | Weekday (0=Monday) |
'midnight' | Roll over at midnight |
六:Django 集成日志logginger 模塊
1、在項(xiàng)目setting.py 文件中,配置logginger 日志, 核心代碼如下:
# 日志配置 LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'formatters': { 'verbose': { 'format': '{levelname} {asctime} {module} {process:d} {thread:d} {message}', 'style': '{', }, 'simple': { 'format': '{levelname} {message}', 'style': '{', }, "default": { "format": '%(asctime)s %(name)s %(pathname)s:%(lineno)d %(module)s:%(funcName)s ' '%(levelname)s- %(message)s', "datefmt": "%Y-%m-%d %H:%M:%S" }, }, 'handlers': { 'console': { 'level': 'DEBUG', 'class': 'logging.StreamHandler', 'formatter': 'default' }, 'file': { 'level': 'DEBUG', 'class': 'logging.handlers.TimedRotatingFileHandler', 'filename': os.path.join(BASE_DIR, 'logs/debug.log'), 'when': "D", 'interval': 1, 'formatter': 'default' }, "request": { 'level': 'DEBUG', 'class': 'logging.FileHandler', 'filename': os.path.join(BASE_DIR, 'logs/request.log'), 'formatter': 'default' }, "server": { 'level': 'DEBUG', 'class': 'logging.FileHandler', 'filename': os.path.join(BASE_DIR, 'logs/server.log'), 'formatter': 'default' }, "root": { 'level': 'DEBUG', 'class': 'logging.FileHandler', 'filename': os.path.join(BASE_DIR, 'logs/root.log'), 'formatter': 'default' }, "db_backends": { 'level': 'DEBUG', 'class': 'logging.FileHandler', 'filename': os.path.join(BASE_DIR, 'logs/db_backends.log'), 'formatter': 'default' }, "autoreload": { 'level': 'INFO', 'class': 'logging.FileHandler', 'filename': os.path.join(BASE_DIR, 'logs/autoreload.log'), 'formatter': 'default' } }, 'loggers': { # 應(yīng)用中自定義日志記錄器 'mylogger': { 'level': 'DEBUG', 'handlers': ['console', 'file'], 'propagate': True, }, "django": { "level": "DEBUG", "handlers": ["console", "file"], 'propagate': False, }, "django.request": { "level": "DEBUG", "handlers": ["request"], 'propagate': False, }, "django.server": { "level": "DEBUG", "handlers": ["server"], 'propagate': False, }, "django.db.backends": { "level": "DEBUG", "handlers": ["db_backends"], 'propagate': False, }, "django.utils.autoreload": { "level": "INFO", "handlers": ["autoreload"], 'propagate': False, } }, 'root': { "level": "DEBUG", "handlers": ["root"], } }
2、應(yīng)用中添加logginger 日志記錄
1、在應(yīng)用的views.py 文件中添加logging 模塊依賴,并在相關(guān)方法中輸出相關(guān)日志記錄
import logging # 日志輸出常量定義 logger = logging.getLogger('mylogger')
# json 數(shù)據(jù)提交,并轉(zhuǎn)換為實(shí)體,執(zhí)行入庫(kù)操作 def insertJSON(request): logger.info("post request body 請(qǐng)求數(shù)據(jù)提交") json_str = request.body json_str = json_str.decode() # python3.6及以上不用這一句代碼 dict_data = json.loads(json_str) # loads把str轉(zhuǎn)換為dict,dumps把dict轉(zhuǎn)換為str item = Book() objDictTool.to_obj(item, **dict_data) print("名稱: {}, 價(jià)格: {}, 作者: {}".format(item.name, item.price, item.author)) # 執(zhí)行數(shù)據(jù)庫(kù)插入 item.save() return response_success(message="數(shù)據(jù)入庫(kù)成功")
注意:在logginer 配置文件中,定義自定義記錄器mylogger 對(duì)應(yīng)實(shí)例化對(duì)象就是views.py 文件中實(shí)例的logging對(duì)象。
3、日志記錄結(jié)果展示:
總結(jié)
到此這篇關(guān)于Django logging日志模塊的文章就介紹到這了,更多相關(guān)Django logging日志模塊內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解python百行有效代碼實(shí)現(xiàn)漢諾塔小游戲(簡(jiǎn)約版)
這篇文章主要介紹了詳解python百行有效代碼實(shí)現(xiàn)漢諾塔小游戲(簡(jiǎn)約版),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10python Django實(shí)戰(zhàn)之歌曲搜索功能實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了如何利用python Django實(shí)現(xiàn)歌曲搜索功能,文中的示例代碼講解詳細(xì),具有一定的參考價(jià)值,有需要的小伙伴開業(yè)了解下2023-10-10利用python實(shí)現(xiàn)查看溧陽(yáng)的攝影圈
這篇文章主要介紹了利用python實(shí)現(xiàn)查看溧陽(yáng)的攝影圈,文章基于BeautifulSoup的相關(guān)資料展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-05-05opencv形態(tài)學(xué)中的孔洞填充詳細(xì)圖解
我們?cè)谶M(jìn)行圖像分割后,分割結(jié)果有時(shí)會(huì)有一些小孔洞,如圖1所示,其中黑白兩色表示兩種不同的類別。一般情況下,這些孔洞屬于錯(cuò)分情況,為了優(yōu)化結(jié)果,我們通常對(duì)這些孔洞進(jìn)行填充。今天我們就用python語(yǔ)言基于OpenCV實(shí)現(xiàn)孔洞填充2022-10-10可視化pytorch 模型中不同BN層的running mean曲線實(shí)例
這篇文章主要介紹了可視化pytorch 模型中不同BN層的running mean曲線實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-06-06Python爬取科目四考試題庫(kù)的方法實(shí)現(xiàn)
這篇文章主要介紹了Python爬取科目四考試題庫(kù)的方法實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03