在使用 Django 进行开发时,我们需要将日志信息输出到控制台和日志文件中以便进行调试和故障排除。在使用 python manage.py runserver
命令运行 Django 项目时,我们可以正常地将日志输出到控制台。但是,当我们使用 Gunicorn 作为服务器来运行项目时,打印语句可以正常输出到控制台,但是 log.info()
打印的日志信息却无法输出到任何地方。
解决方案
这个问题通常是由于 Gunicorn 的日志配置问题引起的。为了解决这个问题,我们需要在 Django 项目的 settings.py
文件中正确配置日志。以下是如何配置 Gunicorn 日志:
# settings.py
LOGGING = {
'version': 1,
'disable_existing_loggers': True,
# 日志格式化器
'formatters': {
'standard': {
'format': "[%(asctime)s] %(levelname)s [%(name)s:%(lineno)s] %(message)s",
'datefmt': "%d/%b/%Y %H:%M:%S"
},
},
# 日志处理器
'handlers': {
'console': {
'level': 'INFO',
'class': 'logging.StreamHandler',
'formatter': 'standard'
},
'info_file_handler': {
'level': 'INFO',
'class': 'logging.handlers.RotatingFileHandler',
'filename': 'info.log',
'maxBytes': 1024 * 1024 * 5, # 5 MB
'backupCount': 5,
'formatter': 'standard',
},
'error_file_handler': {
'level': 'ERROR',
'class': 'logging.handlers.RotatingFileHandler',
'filename': 'error.log',
'maxBytes': 1024 * 1024 * 5, # 5 MB
'backupCount': 5,
'formatter': 'standard',
},
},
# 日志记录器
'loggers': {
'': {
'handlers': ['console', 'info_file_handler', 'error_file_handler'],
'level': 'INFO',
'propagate': True,
},
'django': {
'handlers': ['console', 'info_file_handler', 'error_file_handler'],
'level': 'INFO',
'propagate': True,
},
'django.db.backends': {
'handlers': ['console', 'info_file_handler', 'error_file_handler'],
'level': 'INFO',
'propagate': False,
},
'my_app': {
'handlers': ['console', 'info_file_handler', 'error_file_handler'],
'level': 'INFO',
'propagate': True,
},
}
}
在上面的配置中,我们创建了一个名为 console
的日志处理器,它将日志信息输出到控制台。我们还创建了两个名为 info_file_handler
和 error_file_handler
的日志处理器,它们分别将日志信息写入 info.log
和 error.log
文件。然后,我们将这些日志处理器添加到各个日志记录器中。
# views.py
import logging
# 获取名为 'my_app' 的日志记录器
logger = logging.getLogger('my_app')
# 使用日志记录器记录日志信息
logger.info('This is an informational message')
通过这种方式,我们就可以将日志信息输出到控制台和日志文件中。需要注意的是,在使用 Gunicorn 运行 Django 项目时,还需要在 Gunicorn 的配置文件中配置日志。具体配置方法可以参考 Gunicorn 的官方文档。