1

我正在使用 Django 1.4.1。tmp.py在与 相同的目录中有一个脚本manage.py,它执行一些常规操作,并从 cron 启动,命令如下python /path/to/project/tmp.py

这里是tmp.py

import os
if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "MYPROJECT.settings")

if __name__ == "__main__":
    import logging
    logger = logging.getLogger('parser.test')
    logger.info('Hello, world')

这个脚本创建了一个日志条目,但是这个条目只是被 logger 忽略了。当我将相同的 3 行放入我的任何视图中时,日志条目会按预期出现在我的日志文件中。

记录器配置来自setings.py

LOGGING = {
    'version': 1,
    'disable_existing_loggers': True,
    'formatters': {
        'standard': {
            'format' : "[%(asctime)s] %(levelname)s [%(name)s:%(lineno)s] %(message)s",
            'datefmt' : "%d/%b/%Y %H:%M:%S"
        },
    },
    'handlers': {
        'null': {
            'level':'DEBUG',
            'class':'django.utils.log.NullHandler',
        },
        'logfile': {
            'level':'DEBUG',
            'class':'logging.handlers.RotatingFileHandler',
            'filename': "/hosting/MYPROJECTS/logs/logfile",
            'maxBytes': 50000,
            'backupCount': 2,
            'formatter': 'standard',
        },
        'console':{
            'level':'DEBUG',
            'class':'logging.StreamHandler',
            'formatter': 'standard'
        },
    },
    'loggers': {
        'django': {
            'handlers':['console'],
            'propagate': True,
            'level':'WARN',
        },
        'django.db.backends': {
            'handlers': ['console'],
            'level': 'DEBUG',
            'propagate': False,
        },
        'parser': {
            'handlers': ['console', 'logfile'],
            'level': 'DEBUG',
        },
    }
}

为什么这个记录器只在视图中工作?os.environ.setdefault("DJANGO_SETTINGS_MODULE", "MYPROJECT.settings")也许记录器在我之后仍未配置tmp.py

4

2 回答 2

1

我无法解决这个问题,但我找到了替代解决方案:在 manage.py https://docs.djangoproject.com/en/dev/howto/custom-management-commands/附近编写一个自定义管理命令而不是单独的脚本 它记录在管理命令中工作正常。

于 2013-03-26T08:14:23.100 回答
0

我设法让 Django 日志记录设置适用于我的非 Django 脚本。

首先,让我们定位到 Django 目录:<myproject>/<src>/<myproject>/settings.py&<myproject>/<src>/manage.py

# FILE: <myproject>/<src>/scripts/save_report_2_mongo.py
[...]
import logging
logger = logging.getLogger(__name__)
[...]

在我的脚本顶部,我导入了日志记录。然后我创建日志记录对象。就我而言__name__ == scripts.save_report_2_mongo。如果 OP 的设置在我附近的任何地方,那么通过这个示例名称!=“ main ”,并且永远不会实例化记录器。正确的?

最后,里面settings.py

# FILE: <myproject>/<src>/<myproject>/settings.py
[...]
LOGGING = {
    [...]
    'formatters' : {...},
    'handlers' : {...},
    'loggers': {
       'django': {
           'handlers': ['console', 'fileInfo', 'fileDebug'],
           'level': 'DEBUG',
           'propagate': True,
       },
       'scripts.save_report_2_mongo': {
           'handlers': ['sr2m_handler'],
           'level': 'DEBUG',
       },
    }

我相信这很有效,因为 Python 文档中的这段话:docs.python.org > Logging HOWTO > Advanced Logging Tutorial

高级日志教程

日志库采用模块化方法并提供几类组件:记录器、处理程序、过滤器和格式化程序。

  • 记录器公开应用程序代码直接使用的接口。

    [...]

记录是通过调用 Logger 类(以下称为记录器)实例上的方法来执行的。每个实例都有一个名称,它们在概念上使用点(句点)作为分隔符排列在命名空间层次结构中。例如,名为“scan”的记录器是记录器“scan.text”、“scan.html”和“scan.pdf”的父级。记录器名称可以是您想要的任何名称,并指示记录消息源自的应用程序区域。

命名记录器时使用的一个很好的约定是在每个使用记录的模块中使用模块级记录器,命名如下:

logger = logging.getLogger(__name__)

这意味着记录器名称跟踪包/模块层次结构,并且仅从记录器名称记录事件的位置很直观。

我的重点——记录器名称跟踪包/模块层次结构__name__在这种情况下,我在脚本中获取了 的值,然后在settings.py.

于 2021-03-05T22:23:47.663 回答