我有一个问题,我想在Python CGI脚本上记录一些其他属性(用户ID和连接主机IP)。这是在RHEL 5系统上的python 2.6.8下运行的。我按照以下文档来扩展基本日志记录字典中的属性:
from __future__ import print_function
import logging
import os
import sys
LOG_DIR = '/apps/log'
LOG_PAGE = re.sub(r'\/(.*)\/.*$', r'\1', os.environ['REQUEST_URI'])
#
# The log format should be
# <date stamp> <level> <remote user> <remote IP>: <message>
#
LOG_FORMAT = '%(asctime)-19s %(levelname)-9s %(user)-7s %(clientip)-15s - %(message)s'
LOG_DATE = '%Y-%m-%d %H:%M:%S'
orig_user = os.environ['REMOTE_USER']
orig_ip = os.environ['REMOTE_ADDR']
xtras = { 'user': orig_user, 'clientip': orig_ip }
#
# Set up logging
#
LOG_FILE = LOG_DIR + '/' + LOG_PAGE
logging.basicConfig(format=LOG_FORMAT, datefmt=LOG_DATE, level=logging.DEBUG, filename=LOG_FILE)
logit = logging.getLogger('groups')
我打电话给:
logit.debug('user visited page',extra=xtras)
logit.warn('user has no account under domain %s', myDOM, extra=xtras)
每次记录消息时,Web服务器错误日志中都会记录3个KeyError异常:
s = self._fmt % record.__dict__, referer: https://its-serv-dev.case.edu/googlegroups/index.cgi
KeyError: 'user', referer: https://its-serv-dev.case.edu/googlegroups/index.cgi
Traceback (most recent call last):, referer: https://its-serv-dev.case.edu/googlegroups/index.cgi
File "/usr/lib64/python2.6/logging/__init__.py", line 776, in emit, referer: https://its-serv-dev.case.edu/googlegroups/index.cgi
msg = self.format(record), referer: https://its-serv-dev.case.edu/googlegroups/index.cgi
File "/usr/lib64/python2.6/logging/__init__.py", line 654, in format, referer: https://its-serv-dev.case.edu/googlegroups/index.cgi
return fmt.format(record), referer: https://its-serv-dev.case.edu/googlegroups/index.cgi
File "/usr/lib64/python2.6/logging/__init__.py", line 439, in format, referer: https://its-serv-dev.case.edu/googlegroups/index.cgi
s = self._fmt % record.__dict__, referer: https://its-serv-dev.case.edu/googlegroups/index.cgi
KeyError: 'user', referer: https://its-serv-dev.case.edu/googlegroups/index.cgi
奇怪的是,KeyError异常仅为&#34; extra&#34;之一生成。字典项,并且信息正确地记录到文件中。我已经尝试了删除两个额外组件的各种组合(错误只是转移到剩下的任何组件),除非我完全删除了额外的信息,否则似乎没有任何东西可以阻止抛出异常。
我想我可以将信息作为消息的一部分包含在格式字符串中,但它似乎重新发明了轮子。
答案 0 :(得分:3)
我弄清楚这里发生了什么:
我也在导入Google的oauth2client.client模块,该模块也使用了日志记录模块。由于oauth2cleint.client模块被认为是我页面的“子”,因此日志记录被传递给我的日志对象,并且由于Google模块在其调用中不包括额外的日志字典,因此GOOGLE模块是生成KeyError的项目例外,不是我自己的代码。我暂时解决了这个问题,将额外的项目作为消息的一部分包含在内,并且需要在日志记录模块中多挖一点,看看是否有更好的方法来保留Google oauth2clent.client模块记录与页面记录冲突。
答案 1 :(得分:0)
面临类似的问题。我猜想当使用没有添加过滤器的记录器(在实例化记录器时添加额外的属性)但仍使用与这些属性对应的格式将记录传递给格式化器时会发生错误。
答案 2 :(得分:0)
通过调用logging.basicConfig
,您实际上更改了formatter
的{{1}},RootLogger
是所有Logger
的祖先。然后它将影响其他loggers
。
您可以从此github issue中获取更多详细信息。