繁体   English   中英

Python模块结构和日志记录

[英]Python module structure and logging

我正在尝试从主流和子模块登录到同一文件:

/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__

分别地。

如果将它们放在同一文件夹中,它们的名称将像:

network
__main__

这也行不通。 看来我必须以某种方式告诉我,我的项目根目录相对于proxy.py(无论在哪里)都高一个级别,在这种情况下,它们的名称都为“ proxy。*”。

如何将项目根文件夹指向解释器? 如何统一其模块结构名称,以启用日志记录(在任一模块结构中)?

将所有日志记录信息保存到相同文件的最简单方法是,不要在getLogger()中提供参数[而不是现在使用的参数,getLogger( name )]

但是请记住,如果您正在使用其他一些使用日志记录的模块(在项目外部,则可能是第三方,例如httplib),则最终可能会通过这种方法将数据保存到日志文件中

编辑:这是对与整个软件包相关的文件名的访问:

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.pyutils.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,
        },
    }
})

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM