django记录日志简单用法

django记录日志简单用法

1、创建项目

django-admin startproject django_log_learn

image-20220519202148906

创建django_log_learn/views.py添加以下内容

import logging

from django.http import HttpResponse


def fun(request):
    logging.info("info msg")
    logging.warning("warning msg")
    logging.error("error msg")
    return HttpResponse()

image-20220519202417776

添加路由

django_log_learn/urls.py

path('', views.fun),

image-20220519202442505

正常只会输入warning等级以上信息到控制台,就是原始的logging

image-20220519202718679

2、简单使用

添加控制台日志,设置输出等级为debug

在setting.py中添加内容

LOGGING = {
    'version': 1,  # 版本
    'disable_existing_loggers': False,  # 是否禁用已经存在的日志句柄
    'handlers': {  # 拥有的句柄
        'console': {  # 拥有一个控制台句柄
            'class': 'logging.StreamHandler',  # 使用这个类实现控制台句柄
        },
    },
    'root': {  # 一个名为root的日志记录器,默认就是root,如果不使用logging.getLogger()设置
        'handlers': ['console'],  # 使用console控制台日志句柄
        'level': 'DEBUG',  # 日志等级是DEBUG
    },
}

image-20220519202905039

说明:

'disable_existing_loggers': False, # 是否禁用已经存在的日志句柄,如果禁用,则其他模块使用logging输出都不显示,否则显示

例如不禁用,则会显示utils\autoreload.py的日志,其他模块使用也会显示,这是举一个例子而已

image-20220519204151133

image-20220519204121054

禁用了就看不到这些输出了,可以自己试一试

添加一个custom的日志记录器

在setting.py中LOGGING内容

LOGGING = {
    'version': 1,  # 版本
    'disable_existing_loggers': False,  # 是否禁用已经存在的日志句柄
    'handlers': {  # 拥有的句柄
        'console': {  # 拥有一个控制台句柄
            'class': 'logging.StreamHandler',  # 使用这个类实现控制台句柄
        },
    },
    'root': {  # 一个名为root的日志记录器,默认就是root,如果不使用logging.getLogger()设置
        'handlers': ['console'],  # 使用console控制台日志句柄
        'level': 'DEBUG',  # 日志等级是DEBUG
    },
    'loggers': {  # 添加记录器
        'custom': {  # 一个叫custom的日志记录器
            'handlers': ['console'],  # 使用console控制台日志句柄
            'level': 'ERROR',  # 日志等级是ERROR
            'propagate': False,
        },
    },
}

views.py

import logging

from django.http import HttpResponse


def fun(request):
    logging.info("info msg")
    logging.warning("warning msg")
    logging.error("error msg")
    log = logging.getLogger('custom')
    log.info("info msg for custom logger")
    log.warning("warning msg for custom logger")
    log.error("error msg for custom logge")
    return HttpResponse()

custom的日志记录器就只显示ERROR以及以上的日志

image-20220519205416790

添加一个写到日志的记录器

settings.py

LOGGING = {
    'version': 1,  # 版本
    'disable_existing_loggers': False,  # 是否禁用已经存在的日志句柄
    'handlers': {  # 拥有的句柄
        'console': {  # 拥有一个控制台句柄
            'class': 'logging.StreamHandler',  # 使用这个类实现控制台句柄
        },
        'write_file': {  # 一个叫write_file的句柄
            'class': 'logging.FileHandler',  # 使用这个类实现控制台句柄
            'filename': './logs/log.log',  # 写到这个文件中,目录需要提前创建一下
        }
    },
    'root': {  # 一个名为root的日志记录器,默认就是root,如果不使用logging.getLogger()设置
        'handlers': ['console'],  # 使用console控制台日志句柄
        'level': 'DEBUG',  # 日志等级是DEBUG
    },
    'loggers': {  # 添加记录器
        'custom': {  # 一个叫custom的日志记录器
            'handlers': ['console'],  # 使用console控制台日志句柄
            'level': 'ERROR',  # 日志等级是ERROR
            'propagate': False,
        },
        'for_write_file': {
            'handlers': ['write_file'],  # 使用write_file日志句柄
            'level': 'DEBUG',  # 日志等级

        }
    },
}

