django记录日志简单用法
django记录日志简单用法
1、创建项目
django-admin startproject django_log_learn
创建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()
添加路由
django_log_learn/urls.py
path('', views.fun),
正常只会输入warning等级以上信息到控制台,就是原始的logging
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
},
}
说明:
'disable_existing_loggers': False, # 是否禁用已经存在的日志句柄,如果禁用,则其他模块使用logging输出都不显示,否则显示
例如不禁用,则会显示utils\autoreload.py的日志,其他模块使用也会显示,这是举一个例子而已
禁用了就看不到这些输出了,可以自己试一试
添加一个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以及以上的日志
添加一个写到日志的记录器
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()
文件中的日志
添加格式输出
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都输出到文件里了
以上都是 'propagate': False, # 是否向上传递 表示不传递,如果修改了向上传递,则这个日志的句柄会向上传递
备注:
- 如果把for_write_file的'propagate':改为True
结果是:
可以看到执行了root的信息
- 如果把custom的'propagate':改为True
结果是:
输出了两遍,一遍是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日志,因为他用了过滤器,源码是:
自定义过滤器:
创建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()
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, # 是否向上传递
}
}
}
输出为
说明:
格式化日志参数
格式 | 描述 | 输出 |
---|---|---|
%(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 |