python - Django 日志记录项目和应用程序命名空间

标签 python django logging namespaces

我有 Django 日志记录的问题。顺便说一句,这个问题的答案将帮助我阐明 Django 命名空间的工作原理。

这是我的项目的结构:

MyProject:
    -App1:
         ....
         views.py
    -App2:
         ....
    urls.py
    settings.py

我喜欢将所有消息记录在一个文件中。然后我在 settings.py 中设置了以下记录器:
LOGGING = {
    'version': 1,
    'disable_existing_loggers': True,
    'formatters': {
            'verbose': {
                    #'format': '%(levelname)-8s %(remote_addr)-15s %(path_info)s %(asctime)s %(name)-20s %(funcName)-15s %(message)s'
                    'format': '%(levelname)-8s %(asctime)s %(name)-20s %(funcName)-15s %(message)s'
                    },
            },
    'handlers': {
            'normal': {
            'level': 'DEBUG',
            'class': 'logging.FileHandler',
            'formatter': 'verbose',
            'filename': os.path.join('C:/dev/Instantaneus/Instantaneus/html/static', 'log', 'normal.log')
        },
            'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
            'formatter': 'verbose',
            },
        },
    'loggers': {
        'MyProject': {
                'handlers': ['normal','console'],
                'level': 'DEBUG',
                #'filters': ['request'],
                'propagate': True,
                },
            }
       }

在 urls.py 中:
from MyProject.App1.views import EvenementDetailView,
....
url(r'App1/(?P<pk>\d+)/$', login_required(EvenementDetailView.as_view(model=Evenement)), name='evenement_details'),

在 App1/views.py 中:
from django.views.generic import DetailView
import logging
logger = logging.getLogger(__name__)

....

class EvenementDetailView(DetailView):
    print __name__
    model=Evenement
    ....
    logger.debug('blabla')

在浏览器中,当我调用 http://localhost/App1/3 时,控制台中出现以下内容:
DEBUG    2012-01-18 14:59:04,503 Myproject.evenements.views EvenementDetailView blabla
MyProject.evenements.views
evenements.views

那么我的问题是为什么print __name__代码执行两次,最重要的是为什么输出不一样?

我想 DEBUG日志只出现一次,因为 evenement.views不能传播到 MyProject 因为在这种情况下 root 是 evenements
有任何想法吗 ?

解决方案,没有深入的解释,但它有效:

在我的 urls.py 中,我有一行 url(r'App1/(?P<pk>\d+)/activate/$', 'app1.views.activate')其中“激活”是 App1/views.py 中的一个函数。我换了'App1.views.activate''MyProject.app1.views.activate'它工作正常。我在控制台中只有一行 print __name__ .我想我只有一行,因为 'disable_existing_loggers': True,但我无法解释的是,这个解决方案使我的 views.py 只解析一次而不是两次。为确保这一点,我添加了 print "blabla"在文件的开头。在第一种情况下,他打印了两次,在第二种情况下只打印了一次。

最佳答案

公平警告:我不确定这是否正确,我的一些内容基于我很久以前读过的东西,但现在在 google 中找不到。

您所看到的是 python 导入机制如何工作的副作用。当一个模块被导入时,它被放入 sys.modules ,但是,如果可以在两个不同的虚线路径下导入模块(在这种情况下,有或没有 MyProject),它可以导入两次,每个 __name__ 下一次。 .

根本的解决方法是确保 MyProject它不在 sys.path - 包含 MyProject 的目录应该是,但不是 MyProject本身。您可以通过启动 manage.py shell 来验证这是否已完成。并确保 import evenements失败。在 manage.py 中有一些 Django 内部结构这可能会使这变得困难 - 但我最后一次遇到这个是在 1.0 或 1.1 左右,所以它很可能已经被修复了。

这里有一个深入的讨论:

http://blog.dscpl.com.au/2010/03/improved-wsgi-script-for-use-with.html

文章很长,搜索“两个不同的名字”。

关于python - Django 日志记录项目和应用程序命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8911992/

相关文章:

python - Arduino 串行命令独立工作,但组合时没有任何反应

django - 使用 amazon redshift 将 json 数据保存到 django 模型时出现编程错误

python - 动态 ChoiceField 无法在表单中进行验证

node.js - 如何检查heroku上的错误日志? (nodejs应用程序)

java - 我怎样才能理顺我的 Tomcat 日志记录?

python - 在 python 中使类数据可继承的正确方法是什么?

python - 取消存储在网络驱动器上的大型对象

java - Java中log4j基于级别的日志记录

python - 检查函数是否在 Python 中返回 false

python - TemplateDoesNotExist 位于/accounts/upload_save/error