记得第一次接触django是一年半前,跟着一个博士师兄写了一段时间之后, 师兄给我布置了一个任务, 让我给当时正在做的网站添加日志系统,当时接到这个任务时我就感觉做不了,因为虽然写了也有几天了, 但是基本上都是ctrl+c然后ctrl+v,然后改改表名,改改业务逻辑,对django没有任何的了解, 基本上只是在写python,而不是django.

折腾了几天之后,果然还是没有折腾出来,于是任务交由一个很NB的师弟去做了,当然就做出来了…囧

上一次再接触django的这个日志功能是大概一年前的样子,对django有了一点基本的认识, 也看了django官方的一些文档(真是好东西啊),但是试了试,还是没有配好,于是又交给了另一个师弟,囧

今天是突然看到了自己不久前写的一个django_base的小项目,旨在把用django做网站需要用到的一些基本功能都实现了, 然后在用的时候可以快速开发,免去一些基本的设置,比如登录注册忘记密码啥的。就像你所知道的那样, 这个小项目一直没有日志功能,对于终将部署到服务器上的网站来说,没有日志功能是一件非常可怕的事(如果你经历过的话), 于是今天再次尝试了一下django的日志功能, 虽然中途也遇到了一些问题,但是终究还是可以使用了,^_^

setting.py

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'verbose': {
            'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s'
        },
        'simple': {
            'format': '%(levelname)s %(message)s'
        },
    },
    'filters': {
        'special': {
            '()': 'helper.utils.logging_filter',
            'foo': 'bar',
        }
    },
    'handlers': {
        'null': {
            'level': 'DEBUG',
            'class': 'logging.NullHandler',
        },
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
            'formatter': 'verbose'
        },
        'mail_admins': {
            'level': 'ERROR',
            'class': 'django.utils.log.AdminEmailHandler',
            'include_html': False, # set this to True may made the email be suspicious
        },
        'file': {
            'level': 'DEBUG',
            'class': 'logging.FileHandler',
            'filename': 'debug.log',
            'formatter': 'verbose'
        },
    },
    'loggers': {
        'django': {
            'handlers': ['console'],
            'level': os.getenv('DJANGO_LOG_LEVEL', 'INFO'),
        },
        'django.request': {
            'handlers': ['file'],
            'level': 'DEBUG',
            'propagate': True,
        },
        'accounts.views': {
            'handlers': ['file'],
            'level': 'INFO',
            'propagate': True,
        },
        'news': {
            'handlers': ['mail_admins'],
            'level': 'INFO',
        },
        'news.views': {
            'handlers': ['console'],
            'level': os.getenv('DJANGO_LOG_LEVEL', 'INFO'),
        }
    },
}

使用的话,就是这个样子了:

# import the logging library
import logging

# Get an instance of a logger
logger = logging.getLogger(__name__)

def index(request):
    try:
        ...
    except Exception, e:
        logger.error('Error: ' + e)

其中formatters的里具体的参数的信息和配置可以参考这里

需要特别强调的是mail_admins,这里并不是简单的这样配置了就可以工作的, 还需要一些settings.py里的其他配置配合才能正常工作,主要有以下几点:

1.ADMINS一定要设置,并且格式如下:

ADMINS = (
    ('shellbye', 'some_other_email@domain.com'),
)

注意结尾的那个英文逗号( ,),这个是必须的,否则就不是tuple了。

2.SERVER_EMAIL也需要设置, 因为django默认的设置是root@localhost, 你的邮件服务器很可能没有这个账号,所以你需要设置成你的邮件服务器里存在的一个发信地址,比如:

SERVER_EMAIL = 'your_account@example.com'

在我的项目里,设置好这些就可以发送日志邮件了,也许你的还有其他需要配置的, 具体的请参考万能的stackoverflow.com里的这个回答。

3.mail_admins里面的include_html如果设置成True的话,有可能会被当做垃圾邮件。我使用的163的免费邮箱, 就发生了系统退信。



blog comments powered by Disqus

Published

08 April 2015

Category

tech_world

Tags