当前位置: 首页 > 知识库问答 >
问题:

Python日志记录模块在“加载项”属性上引发KeyError异常

秦皓君
2023-03-14

我有一个问题,我试图在Python CGI脚本上记录一些额外的属性(用户ID和连接主机IP)。这是在RHEL5系统上的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异常只为其中一个“额外”字典项生成,并且信息被正确地登录到文件中。我尝试了删除两个额外组件的各种组合(错误只是转移到剩下的任何部分),除非完全删除额外信息,否则似乎没有什么能阻止异常被抛出。

我想我可以将信息包含在格式字符串中作为消息的一部分,但这似乎是重新发明轮子。

共有1个答案

武卓
2023-03-14

我知道这里发生了什么:

我还导入了Google的oauth2client.client模块,它也使用了日志记录模块。由于oauth2Cleint.Client模块被认为是我的页面的“子”,日志记录被传递到我的日志对象,并且由于Google模块在其调用中不包括额外的日志字典,Google模块是生成KeyError异常的项,而不是我自己的代码。目前我已经通过将额外的条目作为消息的一部分来解决这个问题,并且需要进一步深入日志模块,看看是否有更好的方法来防止Google oauth2clent.client模块日志记录与页面日志记录发生冲突。

 类似资料:
  • 问题内容: 我想知道如何实现一个全局记录器,该记录器可以用自己的设置在任何地方使用: 我目前有一个自定义记录器类: 该类在一个单独的文件中,其中包含一些格式化程序和其他内容。记录器可以完美地独立运行。 我将此模块导入我的主python文件中,并创建一个像这样的对象: 但显然,我无法从代码的其他部分访问此对象。我使用错误的方法吗?有一个更好的方法吗? 问题答案: 使用创建一个名为全球记录。 main

  • 我正在使用Python日志模块,并希望禁用由我导入的第三方模块打印的日志消息。例如,我使用的是如下所示: 当我执行logger.debug时,它会输出我的调试消息(“my Message!”),但它也会从我导入的任何模块中输出调试消息(如请求和许多其他东西)。 我只想看到我感兴趣的模块的日志消息。有没有可能让日志模块做到这一点?

  • 问题内容: 我想检查特定背景文件中的错误,但是标准错误流由前台程序控制,并且问题中文件中的错误未显示。不过,我可以使用该模块并将输出写入文件。我想知道如何使用它来记录所有异常,错误及其回溯。 问题答案: 记录程序中引发的 任何 异常可能是一个坏主意,因为Python还将异常用于正常控制流。 因此,您应该只记录 未捕获的 异常。一旦有了异常对象,就可以使用记录器的方法轻松地执行此操作。 要处理所有未

  • 问题内容: 我正在尝试用Python的日志记录模块替换临时日志记录系统。我正在使用日志记录系统在一行上输出长任务的进度信息,因此您可以在控制台中记录日志或查看它。我通过在日志记录功能上设置一个标志来完成此操作,该标志可禁止该日志消息的换行符并逐段构建该行。 所有日志记录都是从单个线程完成的,因此没有序列化问题。 使用Python的日志记录模块可以做到这一点吗?这是个好主意吗? 问题答案: 让我们从

  • 本文向大家介绍python日志记录模块实例及改进,包括了python日志记录模块实例及改进的使用技巧和注意事项,需要的朋友参考一下 python 打印对象的所有属性值: Python logger对象属性(由上述函数获取的) 部分日志无法输出 File:logger.conf File:logger.py 问题一:测试过程中,只能打印出test_logger function一条语句 问题二:明明

  • 我的目标是从多个模块进行日志记录,同时只在一个地方配置记录器--在主程序中。如本答案所示,应包括 在主程序中,然后在所有其他模块中包括 我相信这就是我在下面所做的,然而我却得到了意想不到的行为。 我所期望的是,当在中执行时,会从记录一条消息,然而,情况并非如此。这是令人困惑的,因为当在中从模块级调用记录器时,它会将消息记录到控制台,但当从内部调用时,它不会。 所以我注意到如果我移除这条线 从开始,