網站首頁 編程語言 正文
一.Django日志
Django使用python內建的logging模塊打印日志,Python的logging配置由四個部分組成:
1>.記錄器(Logger)
2>.處理程序(Handler)
3>.過濾器(Filter)
4>.格式化(Formatter)
二、Logger 記錄器
Logger 是日志系統的入口。每個 logger 都是命名了的 bucket, 消息寫入 bucket 以便進一步處理。
Logger 可以配置?日志級別。日志級別描述了由該 logger 處理的消息的嚴重性。Python 定義了下面幾種日志級別:
-
DEBUG
:排查故障時使用的低級別系統信息 -
INFO
:一般的系統信息 -
WARNING
:描述系統發生了一些小問題的信息 -
ERROR
:描述系統發生了大問題的信息 -
CRITICAL
:描述系統發生嚴重問題的信息
每一條寫入 logger 的消息都是一條?日志記錄。每一條日志記錄也包含?日志級別,代表對應消息的嚴重程度。日志記錄還包含有用的元數據,來描述被記錄的事件細節,例如堆棧跟蹤或者錯誤碼。
當 logger 處理一條消息時,會將自己的日志級別和這條消息的日志級別做對比。如果消息的日志級別匹配或者高于 logger 的日志級別,它就會被進一步處理。否則這條消息就會被忽略掉。
當 logger 確定了一條消息需要處理之后,會把它傳給?Handler。
Django 內置記錄器
類 | 類功能描述 |
django.request? | 請求處理相關的日志消息。5xx響應被提升為錯誤消息;4xx響應被提升為警告消息。 |
django.server | 由RunServer命令調用的服務器所接收的請求的處理相關的日志消息。HTTP 5XX響應被記錄為錯誤消息,4XX響應被記錄為警告消息,其他一切都被記錄為INFO。 |
django.template | 與模板呈現相關的日志消息 |
django.db.backends | 有關代碼與數據庫交互的消息。例如,請求執行的每個應用程序級SQL語句都在調試級別記錄到此記錄器。 |
三、Handler 處理程序
Handler 是決定如何處理 logger 中每一條消息的引擎。它描述特定的日志行為,比如把消息輸出到屏幕、文件或網絡 socket。
和 logger 一樣,handler 也有日志級別的概念。如果一條日志記錄的級別不匹配或者低于 handler 的日志級別,對應的消息會被 handler 忽略。
一個 logger 可以有多個 handler,每一個 handler 可以有不同的日志級別。這樣就可以根據消息的重要性不同,來提供不同格式的輸出。例如,你可以添加一個 handler 把?ERROR
?和?CRITICAL
?消息發到尋呼機,再添加另一個 handler 把所有的消息(包括?ERROR
?和?CRITICAL
?消息)保存到文件里以便日后分析。
Logging 自身攜帶Handler
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 |
注意:由于內置處理器還有很多,如果想更深入了解。可以查看官方手冊。?
四、Filter過濾器
在日志從 logger 傳到 handler 的過程中,使用 Filter 來做額外的控制。
默認情況下,只要級別匹配,任何日志消息都會被處理。不過,也可以通過添加 filter 來給日志處理的過程增加額外條件。例如,可以添加一個 filter 只允許某個特定來源的?ERROR
?消息輸出。
Filter 還被用來在日志輸出之前對日志記錄做修改。例如,可以寫一個 filter,當滿足一定條件時,把日志記錄從?ERROR
?降到?WARNING
?級別。
Filter 在 logger 和 handler 中都可以添加;多個 filter 可以鏈接起來使用,來做多重過濾操作。
五、Formatters格式化器
日志記錄最終是需要以文本來呈現的。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 |
六:Django 集成日志logginger 模塊
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、日志記錄結果展示:
總結
原文鏈接:https://blog.csdn.net/zhouzhiwengang/article/details/119606262
相關推薦
- 2022-07-21 Kafka3.0 消費者事務與數據積壓
- 2022-08-17 React自定義hook的方法_React
- 2022-12-02 docker進階教程之dockerfile優化鏡像大小_docker
- 2023-06-19 Python中str.format()和f-string的使用_python
- 2022-11-23 GoLang?channel底層代碼實現詳解_Golang
- 2022-07-10 Ubuntu 硬盤分區
- 2021-12-04 解決ASP.NET?Core中使用漏桶算法限流的問題_實用技巧
- 2022-04-12 python關閉print輸出信息詳情_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支