2

我正在尝试以这种方式创建自定义记录器:

文件:logger.py

import logging

class Logger(logging.getLoggerClass()):
    def warning(self, msg, *args, **kwargs):
        super(Logger, self).warning(msg, *args, **kwargs)

logging.setLoggerClass(Logger)
log = logging.getLogger('test')
handler = logging.StreamHandler()
formatter = logging.Formatter('%(pathname)s')
handler.setFormatter(formatter)
log.addHandler(handler)

文件:test.py

from logger import log

log.warning('')

输出:

$ python test.py
/home/dario/Desktop/logging_test/logger.py

预期的输出将是:

/home/dario/Desktop/logging_test/test.py

更奇怪的是,如果我评论setLoggerClass我得到的行test.py,但没有完整路径。

我究竟做错了什么?谢谢!

在 Arch Linux x86_64 上使用 Python 2.7.4 和 3.3.1 进行了测试。

4

1 回答 1

0

来自Python 文档 - 日志记录 - LogRecord 属性

%(pathname)s - 发出日志调用的源文件的完整路径名(如果可用)。

即一个logging对象(或任何子类,如Logger)被初始化的地方。
在这种情况下logging,您的实例log, 是在同一个文件中定义和初始化的test.py

如果我拆分文件可能会更清楚一些:

logger.py:(类)

import logging                                           

# This is the path `logging` gets                        
class Logger(logging.getLoggerClass()):                  
    def warning(self, msg, *args, **kwargs):             
        super(Logger, self).warning(msg, *args, **kwargs)

log.py:(具有log类型log对象的模块Logger

import logging
from logger import Logger

logging.setLoggerClass(Logger)
log = logging.getLogger('test')
handler = logging.StreamHandler()

# Not this file's path, but where class Logger
# creates a logging object with super()
formatter = logging.Formatter('%(pathname)s')
handler.setFormatter(formatter)
log.addHandler(handler)

test.py:(主要)

from log import log

log.warning('')    
于 2013-04-20T16:52:16.010 回答