views.py

import logging

from django.http import HttpResponse


def fun(request):
    logging.info("info msg")
    logging.warning("warning msg")
    logging.error("error msg")

    log = logging.getLogger('custom')
    log.info("info msg for custom logger")
    log.warning("warning msg for custom logger")
    log.error("error msg for custom logger")

    log = logging.getLogger('for_write_file')
    log.info("info msg for for_write_file logger")
    log.warning("warning msg for for_write_file logger")
    log.error("error msg for for_write_file logger")
    return HttpResponse()

image-20220519210314995

文件中的日志

image-20220519210335143

添加格式输出

settings.py

LOGGING = {
    'version': 1,  # 版本
    'disable_existing_loggers': False,  # 是否禁用已经存在的日志句柄
    'formatters': {  # 定义日志的格式
        'verbose': {
            'format': '[{levelname}][{asctime}][{module}][{process:d}][{thread:d}]{message}',
            'style': '{',  # 使用{}的形式申明格式,而不是%(levelname)s这样默认的形式,当然也可以使用默认的
        },
        'simple': {
            'format': '[{levelname}]{message}',
            'style': '{',  # 使用{}的形式申明格式,而不是%(levelname)s这样默认的形式,当然也可以使用默认的
        },
    },
    'handlers': {  # 拥有的句柄
        'console': {  # 拥有一个控制台句柄
            'class': 'logging.StreamHandler',  # 使用这个类实现控制台句柄
            'formatter': 'verbose'  # 使用这种verbose格式化日志格式
        },
        'write_file': {  # 一个叫write_file的句柄
            'class': 'logging.FileHandler',  # 使用这个类实现控制台句柄
            'filename': './logs/log.log',  # 写到这个文件中,目录需要提前创建一下
            'formatter': "simple"  # 使用这种simple格式化日志格式
        }
    },
    'root': {  # 一个名为root的日志记录器,默认就是root,如果不使用logging.getLogger()设置
        'handlers': ['console'],  # 使用console控制台日志句柄
        'level': 'DEBUG',  # 日志等级是DEBUG
    },
    'loggers': {  # 添加记录器
        'custom': {  # 一个叫custom的日志记录器
            'handlers': ['console'],  # 使用console控制台日志句柄
            'level': 'ERROR',  # 日志等级是ERROR
            'propagate': False,  # 是否向上传递

        },
        'for_write_file': {
            'handlers': ['write_file'],  # 使用write_file日志句柄
            'level': 'DEBUG',  # 日志等级
            'propagate': False,  # 是否向上传递
        }
    },
}

views.py

import logging

from django.http import HttpResponse
from django.utils.log import RequireDebugTrue


def fun(request):
    logging.info("info msg")
    logging.warning("warning msg")
    logging.error("error msg")

    log = logging.getLogger('custom')
    log.info("info msg for custom logger")
    log.warning("warning msg for custom logger")
    log.error("error msg for custom logger")

    log = logging.getLogger('for_write_file')
    log.info("info msg for for_write_file logger")
    log.warning("warning msg for for_write_file logger")
    log.error("error msg for for_write_file logger")
    return HttpResponse()

结果:

对应的root都输出了

对应的custom只输出ERROR以上的

对应的for_write_file都输出到文件里了

image-20220520105329312

以上都是 'propagate': False, # 是否向上传递 表示不传递,如果修改了向上传递,则这个日志的句柄会向上传递

备注:

  • 如果把for_write_file的'propagate':改为True

image-20220520105730390

结果是:

image-20220520105828604

可以看到执行了root的信息

  • 如果把custom的'propagate':改为True

image-20220520105954362

结果是:

image-20220520110037697

输出了两遍,一遍是custom本身,一遍是root

propagete参数 :propagete=0,表示输出日志,但消息不传递;propagate=1是输出日志,同时消息往更高级别的地方传递。root为最高级别。

添加过滤器

setting.py

