[Python] Django 日志输出总结
关于这篇文章
我整理了关于 Django 日志输出设置的内容。
Django的日志输出使用了Python的标准日志输出模块”logging”。我们将介绍使用logging的基本知识以及Django的默认配置解释。
记录概览
请参考以下网站
关于日志记录的概述,请参考官方网站和以下条目。
・Python 官方日志指南
https://docs.python.jp/3/howto/logging.html#logging-flow
・Django 官方日志记录
https://docs.djangoproject.com/ja/2.0/topics/logging/
・Logging的基础知识
https://qiita.com/knknkn1162/items/87b1153c212b27bd52b4
日志记录系统
由于详细描述的话太多了,所以我只总结Django所需的最基本内容。
记录的组成要素
日志记录由四个元素组成,分别是Loggers、Handlers、Filters、Formatters。
-
- Logger
ログ出力を受け付ける。
Handler
ログの出力先を設定する(標準出力、ファイル、メール等)
Filter
ログレベルとは別にブール型関数でフィルタを設定する
Formatter
ログに出力する文字列の形式を設定する
在Python中,Filter(过滤器)和Formatter(格式化器)都是Handler(处理程序)的属性,而Handler又是Logger(记录器)的属性。
在Logger中,可以指定多个Handler。
日志等级
在日志记录中,我们将每个日志称为日志记录。
日志记录有七个级别,根据重要性不同而定。
在代码中指定任意的日志记录器,并执行与日志级别同名的方法,将输出日志。
例如;
import logging
…
logger = logging.getLogger('development')
logger.info('Hello World!')
日志级别是由Logger和Handler的level属性来使用的。当我们指定任何日志级别到level属性时,可以抑制低于该级别的输出。
Logger的命名空间
日志记录器的名称可以使用点分隔符并具有命名空间。创建命名空间后,如果使用getLogger指定的日志记录器不存在,则会尝试获取上级日志记录器。具体来说,如果使用getLogger(‘first.second.third’),如果没有名为first.second.third的日志记录器,将依次尝试获取first.second日志记录器、first日志记录器和根日志记录器(如果创建了一个名为空字符串的日志记录器,则会成为根日志记录器)。
根据从靠近根目录的较高级的定义开始,定义Loggers。将Logger的propagate属性设置为True,将在处理完当前Logger后递归获取下一个Logger。
推荐以此动作为前提来获取Logger, 记述方式如下所示。
logging.getLogger(__name__)
由于Python的特性,”__name__”变量会被赋值为模块的名称,因此您可以根据模块的目录结构来改变输出内容。
默认设置
“Django的logging默认设置位于「django.utils.log.py」的DEFAULT_LOGGING变量中。最好的做法是将此设置首先复制到setting.py文件中的LOGGING变量中,并进行修改以确保正常运行。”
# Default logging for Django. This sends an email to the site admins on every
# HTTP 500 error. Depending on DEBUG, all other log records are either sent to
# the console (DEBUG=True) or discarded (DEBUG=False) by means of the
# require_debug_true filter.
DEFAULT_LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'filters': {
'require_debug_false': {
'()': 'django.utils.log.RequireDebugFalse',
},
'require_debug_true': {
'()': 'django.utils.log.RequireDebugTrue',
},
},
'formatters': {
'django.server': {
'()': 'django.utils.log.ServerFormatter',
'format': '[%(server_time)s] %(message)s a',
}
},
'handlers': {
'console': {
'level': 'INFO',
'filters': ['require_debug_true'],
'class': 'logging.StreamHandler',
},
'django.server': {
'level': 'INFO',
'class': 'logging.StreamHandler',
'formatter': 'django.server',
},
'mail_admins': {
'level': 'ERROR',
'filters': ['require_debug_false'],
'class': 'django.utils.log.AdminEmailHandler'
}
},
'loggers': {
'django': {
'handlers': ['console', 'mail_admins'],
'level': 'INFO',
},
'django.server': {
'handlers': ['django.server'],
'level': 'INFO',
'propagate': False,
},
}
}
默认设置的说明
伐木工人
在Django中提供了两个日志记录器,分别是django和django.server。django用于记录内部处理的日志,而django.server则用于记录开发用Web服务器的访问日志。
句柄:输出目标的句柄
在调试时,将输出发送到标准输出,并在正式运行时设置为将错误信息级别为ERROR及以上发送到管理员的邮件。在出现”500 Internal Server Error”错误时,若已设置SMTP和管理员的电子邮件地址,则每次都会发送一封邮件。
・过滤器
提供了使用DEBUG设置的开/关过滤器。
如何为自己的应用添加Logger。
通过添加专用配置可以在默认的Loggers中实现在应用程序内输出调试日志的设置。
示例
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'filters': {
'require_debug_false': {
'()': 'django.utils.log.RequireDebugFalse',
},
'require_debug_true': {
'()': 'django.utils.log.RequireDebugTrue',
},
},
'formatters': {
'django.server': {
'()': 'django.utils.log.ServerFormatter',
'format': '[%(server_time)s] %(message)s a',
},
'verbose': {
'format': '%(levelname)s %(asctime)s %(module)s '
'%(process)d %(thread)d %(message)s'
},
},
'handlers': {
'console': {
'level': 'INFO',
'filters': ['require_debug_true'],
'class': 'logging.StreamHandler',
'formatter': 'verbose',
},
'django.server': {
'level': 'INFO',
'class': 'logging.StreamHandler',
'formatter': 'django.server',
},
'mail_admins': {
'level': 'ERROR',
'filters': ['require_debug_false'],
'class': 'django.utils.log.AdminEmailHandler'
}
},
'loggers': {
'django': {
'handlers': ['console', 'mail_admins'],
'level': 'INFO',
},
'django.server': {
'handlers': ['django.server'],
'level': 'INFO',
'propagate': False,
},
#追加
'myapp': {
'handlers': ['console'],
'level': 'INFO',
'propagate': False,
},
}
}
关于正式环境的配置考虑。
(Regarding the configuration considerations for the production environment.)
・默认设置是通过DEBUG标志来切换开发和生产环境,但将其单独放在另一个文件中才是主流且安全的做法。
如果在云环境中进行运营,建议将应用程序的日志输出限定为标准输出,将文件输出和日志监视设为其他服务。请参考《Twelve-Factor App:将日志视为事件流》。
也可以通过将错误日志直接发送到错误收集服务来处理。其中一个代表性的服务是”sentry”,同时也有Django的客户端包。关于如何配置,可以参考cookiecutter-django。