有多种方法可以实现您想要的目标。例如,一种方法是为您的处理程序创建自定义初始化程序:
import os
import yaml
def logmaker():
path = os.path.dirname(os.path.realpath(__file__))
path = os.path.join(path, 'bot.log')
return logging.FileHandler(path)
def main():
# The file's path
path = os.path.dirname(os.path.realpath(__file__))
# Config file relative to this file
loggingConf = open('{0}/logging.yml'.format(path), 'r')
logging.config.dictConfig(yaml.load(loggingConf))
loggingConf.close()
logger = logging.getLogger('cloaked_chatter')
logger.debug('Hello, world!')
if __name__ == '__main__':
main()
请注意,我移动了logging.yml
与脚本相邻。这logmaker
是自定义初始化程序。在 YAML 中指定如下:
version: 1
formatters:
default:
format: '%(asctime)s %(levelname)s %(name)s %(message)s'
handlers:
console:
class: logging.StreamHandler
level: DEBUG
formatter: default
stream: ext://sys.stdout
file:
() : __main__.logmaker
formatter: default
loggers:
cloaked_chatter:
level: DEBUG
handlers: [console, file]
propagate: no
如果运行 Python 脚本,您应该会发现bot.log
是在脚本和 YAML 文件旁边创建的。相同的消息被打印到控制台并且bot.log
:
2013-04-16 11:08:11,178 DEBUG cloaked_chatter Hello, world!
注意:脚本可能会更简洁一些,但它说明了我的观点。
Update: As per 文档 http://docs.python.org/2/library/logging.config.html#user-defined-objects, 指某东西的用途()
作为字典中的键表明该值是可调用的,本质上是处理程序的自定义构造函数。