LOGGING = {
    'version': 1,  # 版本
    'disable_existing_loggers': False,  # 是否禁用已经存在的日志句柄
    'formatters': {  # 定义日志的格式
        'verbose': {
            'format': '[{levelname}][{asctime}][{module}][{process:d}][{thread:d}]{message}',
            'style': '{',  # 使用{}的形式申明格式,而不是%(levelname)s这样默认的形式,当然也可以使用默认的
        },
        'simple': {
            'format': '[{levelname}]{message}',
            'style': '{',  # 使用{}的形式申明格式,而不是%(levelname)s这样默认的形式,当然也可以使用默认的
        },
    },
    'filters': {  # 定义过滤器
        'require_debug_true': {
            '()': 'django.utils.log.RequireDebugTrue',  # 使用这个类的过滤函数
        },
    },
    'handlers': {  # 拥有的句柄
        'console': {  # 拥有一个控制台句柄
            'class': 'logging.StreamHandler',  # 使用这个类实现控制台句柄
            'formatter': 'verbose',  # 使用这种verbose格式化日志格式
            'filters': ["require_debug_true"]  # 使用这个过滤器
        },
        'write_file': {  # 一个叫write_file的句柄
            'class': 'logging.FileHandler',  # 使用这个类实现控制台句柄
            'filename': './logs/log.log',  # 写到这个文件中,目录需要提前创建一下
            'formatter': "simple"  # 使用这种simple格式化日志格式
        }
    },
    'root': {  # 一个名为root的日志记录器,默认就是root,如果不使用logging.getLogger()设置
        'handlers': ['console'],  # 使用console控制台日志句柄
        'level': 'DEBUG',  # 日志等级是DEBUG
    },
    'loggers': {  # 添加记录器
        'custom': {  # 一个叫custom的日志记录器
            'handlers': ['write_file'],  # 使用console控制台日志句柄
            'level': 'ERROR',  # 日志等级是ERROR
            'propagate': False,  # 是否向上传递

        },
        'for_write_file': {
            'handlers': ['write_file'],  # 使用write_file日志句柄
            'level': 'DEBUG',  # 日志等级
            'propagate': False,  # 是否向上传递
        }
    },
}

当setting的DEBUG = False时,不会显示console日志,因为他用了过滤器,源码是:

image-20220520123519516

自定义过滤器:

创建django_log_learn/filter_log.py,输入内容

import logging


class CustomerFilterLog(logging.Filter):
    def filter(self, record):
        if 'c-' not in record.msg:  # 这种情况不记录
            return False
        return True

如果没有c-在消息中,就不记录信息

setting.py

LOGGING = {
    'version': 1,  # 版本
    'disable_existing_loggers': False,  # 是否禁用已经存在的日志句柄
    'formatters': {  # 定义日志的格式
        'verbose': {
            'format': '[{levelname}][{asctime}][{module}][{process:d}][{thread:d}]{message}',
            'style': '{',  # 使用{}的形式申明格式,而不是%(levelname)s这样默认的形式,当然也可以使用默认的
        },
        'simple': {
            'format': '[{levelname}]{message}',
            'style': '{',  # 使用{}的形式申明格式,而不是%(levelname)s这样默认的形式,当然也可以使用默认的
        },
    },
    'filters': {  # 定义过滤器
        'require_debug_true': {
            '()': 'django.utils.log.RequireDebugTrue',  # 使用这个类的过滤函数
        },
        'customer_filter_log': {
            '()': 'django_log_learn.filter_log.CustomerFilterLog',  # 使用自定义过滤器
        }
    },
    'handlers': {  # 拥有的句柄
        'console': {  # 拥有一个控制台句柄
            'class': 'logging.StreamHandler',  # 使用这个类实现控制台句柄
            'formatter': 'verbose',  # 使用这种verbose格式化日志格式
            'filters': ["customer_filter_log"]  # 使用这个过滤器
        },
        'write_file': {  # 一个叫write_file的句柄
            'class': 'logging.FileHandler',  # 使用这个类实现控制台句柄
            'filename': './logs/log.log',  # 写到这个文件中,目录需要提前创建一下
            'formatter': "simple"  # 使用这种simple格式化日志格式
        }
    },
    'root': {  # 一个名为root的日志记录器,默认就是root,如果不使用logging.getLogger()设置
        'handlers': ['console'],  # 使用console控制台日志句柄
        'level': 'DEBUG',  # 日志等级是DEBUG
    },
    'loggers': {  # 添加记录器
        'custom': {  # 一个叫custom的日志记录器
            'handlers': ['write_file'],  # 使用console控制台日志句柄
            'level': 'ERROR',  # 日志等级是ERROR
            'propagate': False,  # 是否向上传递

        },
        'for_write_file': {
            'handlers': ['write_file'],  # 使用write_file日志句柄
            'level': 'DEBUG',  # 日志等级
            'propagate': False,  # 是否向上传递
        }
    },
}

