下面我将为你详细讲解“Django logging配置及使用详解”的完整攻略。
一、概述
Django是一个功能强大的Web框架,应用广泛,但在实际项目中,我们经常需要记录一些日志来帮助我们定位问题、排查故障。Django提供了一个logging模块来方便我们记录日志。
本文将详细介绍Django中logging的配置与使用。
二、系统默认日志配置
在Django中,默认情况下会自动配置一些基本的日志记录,其配置如下:
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console': {
'class': 'logging.StreamHandler',
},
},
'root': {
'handlers': ['console'],
'level': 'INFO',
}
}
上述配置表示:
version
:表示日志配置的版本,目前为1。disable_existing_loggers
:表示是否禁用所有已经存在的logger,默认为False。handlers
:表示配置handler,即日志处理器,这里仅配置了一个console
处理器,用来将日志输出到控制台。root
:表示配置根logger,即所有日志都会经过这个logger处理,这里配置了一个console
的handler,并设置了INFO
级别,即只记录INFO
级别及以上的日志。
事实上,Django还提供了其他几个handler,包括:
logging.FileHandler
:用来记录到文件。logging.handlers.RotatingFileHandler
:用来循环记录到多个文件。logging.handlers.TimedRotatingFileHandler
:用来定时记录到多个文件。
三、自定义日志配置及使用
如果我们需要定制化日志记录,或者需要使用其他日志处理器,那么我们可以在Django的配置文件中添加自定义日志配置,具体可以按以下步骤进行操作:
1. 在Django的配置文件中添加自定义日志配置
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console': {
'class': 'logging.StreamHandler',
'level': 'DEBUG', # 设置handler级别为DEBUG
},
'file': {
'class': 'logging.handlers.RotatingFileHandler',
'filename': '/var/log/django.log',
'maxBytes': 1024*1024*5, # 设置每个日志文件的最大大小为5M
'backupCount': 7, # 设置备份数量为7个
'level': 'INFO',
'formatter': 'verbose'
}
},
'loggers': {
'django': {
'handlers': ['file'],
'level': 'INFO',
'propagate': True,
},
'myapp': {
'handlers': ['console', 'file'], # 定义两个handler
'level': 'DEBUG',
'propagate': True,
}
},
'formatters': {
'verbose': {
'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s'
},
'simple': {
'format': '%(levelname)s %(message)s'
},
},
}
上述配置表示:
version
:表示日志配置的版本,目前为1。disable_existing_loggers
:表示是否禁用所有已经存在的logger,默认为False。handlers
:表示配置handler,即日志处理器,这里定义了console
和file
两个处理器。console
处理器配置了StreamHandler
,用来将日志输出到控制台,并设置了DEBUG
级别。file
处理器配置了RotatingFileHandler
,用来循环记录到多个文件,并设置了INFO
级别。同时定义了一个verbose
格式化器。loggers
:表示配置logger,即日志记录器。这里定义了两个logger,分别是django
和myapp
。django
logger使用了file
处理器进行日志记录,设置了INFO
级别,并且设置了propagate
为True,表示日志会继续传递给父logger进行处理。myapp
logger使用了console
和file
两个处理器进行记录,设置了DEBUG
级别,并且设置了propagate
为True,表示日志会继续传递给父logger进行处理。formatters
:表示定义格式化器,这里定义了verbose
和simple
两种格式化器。
2. 在代码中使用日志记录器
在代码中使用日志记录器非常简单,只需要在需要记录日志的地方调用相应的函数即可。
import logging
logger = logging.getLogger('myapp')
def my_view(request, arg1, arg):
logger.debug('Debug message')
logger.info('Info message')
logger.warning('Warn message')
logger.error('Error message')
logger.critical('Critical message')
# ...
上述代码表示,在my_view
方法中调用logger
记录日志,按照日志级别从低到高,分别记录了调试信息、普通信息、警告信息、错误信息和严重错误信息。
四、示例说明
示例一
下面给出一个完整的示例,假设我们有一个Django项目的目录结构如下:
project/
__init__.py
settings.py
urls.py
wsgi.py
myapp/
__init__.py
views.py
我们需要在views.py
文件中进行日志记录,记录的日志需要输到文件中,以及在控制台打印出来。
首先,在settings.py
中添加以下自定义日志配置:
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console': {
'class': 'logging.StreamHandler',
'level': 'DEBUG', # 设置handler级别为DEBUG
},
'file': {
'class': 'logging.handlers.RotatingFileHandler',
'filename': '/var/log/django.log',
'maxBytes': 1024*1024*5, # 设置每个日志文件的最大大小为5M
'backupCount': 7, # 设置备份数量为7个
'level': 'INFO',
'formatter': 'verbose'
}
},
'loggers': {
'myapp': {
'handlers': ['console', 'file'], # 定义两个handler
'level': 'DEBUG',
'propagate': True,
}
},
'formatters': {
'verbose': {
'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s'
},
'simple': {
'format': '%(levelname)s %(message)s'
},
},
}
然后,在views.py
文件中添加以下代码:
import logging
logger = logging.getLogger('myapp')
def my_view(request, arg1, arg):
logger.debug('Debug message')
logger.info('Info message')
logger.warning('Warn message')
logger.error('Error message')
logger.critical('Critical message')
上述代码表示,我们在my_view中调用logger
记录日志,根据日志级别记录了不同级别的日志信息。
最后,在控制台运行Django项目,可以看到输出了日志信息,并且在/var/log/django.log
文件中也记录了日志信息。
示例二
假设我们需要将日志信息记录到不同的文件中,根据不同的日志级别分别记录,在views.py
文件中根据不同的情况进行日志记录。
首先,在settings.py
中添加以下自定义日志配置:
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console': {
'class': 'logging.StreamHandler',
'level': 'DEBUG', # 设置handler级别为DEBUG
},
'info_file': {
'class': 'logging.handlers.RotatingFileHandler',
'filename': '/var/log/django-info.log',
'maxBytes': 1024*1024*5, # 设置每个日志文件的最大大小为5M
'backupCount': 7, # 设置备份数量为7个
'level': 'INFO',
'formatter': 'verbose'
},
'error_file': {
'class': 'logging.handlers.RotatingFileHandler',
'filename': '/var/log/django-error.log',
'maxBytes': 1024*1024*5, # 设置每个日志文件的最大大小为5M
'backupCount': 7, # 设置备份数量为7个
'level': 'ERROR',
'formatter': 'verbose'
}
},
'loggers': {
'myapp': {
'handlers': ['console', 'info_file', 'error_file'],
'level': 'DEBUG',
'propagate': True,
}
},
'formatters': {
'verbose': {
'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s'
}
},
}
上述代码定义了三个handler,分别是console
、info_file
和error_file
,其中info_file
和error_file
使用了RotatingFileHandler
,分别记录了INFO
级别及以上和ERROR
级别及以上的日志信息,同时使用了verbose
格式化器。
然后,在views.py
中添加如下代码:
import logging
logger = logging.getLogger('myapp')
def my_view(request, arg1, arg):
if arg1 == 'info':
logger.info('Info message')
elif arg1 == 'error':
logger.error('Error message')
else:
logger.debug('Debug message')
上述代码表示,根据参数arg1
的值进行相应的日志记录,如果值为info
,记录INFO
级别的日志信息,如果值为error
,记录ERROR
级别的日志信息,否则记录DEBUG
级别的日志信息。
最后,在控制台运行Django项目,可以看到输出了日志信息,并且在/var/log/django-info.log
文件中和/var/log/django-error.log
文件中分别记录了不同级别的日志信息。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Django logging配置及使用详解 - Python技术站