Skip to main content
 首页 » 编程设计

python之Django 日志记录不适用于 django shell

2025年01月19日24linjiqin

我在我的 Django 应用程序中设置了日志记录以记录到标准输出和文件。

当我正常运行我的 django 应用程序 (./manage.py runserver) 时,日志会按预期更新。这是一个在我访问以下 View 的 url 时成功记录的示例:

# views.py 
 
import logging 
logger = logging.getLogger('mylogger') 
 
def test(request): 
    logger.error("test") 

但是,当我运行 ./manage.py shell 并运行以下命令时,日志没有更新:

import logging 
logger = logging.getLogger('mylogger') 
logger.error('test') 

这是我在 settings.py 中的日志记录设置:

LOGGING = { 
    'version': 1, 
    'disable_existing_loggers': False, 
    'filters': { 
    }, 
    'handlers': { 
        'console': { 
            'level': 'INFO', 
            'class': 'logging.StreamHandler', 
            'stream': sys.stdout, 
        }, 
        'file': { 
            'level': 'DEBUG', 
            'class': 'logging.FileHandler', 
            'filename': '../debug.log', 
        }, 
    }, 
    'loggers': { 
        'mylogger': { 
            'handlers': ['console', 'file'], 
            'level': 'INFO', 
            'propagate': True, 
        }, 
    } 
} 

我是否必须做一些额外的事情才能让日志记录在 shell 中工作?

请您参考如下方法:

它在 shell 中应该可以正常工作。它适用于我,使用与您相同的日志记录配置(除了我使用 'ext:://sys.stdout' 而不是 sys.stdout,因为我没有没有在 settings.py 中导入 sys。

django20 vinay@ubuntu:/tmp/foo$ tail -25 foo/settings.py  
LOGGING = { 
    'version': 1, 
    'disable_existing_loggers': False, 
    'filters': { 
    }, 
    'handlers': { 
        'console': { 
            'level': 'INFO', 
            'class': 'logging.StreamHandler', 
            'stream': 'ext://sys.stdout', 
        }, 
        'file': { 
            'level': 'DEBUG', 
            'class': 'logging.FileHandler', 
            'filename': '../debug.log', 
        }, 
    }, 
    'loggers': { 
        'mylogger': { 
            'handlers': ['console', 'file'], 
            'level': 'INFO', 
            'propagate': True, 
        }, 
    } 
} 
 
django20 vinay@ubuntu:/tmp/foo$ python manage.py shell 
Python 3.5.2 (default, Nov 23 2017, 16:37:01)  
[GCC 5.4.0 20160609] on linux 
Type "help", "copyright", "credits" or "license" for more information. 
(InteractiveConsole) 
>>> import logging; logger = logging.getLogger('mylogger') 
>>> logger.error('foo') 
foo 
>>> logger.warning('bar') 
bar 
>>> logger.info('baz') 
baz 
>>> logger.debug('boz') 
>>>  
 
django20 vinay@ubuntu:/tmp/foo$ more ../debug.log  
foo 
bar 
baz 

这是使用全新的 virtualenv 和 Django 2.0 安装,但它应该与旧版本的 Django 完全相同。