Django登录到控制台

ih99xse1  于 2023-04-22  发布在  Go
关注(0)|答案(3)|浏览(132)

我正在尝试设置一个将日志记录到控制台的记录器(我想要这个,因为我使用Heroku与Papertrails(Heroku的日志插件)和写入控制台的东西将显示在Papertrails中,使其可过滤和所有漂亮的Papertrail功能。
在设置中,我首先尝试了以下操作:

LOGGING = {
    'handlers' = {
        'file': {
            'level': 'DEBUG',
            'class': 'logging.FileHandler',
            'filename': 'mysite.log',
            'formatter': 'verbose'
        },
        'console':{
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
        },
    },
    (...)
    'loggers'={
        (...)
        'page_processors': {
            'handlers': ['console','file'],
            'level': 'DEBUG',
        }
    }
    (...)
}

根据Django的日志页面(对于那些不使用Mezzanine的人,page_processors是Mezzanine在打开页面时运行的;你可以把它们想象成Django的视图,但它们只做上下文,不做渲染)。
在page_processors.py上,我有

import logging
logger = logging.getLogger(__name__)

@process_for(MyPage):
def myfunc(request, Page):
    logger.info('page_processor logging test')
    print 'my page_processor print'
    (...)

当我刷新页面时,我看不到记录器,但我看到打印和文件的日志:

[02/Mar/2014 23:07:10] INFO [myApp.page_processors:13] page_progessor logging test

所以我知道逻辑是工作的。在谷歌一下之后,我发现thisthis page正好解决了这个问题。他说默认情况下,logging.StreamHandler记录到STDERR。如果我们想记录到STDOUT,你应该将关键字参数'stream'添加到logging.StreamHandler结构中,这样配置处理程序:

'handlers':{
    (...)
    'console':{
        'level': 'DEBUG',
        'class': 'logging.StreamHandler',
        'stream': sys.stdout
    },
}

结果这仍然不起作用,我没有得到任何错误或任何东西,我仍然看到打印和文件日志。只是没有控制台日志记录器。
这是怎么回事?
编辑:我试过this,没有区别。

ugmeyewa

ugmeyewa1#

我终于明白了事情是这样的。
在使用getLogger定义记录器时,需要为记录器给予一个名称,在本例中

logger = logging.getLogger(__name__)

然后,您必须定义具有该名称的日志记录器在LOGGING配置中的行为。在本例中,由于该文件位于模块内部,因此日志记录器的名称变为myApp.page_processors,而不是page_processors,所以在LOGGING字典中名为'page_processors'的日志记录器从未被调用。那么为什么对文件的日志记录工作?因为在(...)我在代码中显示了另一个名为'myApp'的日志记录器,它显然被调用,并且写入文件。
所以这个问题的解决方案就是正确地命名logger:

LOGGING = {
    # (...)
    'loggers': {
        # (...)
        'myApp.page_processors': {
            'handlers': ['console','file'],
            'level': 'DEBUG',
        }
    }
    # (...)
}
wlwcrazw

wlwcrazw2#

以下脚本:

import logging, logging.config
import sys

LOGGING = {
    'version': 1,
    'handlers': {
        'console': {
            'class': 'logging.StreamHandler',
            'stream': sys.stdout,
        }
    },
    'root': {
        'handlers': ['console'],
        'level': 'INFO'
    }
}

logging.config.dictConfig(LOGGING)
logging.info('Hello')

Hello写入sys.stdout,这可以通过将其输出通过管道传输到文件来验证。因此,您的问题可能在其他地方(或者sys.stdout可能不是您所期望的)。您可以尝试使用sys.__stdout__来查看是否有区别。

aor9mmx1

aor9mmx13#

我写这篇文章是为了像我这样容易理解的傻瓜。
在settings.py

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console': {
            'class': 'logging.StreamHandler',
        },
    },
    'loggers': {
        'app_api': {
            'handlers': ['console'],
            'level': 'INFO',
        },
    },
    }

应用程序视图中的某个位置

import logging
logger = logging.getLogger('app_api') #from LOGGING.loggers in settings.py

try:
    one = 1/0
except Exception as e:
    logger.error(e)

相关问题