我试图从主流和子模块中登录到同一个文件:
/proxy
/proxy/proxy/network.py
/proxy/proxy.py
network.py:
import logging
print __name__
...
logging.getLogger(__name__).warning("test warn")
proxy.py:
import logging
print __name__
logging.basicConfig(filename="console", format="%(message)s", disable_existing_loggers=False)
logging.warning("test main")
然后我看到登录proxy.py有效,而在network.py中则没有,显然是因为他们的名称是:
proxy.network
__main__
respecitvely。
如果我把它们放在同一个文件夹中,它们的名字就像:
network
__main__
也不会起作用。看起来我必须告诉我,我的项目根目录相对于proxy.py(无论在哪里)都是一级,在这种情况下,它们都会有名称" proxy。*"。
如何将项目根文件夹指向解释器? 如何统一其模块结构名称,以启用日志记录(在任一模块结构中)?
答案 0 :(得分:1)
将所有日志信息保存到同一文件的最简单方法是,不要在getLogger()中提供参数[而不是现在使用的参数,getLogger(名称)]
但请记住,如果您正在使用其他一些使用日志记录的模块(在您的项目之外,某些第三方可能会像httplib一样),他们最终可能会使用这种方法将数据保存在您的日志文件中
答案 1 :(得分:1)
编辑:这是访问与整个包相关的文件名:
filepath = __file__ if __name__ == '__main__' else __name__
对于以下结构,它给出:
mypack
├── __main__.py # -> mypack.__main__
└── sub
├── __init__.py
└── sub.py # -> mypack.sub.sub
这是一个片段:
def logger(name=None, root_name=PACKAGE_NAME):
if name:
return logging.getLogger(root_name + '.' + name)
else:
return logging.getLogger(root_name)
我通常在commons.py
或utils.py
中定义此功能,由我的包的所有模块导入。
利用子记录器系统,这允许程序包使用程序包的主日志记录:
import utils
logger = utils.logger()
logger.info('module xxx started')
或专门针对特定概念的子记录:
import utils
logger = utils.logger('vm')
logger.info('module vm.xxx started')
文件路径和日志记录配置现在已解耦并明确绑定。 哪个可以自动化每个模块:
import utils
logger = utils.logger(__file__)
logger.info('module ' + __file__ + ' started')
由于子记录器系统,记录器' pk.vm'将(默认情况下)继承为' pk'配置,也就是说使用相同的处理程序,从而写入相同的日志文件。 但是,为任何子记录器定义某些特定行为或处理程序可能很有用:
logging.config.dictConfig({
'version': 1,
'disable_existing_loggers': True,
'formatters': {
'verbose': {
'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s',
},
'simple': {
'format': '%(levelname)s %(message)s',
},
},
'handlers': {
'console':{
'level':LOG_LEVEL,
'class':'logging.StreamHandler',
'formatter': 'simple',
},
'logfile': {
'level': LOG_LEVEL,
'class': 'logging.handlers.RotatingFileHandler',
'filename': DIR_LOGS + LOGGER_NAME + '.log',
'mode': 'w',
'maxBytes': LOGFILE_MAX_SIZE,
'formatter': 'verbose',
},
'logfile' + SUBLOGGER_SEPARATOR + SUBLOGGER_VM: {
'level': LOG_LEVEL,
'class': 'logging.handlers.RotatingFileHandler',
'filename': DIR_LOGS + LOGGER_NAME + '.' + SUBLOGGER_VM + '.log',
'mode': 'w',
'maxBytes': LOGFILE_MAX_SIZE,
'formatter': 'verbose',
},
},
'loggers': {
PACKAGE_NAME: {
'handlers':['console', 'logfile'],
'propagate': True,
'level':LOG_LEVEL,
},
PACKAGE_NAME + SUBLOGGER_SEPARATOR + SUBLOGGER_VM: {
'handlers':['logfile' + SUBLOGGER_SEPARATOR + SUBLOGGER_VM],
'level':LOG_LEVEL,
},
}
})