Django使用FileHandler进行日志记录无法工作

6

我在Django项目中使用以下日志设置(也使用了Sentry/Raven)。Sentry/Raven部分工作正常,但文件记录不起作用。一个空的日志文件被创建出来,但每当我使用logging.info('foo')时,日志文件中没有任何内容(即它保持为空)。有什么建议吗?

LOGGING = {
    'version': 1,
    'disable_existing_loggers': True,
    'root': {
        'level': 'WARNING',
        'handlers': ['sentry'],
    },
    'formatters': {
        'verbose': {
            'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s'
        },
    },
    'handlers': {
        'sentry': {
            'level': 'ERROR',
            'class': 'raven.contrib.django.handlers.SentryHandler',
        },
        'file': {
            'level': 'INFO',
            'class': 'logging.FileHandler',
            'filename': '/var/log/django/breeding.log',
        },
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
            'formatter': 'verbose'
        }
    },
    'loggers': {
        'django.db.backends': {
            'level': 'ERROR',
            'handlers': ['console'],
            'propagate': False,
        },
        'raven': {
            'level': 'DEBUG',
            'handlers': ['console'],
            'propagate': False,
        },
        'sentry.errors': {
            'level': 'DEBUG',
            'handlers': ['console'],
            'propagate': False,
        },
    },
}

有人想发布解决方案吗? - Stavros Korokithakis
1
@Colleen请发布解决方案! - blinduck
3
哦,天哪,我非常抱歉。我大约一年半前发布了那条评论,现在已经不记得自己当时弄清楚了什么。 - Colleen
2
哦,蝙蝠侠!又来了 https://xkcd.com/979/ - tutuca
对于那些可能会尝试使用“django.request”记录器来记录WSGI调试打印的人,请注意它不起作用。打印直接发送到stderr,日志系统不用于此。您必须找到另一种方法来获取Django服务器显示的漂亮的“[02/Oct/2015 13:31:22]“GET /assign/?locationTagUID=15 HTTP/1.1”400 36”的消息。 - Berthier Lemieux
显示剩余2条评论
3个回答

2

这是一个快速回答


更详细的内容:

在Django日志设置中,请按照以下脚本进行操作:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': True,
    'formatters': {
        'verbose': {
            'format': '%(levelname)3.3s %(asctime)22.22s [%(name)s:%(funcName)s] {%(process)d} %(message)s'
        }
    },
    'handlers': {
        'sentry-warn': {
            'level': 'WARNING',
            'class': 'raven.contrib.django.raven_compat.handlers.SentryHandler',
        },
        'sentry-info': {
            'level': 'INFO',
            'class': 'raven.contrib.django.raven_compat.handlers.SentryHandler',
        },
        'sentry-error': {
            'level': 'ERROR',
            'class': 'raven.contrib.django.raven_compat.handlers.SentryHandler',
        },
        'console': {
            'level': 'WARNING',
            'class': 'logging.StreamHandler',
            'formatter': 'verbose'
        },
        'mail_admins': {
            'level': 'ERROR',
            'class': 'django.utils.log.AdminEmailHandler',
        }
    },
    'loggers': {
        'sentry': {
            'level': 'DEBUG',
            'handlers': ['sentry-warn', 'console', 'file', 'sentry-info', 'sentry-error'],
            'propagate': False,
        },
        'sentry-warn': {
            'level': 'DEBUG',
            'handlers': ['sentry-warn', 'console', 'file'],
            'propagate': False,
        },
        'sentry-error': {
            'level': 'DEBUG',
            'handlers': ['console', 'file', 'sentry-error'],
            'propagate': False,
        },
        'sentry-info': {
            'level': 'DEBUG',
            'handlers': ['console', 'file', 'sentry-info'],
            'propagate': False,
        },
        'django': {
            'handlers': ['console', 'file', 'mail_admins'],
            'propagate': False,
        },
    },
    'root': {
        'handlers': ['console', 'file', 'mail_admins'],
        'level': 'INFO'
    },
}

测试:

from logging import getLogger

logger = getLogger('sentry')
log_war = getLogger('sentry-warn')
log_inf = getLogger('sentry-info')
log_err = getLogger('sentry-error')

logger.warning('warn')
logger.info('info')
logger.error('error')

log_err.error('new error') 
log_war.warning('new warn')  
log_inf.info('new info')  

2
我遇到了同样的问题,原因是权限不足。在配置日志后第一次运行开发服务器时,它创建了文件/var/log/django/request.log,所有者为我的本地用户(stretch),模式为644。
当我启动“生产”服务器(nginx/uwsgi)时,服务将作为www-data用户运行,并无法打开/var/log/django/request.log进行写操作。简单地删除日志文件并重新启动uwsgi就足以解决问题,但我需要想出一个更优雅的长期解决方案。

1
为了使其正常工作,您需要将“file”处理程序添加到每个记录器中,如下所示:
'loggers': {
    'django.db.backends': {
        'level': 'ERROR',
        'handlers': ['file','console'],
        'propagate': False,
    },
    'raven': {
        'level': 'DEBUG',
        'handlers': ['file','console'],
        'propagate': False,
    },
    'sentry.errors': {
        'level': 'DEBUG',
        'handlers': ['file','console'],
        'propagate': False,
    },
},

否则,记录器将不会向指定的文件写入任何内容。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接