Django 日志

对于博客来说,要想提高体验需要注意测试,日志。从某种程度来说,博客部署好了,一般有经过一定的测试,所以日志相对来说更重要一些。当然这两者都很重要。

django 中的日志包括四部分内容,logger, handler, filter, formatter,实际时往大了说只包括两个内容:logger, handler,因为其中的filter是过滤logger中传到handler的信息,而formatter则是处理handler输出到文件,控制台等的格式。从这种意义上说filter, formatter都只是辅助。

简单流程如下:

因为我用的两套settings,本地的日志主要是调试时用的,所以级别为debug,而在服务器则只需要更高级别的warning或者error,当出现error时最好 能发送相关信息给管理员(如果设置了改送邮件就需要设置对应的邮件服务器等相关设置)。

 

本地的简单的debug级别的日志:settings.local.py

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,

    'loggers': {
        'django': {
            'handlers': ['file'],
            'level': 'DEBUG',
            'propagate': True,
        },
    },
    'handlers': {
        'file': {
            'level': 'DEBUG',
            'class': 'logging.FileHandler',
            'filename': os.path.join(BASE_DIR, 'logs/debug.log'),
        },
    },
}

经过这样设置后,日志文件里的内容与我们运行测试服务器时在控制台看到的消息是一致的。

 

服务器端的warning级别的日志,相对复杂:settings.prod.py

# 日志相关设置
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        # 详细格式, 级别,时间,抛出模块,进程,线程id,提示信息。
        'verbose': {
            'format': '{levelname} {asctime} {module} {process:d} {thread:d} {message}',
            'style': '{',
        },
        # 简单格式,仅消息级别,提示信息
        'simple': {
            'format': '{levelname} {message}',
            'style': '{',
        },
    },
    'filters': {
        # 只有当debug为false时才会记录
        'require_debug_false': {
            '()': 'django.utils.log.RequireDebugFalse',
        },
    },
    'handlers': {
        'mail_admins': {
            'level': 'ERROR',
            'class': 'django.utils.log.AdminEmailHandler',
            'formatter': 'verbose',
        },
        'file': {
            # warning级别,
            'level': 'WARNING',
            'class': 'logging.handlers.TimedRotatingFileHandler',  # python 内置随时间分割日志的模块
            'when': 'midnight',  # 分割时间为午夜·
            'backupCount': 30,  # 日志文件保存时间为30天
            'filename': os.path.join(BASE_DIR, 'logs/warning.log'),
            'formatter': 'verbose',
        },
    },
    'loggers': {
        # INFO级别记录器
        'django': {
            'handlers': ['file'],
            'level': 'INFO',
            'propagate': True,
        },
        # Warning级别记录器,将日志写入文件,并给管理员发邮件
        'django.request': {
            'handlers': ['file', 'mail_admins'],
            'level': 'WARNING',
            'propagate': False,
        },
    }
}

这里用到了日志分割,其实对于我这个人博客来说,日志分割必须性不强。它的相关设置主要是:

'file': {
            ...
            # 注释掉 class
            # 'class': 'logging.FileHandler',

            #新增内容
            'class': 'logging.handlers.TimedRotatingFileHandler',
            'when': 'midnight',
            'backupCount': 30,

另外还可以根据文件大小来决定日志分割,将使用 RotatingFileHandler, 具体参考:https://docs.python.org/3/library/logging.handlers.html#logging.handlers.RotatingFileHandler

上面提到过,因为要改送邮件,所以需要配置邮件服务器相关的设置:

# SMTP服务器
EMAIL_HOST = 'your smtp'
# 邮箱名
EMAIL_HOST_USER = 'your email'
# 邮箱密码
EMAIL_HOST_PASSWORD = 'your password'
# 发送邮件的端口
EMAIL_PORT = 25
# 是否使用 TLS
EMAIL_USE_TLS = True
# 默认的发件人
DEFAULT_FROM_EMAIL = 'your email'

由于是在服务器上的日志,本地的配置中可能 会用到的 debug为True应该进行修改:

 'filters': {
        'require_debug_true': {
            '()': 'django.utils.log.RequireDebugTrue',
        },
    },

改成:

'filters': {
        # 只有当debug为false时才会记录
        'require_debug_false': {
            '()': 'django.utils.log.RequireDebugFalse',
        },
    },

 

关于日志记录访问的ip信息等,找到了 django_requestlogging模块,链接在这:https://pypi.org/project/django-requestlogging/

但是由于本项目用的django==2.0, 该模块的middleware无法使用,导致无法使用该模块,最后也没找到合适的方法做到这一点。之后 发现这个思路就错了,因为nginx的日志都会记录这些信息,所以一般是没有必要让django 去记录这些信息的。

上一篇:Django 自动化测试

下一篇:django 视图函数