Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python模块结构和日志记录_Python_Logging_Module - Fatal编程技术网

Python模块结构和日志记录

Python模块结构和日志记录,python,logging,module,Python,Logging,Module,我正在尝试从主流和子模块登录到同一个文件: /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", for

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

/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")
然后我看到logging in proxy.py起作用,而in network.py不起作用,显然是因为它们的名称是:

proxy.network
__main__
分别地

如果我把它们放在同一个文件夹中,它们的名称会是:

network
__main__
这也行不通。看起来我不得不告诉大家,我的项目根目录相对于proxy.py(无论它在哪里)有一个级别,在这种情况下,它们的名称都是“proxy.*”

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

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


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

将所有日志信息保存到同一文件的最简单方法是,不要在getLogger()中提供参数[使用getLogger(name)代替您现在使用的内容]


但是请记住,如果您使用的是使用日志记录的其他模块(在您的项目之外,可能是某些第三方,如httplib),他们可能最终会使用这种方法将数据保存在日志文件中。编辑:以下是对与整个包相关的文件名的访问:

filepath = __file__ if __name__ == '__main__' else __name__
import utils
logger = utils.logger()
logger.info('module xxx started')
对于以下结构,它给出:

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
中定义此函数,该函数由包中的所有模块导入

利用子日志记录系统,这允许包使用包的主日志记录:

filepath = __file__ if __name__ == '__main__' else __name__
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,
        },
    }
})

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

filepath = __file__ if __name__ == '__main__' else __name__
import utils
logger = utils.logger()
logger.info('module xxx started')
对于以下结构,它给出:

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
中定义此函数,该函数由包中的所有模块导入

利用子日志记录系统,这允许包使用包的主日志记录:

filepath = __file__ if __name__ == '__main__' else __name__
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,
        },
    }
})

应该可以,但是关于反映模块结构的名称用法,您能说些什么呢?在不同的回答/手册中,他们总是说“文件network.py位于相对于proxy.py(main.py)的子模块中”但是,如果其中一个文件位于顶层,我无法意识到如何利用它。据我所知,这需要模块知道它在包体系结构中的位置。这可能不是一个好的解决方案。我编辑了我的答案:_name_uu和_file_u可用于检索体系结构中的文件位置。应该可以,但你能做些什么ay关于反映模块结构的名称用法?在不同的回答/手册中,他们总是说“文件network.py位于相对于proxy.py(main.py)的子模块中”但是,如果其中一个文件位于顶层,我无法意识到如何利用它。据我所知,这需要模块知道它在包体系结构中的位置。这可能不是一个好的解决方案。我编辑了我的答案:_name_uu和_file_u可用于检索体系结构中的文件位置。