[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。

日志等级

在日志记录中,我们将每个日志称为日志记录。
日志记录有七个级别,根据重要性不同而定。

名前設定値役割NOTSET0設定値などの記録(全ての記録)DEBUG10動作確認などデバッグの記録INFO20正常動作の記録WARNING30警告の記録ERROR40エラーなど重大な問題CRITICAL50停止など致命的な問題

在代码中指定任意的日志记录器,并执行与日志级别同名的方法,将输出日志。

例如;

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。

广告
将在 10 秒后关闭
bannerAds