首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Python模块中正确添加自定义日志记录过滤器

如何在Python模块中正确添加自定义日志记录过滤器
EN

Stack Overflow用户
提问于 2016-11-28 22:29:44
回答 2查看 655关注 0票数 0

在Python2.7.12中,我在macOS Sierra下运行以下代码片段,但得到的是KeyErrors:

代码语言:javascript
复制
import logging
from PIL import Image


class TaskAddingFilter(logging.Filter):
    def __init__(self):
        logging.Filter.__init__(self)

    def filter(self, record):
        record.args = record.args + ('task', '')


logging.basicConfig(
    filename='mylog.txt',
    format='%(asctime)-19.19s|%(task)-36s|%(levelname)s:%(name)s:%(lineno)s: %(message)s',
    level=eval('logging.%s' % 'DEBUG'))

# My attempt to "monkey-patch" PIL's logger 
for name, logger in logging.Logger.manager.loggerDict.iteritems():
    logger = logging.getLogger(name)
    if name.startswith('PIL'):
        logger.addFilter(TaskAddingFilter())

logger = logging.getLogger('demo')


def tryThis():
    with open('my_image.png', 'rb') as im:
        logger.debug('Attempting to read image size...', extra={'task': '123'})
        try:
            image = Image.open(im)
            w, h = image.size
            image.save('my_image_out.png', 'PNG')
        except IOError:
            logger.error('Processing failed!', extra={'task': '123'})
            raise Exception()


tryThis()

我得到的错误是:

代码语言:javascript
复制
Traceback (most recent call last):
  File "/usr/local/Cellar/python/2.7.12_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/logging/__init__.py", line 861, in emit
    msg = self.format(record)
  File "/usr/local/Cellar/python/2.7.12_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/logging/__init__.py", line 734, in format
    return fmt.format(record)
  File "/usr/local/Cellar/python/2.7.12_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/logging/__init__.py", line 469, in format
    s = self._fmt % record.__dict__
KeyError: 'task'
Logged from file PngImagePlugin.py, line 135

有什么想法吗?

提前谢谢。

EN

回答 2

Stack Overflow用户

发布于 2016-11-29 16:09:30

更好的解决方案是显式地添加您想要的处理程序(而不是使用basicConfig()),并将过滤器附加到它们。这样就不需要修补PIL (或任何其他)记录器,也不需要将extra传递给日志记录调用。filter方法只需要设置

代码语言:javascript
复制
record.task = 'foo'

而不是和record.args打交道。

票数 3
EN

Stack Overflow用户

发布于 2016-11-29 00:24:20

因此,对于其他感兴趣的人,我最终打开了一个issue on Pillow's repository,多亏了贡献者@wiredfool,我想出了以下解决方案:

代码语言:javascript
复制
import logging
from PIL import Image


class TaskAddingFilter(logging.Filter):
    def __init__(self):
        logging.Filter.__init__(self)

    def filter(self, record):
        record.args = record.args + ('task', '123')


logger = logging.getLogger('THEDEMO')

Image.init()

logging.basicConfig(
    filename='mylog.txt',
    format='%(asctime)-19.19s|%(task)-36s|%(levelname)s:%(name)s:%(lineno)s: %(message)s',
    level=eval('logging.%s' % 'DEBUG'))

for name, elogger in logging.Logger.manager.loggerDict.iteritems():
    elogger = logging.getLogger(name)
    if name.startswith('PIL'):
        elogger.addFilter(TaskAddingFilter())


def tryThis():
    with open('my_image.png', 'rb') as im:
        logger.debug('Attempting to read image size...', extra={'task': '123'})
        try:
            image = Image.open(im)
            w, h = image.size
            image.save('my_image_out.png', 'PNG')
            print 'all ran well'
        except IOError:
            logger.error('Processing failed!', extra={'task': 123})
            raise Exception()


tryThis()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40846698

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档