<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
Django使用python內建的logging模組列印紀錄檔,Python的logging設定由四個部分組成:
1>.記錄器(Logger)
2>.處理程式(Handler)
3>.過濾器(Filter)
4>.格式化(Formatter)
Logger 是紀錄檔系統的入口。每個 logger 都是命名了的 bucket, 訊息寫入 bucket 以便進一步處理。
Logger 可以設定 紀錄檔級別。紀錄檔級別描述了由該 logger 處理的訊息的嚴重性。Python 定義了下面幾種紀錄檔級別:
DEBUG
:排查故障時使用的低階別系統資訊INFO
:一般的系統資訊WARNING
:描述系統發生了一些小問題的資訊ERROR
:描述系統發生了大問題的資訊CRITICAL
:描述系統發生嚴重問題的資訊每一條寫入 logger 的訊息都是一條 紀錄檔記錄。每一條紀錄檔記錄也包含 紀錄檔級別,代表對應訊息的嚴重程度。紀錄檔記錄還包含有用的後設資料,來描述被記錄的事件細節,例如堆疊跟蹤或者錯誤碼。
當 logger 處理一條訊息時,會將自己的紀錄檔級別和這條訊息的紀錄檔級別做對比。如果訊息的紀錄檔級別匹配或者高於 logger 的紀錄檔級別,它就會被進一步處理。否則這條訊息就會被忽略掉。
當 logger 確定了一條訊息需要處理之後,會把它傳給 Handler。
類 | 類功能描述 |
django.request | 請求處理相關的紀錄檔訊息。5xx響應被提升為錯誤訊息;4xx響應被提升為警告訊息。 |
django.server | 由RunServer命令呼叫的伺服器所接收的請求的處理相關的紀錄檔訊息。HTTP 5XX響應被記錄為錯誤訊息,4XX響應被記錄為警告訊息,其他一切都被記錄為INFO。 |
django.template | 與模板呈現相關的紀錄檔訊息 |
django.db.backends | 有關程式碼與資料庫互動的訊息。例如,請求執行的每個應用程式級SQL語句都在偵錯級別記錄到此記錄器。 |
Handler 是決定如何處理 logger 中每一條訊息的引擎。它描述特定的紀錄檔行為,比如把訊息輸出到螢幕、檔案或網路 socket。
和 logger 一樣,handler 也有紀錄檔級別的概念。如果一條紀錄檔記錄的級別不匹配或者低於 handler 的紀錄檔級別,對應的訊息會被 handler 忽略。
一個 logger 可以有多個 handler,每一個 handler 可以有不同的紀錄檔級別。這樣就可以根據訊息的重要性不同,來提供不同格式的輸出。例如,你可以新增一個 handler 把 ERROR
和 CRITICAL
訊息發到尋呼機,再新增另一個 handler 把所有的訊息(包括 ERROR
和 CRITICAL
訊息)儲存到檔案裡以便日後分析。
logging模組提供了一些處理器,可以通過各種方式處理紀錄檔訊息。
類名 | 功能描述 |
logging.StreamHandler | 類似與sys.stdout或者sys.stderr的任何檔案物件(file object)輸出資訊 |
logging.FileHandler | 將紀錄檔訊息寫入檔案filename。 |
logging.handlers.DatagramHandler(host,port) | 傳送紀錄檔訊息給位於制定host和port上的UDP伺服器。使用UDP協定,將紀錄檔資訊傳送到網路 |
logging.handlers.HTTPHandler(host, url) | 使用HTTP的GET或POST方法將紀錄檔訊息上傳到一臺HTTP 伺服器。 |
logging.handlers.RotatingFileHandler(filename) | 將紀錄檔訊息寫入檔案filename。如果檔案的大小超出maxBytes制定的值,那麼它將被備份為filenamel。 |
logging.handlers.SocketHandler | 使用TCP協定,將紀錄檔資訊傳送到網路。 |
logging.handlers.SysLogHandler | 紀錄檔輸出到syslog |
logging.handlers.NTEventLogHandler | 遠端輸出紀錄檔到Windows NT/2000/XP的事件紀錄檔 |
logging.handlers.SMTPHandler | 遠端輸出紀錄檔到郵件地址 |
logging.handlers.MemoryHandler | 紀錄檔輸出到記憶體中的制定buffer |
注意:由於內建處理器還有很多,如果想更深入瞭解。可以檢視官方手冊。
在紀錄檔從 logger 傳到 handler 的過程中,使用 Filter 來做額外的控制。
預設情況下,只要級別匹配,任何紀錄檔訊息都會被處理。不過,也可以通過新增 filter 來給紀錄檔處理的過程增加額外條件。例如,可以新增一個 filter 只允許某個特定來源的 ERROR
訊息輸出。
Filter 還被用來在紀錄檔輸出之前對紀錄檔記錄做修改。例如,可以寫一個 filter,當滿足一定條件時,把紀錄檔記錄從 ERROR
降到 WARNING
級別。
Filter 在 logger 和 handler 中都可以新增;多個 filter 可以連結起來使用,來做多重過濾操作。
紀錄檔記錄最終是需要以文字來呈現的。Formatter 描述了文字的格式。一個 formatter 通常由包含 LogRecord attributes 的 Python 格式化字串組成,不過你也可以為特定的格式來設定自定義的 formatter。
格式 | 描述 |
---|---|
%(name)s | 記錄器 logger 的名字 |
%(levelno)s | 資料形式的紀錄檔記錄級別 |
%(levelname)s | 文字形式的紀錄檔記錄級別 |
%(filename)s | 執行紀錄檔記錄呼叫的原始檔的檔名 |
%(pathname)s | 執行紀錄檔記錄呼叫的原始檔的 全路徑+檔名 |
%(funcName)s | 執行紀錄檔記錄呼叫的函數名稱 |
%(module)s | 呼叫的模組名稱,django是 app 的名稱 |
%(lineno)d | 記錄呼叫的行號 |
%(created)s | 執行紀錄檔記錄的時間 |
%(asctime)s | 日期時間 |
%(msecs)s | 毫秒部分 |
%(thread)s | 執行緒ID |
%(threadName)s | 執行緒名稱 |
%(process)d | 程序ID |
%(message)s | 記錄的訊息,自定義內容 |
時間格式引數:
格式 | 描述 |
---|---|
'S' | Seconds |
'M' | Minutes |
'H' | Hours |
'D' | Days |
'W0' - 'W6' | Weekday (0=Monday) |
'midnight' | Roll over at midnight |
1、在專案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': { # 應用中自定義紀錄檔記錄器 '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、應用中新增logginger 紀錄檔記錄
1、在應用的views.py 檔案中新增logging 模組依賴,並在相關方法中輸出相關紀錄檔記錄
import logging # 紀錄檔輸出常數定義 logger = logging.getLogger('mylogger')
# json 資料提交,並轉換為實體,執行入庫操作 def insertJSON(request): logger.info("post request body 請求資料提交") json_str = request.body json_str = json_str.decode() # python3.6及以上不用這一句程式碼 dict_data = json.loads(json_str) # loads把str轉換為dict,dumps把dict轉換為str item = Book() objDictTool.to_obj(item, **dict_data) print("名稱: {}, 價格: {}, 作者: {}".format(item.name, item.price, item.author)) # 執行資料庫插入 item.save() return response_success(message="資料入庫成功")
注意:在logginer 組態檔中,定義自定義記錄器mylogger 對應範例化物件就是views.py 檔案中範例的logging物件。
3、紀錄檔記錄結果展示:
到此這篇關於Django logging紀錄檔模組的文章就介紹到這了,更多相關Django logging紀錄檔模組內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45