views.py

import logging

from django.http import HttpResponse
from django.utils.log import RequireDebugTrue


def fun(request):
    logging.info('c- 哈哈哈哈哈,该记录了')
    logging.info("info msg")
    logging.warning("warning msg")
    logging.error("error msg")
    log = logging.getLogger('custom')
    log.info("info msg for custom logger")
    log.warning("warning msg for custom logger")
    log.error("error msg for custom logger")

    log = logging.getLogger('for_write_file')
    log.info("info msg for for_write_file logger")
    log.warning("warning msg for for_write_file logger")
    log.error("error msg for for_write_file logger")
    return HttpResponse()

image-20220520124806398

3、个人通用

LOG_NAME = Path(BASE_DIR).joinpath("logs", 'log.log')
if not Path(LOG_NAME).parent.exists():
    print(f"创建了日志目录:{Path(LOG_NAME).absolute()}")
    os.makedirs(Path(LOG_NAME).parent)
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,  # 是否禁用已经存在的日志实例
    'formatters': {  # 定义输出日志的格式
        "verbose": {
            "format": "[{levelname}][{asctime}][{pathname}:{lineno}][process:{process:d}][thread:{thread:d}]{message}",
            "style": "{",
        },
        "simple": {
            "format": "[{levelname}]{message}",
            "style": "{",
        },
    },
    'filters': {
    },
    'handlers': {  # 控制器
        'RotatingFileHandler': {  # 回滚日志句柄
            'level': 'INFO',  # 日志级别
            'class': 'logging.handlers.RotatingFileHandler',  # 定义日志的切分格式,以及输出方式
            'filename': LOG_NAME,  # 日志文件
            'maxBytes': 1024 * 1024 * 5,  # 5 MB 文件大小
            'backupCount': 20,  # 备份份数
            'formatter': 'verbose',  # 使用哪种日志格式
            'encoding': "utf-8"
        },
        'console': {  # 控制台句柄
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',  # 输出到控制台
            'formatter': 'simple'
        },
    },
    'loggers': {
        'console': {
            'handlers': ['console'],
            'level': 'DEBUG',
            'propagate': False,
        },
        'rolling_file': {
            'handlers': ['console', 'RotatingFileHandler'],  # 使用的日志句柄
            'level': 'INFO',  # 日志等级
            'propagate': False,  # 是否向上传递
        },
        'root': {
            'handlers': ['console', 'RotatingFileHandler'],  # 使用的日志句柄
            'level': 'INFO',  # 日志等级
            'propagate': False,  # 是否向上传递
        }
    }
}

输出为

image-20220520142124629

说明:

格式化日志参数

格式 描述 输出
%(name)s 记录器的名称 root
%(levelno)s 数字形式的日志记录级别 20
%(levelname)s 日志记录级别的文本名称 INFO
%(filename)s 执行日志记录调用的源文件的文件名称 views.py
%(pathname)s 执行日志记录调用的源文件的路径名称 D:\Project\PythonProject\django_log_studydjango_log_learn\django_log_learn\views.py
%(funcName)s 执行日志记录调用的函数名称 fun
%(module)s 执行日志记录调用的模块名称 views
%(lineno)s 执行日志记录调用的行号 11
%(created)s 执行日志记录的时间 1653027145.2251844
%(asctime)s 日期和时间 2022-05-20 14:12:25,225
%(msecs)s 毫秒部分 225.18444061279297
%(thread)d 线程ID 8080
%(threadName)s 线程名称 Thread-1
%(process)d 进程ID 12780
%(message)s 记录的消息 info msg

image-20220520141824477

posted @ 2022-05-20 14:48  南风丶轻语  阅读(767)  评论(0编辑  收藏  举报