天天看點

07.django日志配置

https://docs.djangoproject.com/en/3.0/topics/logging/

https://yiyibooks.cn/xx/python_352/library/logging.html#logger-objects

https://docs.python.org/3/library/logging.html#logrecord-attributes

https://yiyibooks.cn/xx/python_352/library/logging.handlers.html

  • logger 記錄器,所有日志都要經過的入口
  • handler 處理器,接收 logger 的日志,決定 log 是列印的目的,是檔案、螢幕,還是其他地方,比如郵件 ELK
  • filter 過濾器,過濾你想要的日志(不用)
  • formatter 格式化,格式化 handler 的日志格式

一.logger 日志級别

級别 描述
CRITICAL 50 關鍵錯誤、消息
ERROR 40 錯誤
WARNING 30 警告
INFO 20 通知消息
DEBUG 10 調試
NOTSET 無級别

二.logger 配置

  • logger
'loggers': {
        'log名稱':{
            'handlers': ['處理器名稱1',,'處理器名稱2'],
            'level': '日志級别',
            'propagate': False,
        },

           
  • handlers
'handlers名稱': {
            'level': '日志級别',
            'class': 'handlers類',
            'filename': '檔案全路徑',
            'when': "D",
            'interval': 1,
            'formatter': 'formatter名稱'
        },
           
  • formatter
"formatter名稱": {
            "format": '%(asctime)s %(name)s %(levelname)s %(pathname)s:%(lineno)d %(module)s:%(funcName)s %(message)s',
            "datefmt": "%Y-%m-%d %H:%M:%S"
        },
           
  • format 日志消息格式
格式 描述
%(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 記錄的消息,自定義内容
  • 按時間輪轉的參數
https://docs.python.org/3/library/logging.handlers.html#timedrotatingfilehandler
格式 描述
'S' Seconds
'M' Minutes
'H' Hours
'D' Days
'W0' - 'W6' Weekday (0=Monday)
'midnight' Roll over at midnight

三.使用

  • 3.1 定義一個 logger
'loggers': {
        'mylogger':{
            'handlers': ['console'],
            'level': 'DEBUG'
        },
           
  • 3.2 配置 handler
'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',# 寫到螢幕
            'formatter': 'simple'
        },
           
  • 3.3 某個 view 使用這個 logger
import logging
logger = logging.getLogger('mylogger')
           
  • 3.4 視圖内使用自定義輸出級别和内容
logger.debug('視圖的debuglog')
           
  • 3.5 增加一個檔案 handler
'file': {
            'level' :'DEBUG',
            'class': 'logging.FileHandler',
            'filename': '/tmp/debug.log',
            'formatter': 'simple',
        }
           
  • 3.6 logger 中使用多個 handler, 關閉向上傳播
'mylogger':{
            'handlers': ['console','file'],
            'level': 'DEBUG',
            'propagate': False,
        },
           
  • 3.7 輸出
DEBUG DEBUG 日志
ERROR ERROR 日志
DEBUG debug log
ERROR error log
System check identified no issues (0 silenced).
May 22, 2020 - 08:16:34
Django version 3.0.6, using settings 'ops.settings'
Starting development server at http://0.0.0.0:8000/
Quit the server with CONTROL-C.
DEBUG 視圖的debuglog
           
/tmp/debug.log 也會有這個日志

四.定義一個日志輸出格式,并使用

"default": {
            "format": '%(asctime)s %(pathname)s:%(lineno)d %(module)s:%(funcName)s '
                      '%(levelname)s- %(message)s',
            "datefmt": "%Y-%m-%d %H:%M:%S"
        },
           
  • 輸出
2020-05-22 08:31:46 /home/jenvid/PycharmProjects/django/ops/apps/users/views.py:20 views:get DEBUG- 視圖的debuglog
           

五. 定義django log,不同子產品分開存放到不同檔案,關閉向上傳播,自定義的内容在最上級日志器記錄中

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': '/tmp/debug.log',
            'when': "D",
            'interval': 1,
            'formatter': 'default'
        },
        "request": {
            'level': 'DEBUG',
            'class': 'logging.FileHandler',
            'filename': '/tmp/request.log',
            'formatter': 'default'
        },
        "server": {
            'level': 'DEBUG',
            'class': 'logging.FileHandler',
            'filename': '/tmp/server.log',
            'formatter': 'default'
        },
        "root": {
            'level': 'DEBUG',
            'class': 'logging.FileHandler',
            'filename': '/tmp/root.log',
            'formatter': 'default'
        },

        "db_backends": {
            'level': 'DEBUG',
            'class': 'logging.FileHandler',
            'filename': '/tmp/db_backends.log',
            'formatter': 'default'
        },
        "autoreload": {
            'level': 'INFO',
            'class': 'logging.FileHandler',
            'filename': '/tmp/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"],
    }
}
           
輸出
-rw-r--r-- 1 jenvid docker    0 5月  22 15:47 request.log
-rw-r--r-- 1 jenvid docker  81K 5月  23 12:57 debug.log.2020-05-23_04-57
-rw-r--r-- 1 jenvid docker 1.9K 5月  23 13:21 autoreload.log
-rw-r--r-- 1 jenvid docker 9.4K 5月  23 13:21 db_backends.log
-rw-r--r-- 1 jenvid docker 9.1K 5月  23 13:21 server.log
-rw-r--r-- 1 jenvid docker 1.5K 5月  23 13:21 root.log
-rw-r--r-- 1 jenvid docker  632 5月  23 13:21 debug.log
           

cat root.log

2020-05-22 10:20:25 mylogger  /home/jenvid/PycharmProjects/django/ops/apps/idcs/views.py:13 views:<module> DEBUG- DEBUG 日志
2020-05-22 10:20:25 mylogger  /home/jenvid/PycharmProjects/django/ops/apps/idcs/views.py:14 views:<module> ERROR- ERROR 日志
2020-05-22 10:20:25 mylogger  /home/jenvid/PycharmProjects/django/ops/apps/users/views.py:13 views:<module> DEBUG- debug log
2020-05-22 10:20:25 mylogger  /home/jenvid/PycharmProjects/django/ops/apps/users/views.py:14 views:<module> ERROR- error log
2020-05-22 10:20:30 mylogger  /home/jenvid/PycharmProjects/django/ops/apps/users/views.py:20 views:get DEBUG- 視圖的debuglog
2020-05-23 04:57:57 mylogger  /home/jenvid/PycharmProjects/django/ops/apps/users/views.py:20 views:get DEBUG- 視圖的debuglog
2020-05-23 05:21:39 asyncio  /usr/lib/python3.7/asyncio/selector_events.py:53 selector_events:__init__ DEBUG- Using selector: EpollSelector
2020-05-23 05:21:40 mylogger  /home/jenvid/PycharmProjects/django/ops/apps/idcs/views.py:13 views:<module> DEBUG- DEBUG 日志
2020-05-23 05:21:40 mylogger  /home/jenvid/PycharmProjects/django/ops/apps/idcs/views.py:14 views:<module> ERROR- ERROR 日志
2020-05-23 05:21:40 mylogger  /home/jenvid/PycharmProjects/django/ops/apps/users/views.py:13 views:<module> DEBUG- debug log
2020-05-23 05:21:40 mylogger  /home/jenvid/PycharmProjects/django/ops/apps/users/views.py:14 views:<module> ERROR- error log
2020-05-23 05:21:44 mylogger  /home/jenvid/PycharmProjects/django/ops/apps/users/views.py:20 views:get DEBUG- 視圖的debuglog