Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.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/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
Python 跨模块使用相同的日志记录级别进行日志记录_Python_Logging - Fatal编程技术网

Python 跨模块使用相同的日志记录级别进行日志记录

Python 跨模块使用相同的日志记录级别进行日志记录,python,logging,Python,Logging,我对Python有些陌生,尤其是在几个文件中编写模块和函数,而不仅仅是编写原始脚本 我正在编写一个命令行应用程序,我希望有一个函数(我称之为argpconf)来解析命令行参数并相应地设置日志级别。最重要的是,我希望在这个函数中设置一次日志级别,并且在创建日志记录器时,所有模块的日志级别都相同,开销最小。此外,我希望能够在使用公共格式化程序时识别消息来自的模块: logging.Formatter("%(levelname)s : %(name)s : %(message)s") 部分基于,我创

我对Python有些陌生,尤其是在几个文件中编写模块和函数,而不仅仅是编写原始脚本

我正在编写一个命令行应用程序,我希望有一个函数(我称之为
argpconf
)来解析命令行参数并相应地设置日志级别。最重要的是,我希望在这个函数中设置一次日志级别,并且在创建日志记录器时,所有模块的日志级别都相同,开销最小。此外,我希望能够在使用公共格式化程序时识别消息来自的模块:

logging.Formatter("%(levelname)s : %(name)s : %(message)s")
部分基于,我创建了以下文件:

├── api
│   ├── __init__.py
│   └── some_functionality.py
├── cli.py
├── core
│   ├── argpconf.py
│   ├── __init__.py
│   ├── logger.py
│   └── __version__.py
├── __init__.py
└── __main__.py
core/logger.py
包含以下内容:

from logging import Formatter, Logger as _Logger, NullHandler, StreamHandler

class Logger(_Logger):
    def __init__(self, name=None):
        super(Logger, self).__init__(name or __name__.split(".")[0])
        self.addHandler(NullHandler())  # default to no output
    def start(self, level="WARN", stream=None,
              fmt="%(levelname)s : %(name)s : %(message)s"):
        handler = StreamHandler(stream)
        handler.setFormatter(Formatter(fmt))
        self.addHandler(handler)
        self.setLevel(level.upper())
    def stop(self):
        for handler in self.handlers[1:]:
            # Remove everything but the NullHandler.
            self.removeHandler(handler)

logger = Logger()
与这些问题的答案中建议的想法相比:

我非常喜欢cookiecutter模板中使用logger的方法,因为它允许您只导入logger,并且拥有一个logger对象,它的日志级别在所有模块中都是相同的。但是,我并不完全满意它,因为在我的例子中,
argpconf.py
是启动
记录器的第一个模块,因此来自所有模块的所有日志消息都将其
%(名称)替换为
core
,因为它是
argpconf.py
\uu name\uuuuuuuuuuu.split(“.”[0]


如何改进
记录器
模块,使其能够检测调用该模块的模块,并将该模块作为
%(name)s
打印日志消息,甚至打印日志消息的函数?

这种方法似乎使事情变得比需要的更复杂。我意识到这来自于您使用的cookiecutter模板,这只是我的观点,但在该模板中使用的日志记录方法并不是我认为的最佳实践。你最了解你的用例,但如果我只想

有一个函数可以解析命令行参数并相应地设置日志级别。最重要的是,我希望在这个函数中设置一次日志级别,并且在创建日志记录器时,所有模块的日志级别都相同,开销最小。此外,我希望能够在使用公共格式化程序时识别消息来自的模块

然后,最简单的方法是在主脚本中导入
argparse
logging
,处理命令行参数并相应地设置日志级别,调用
basicConfig()
(正如Brian M.Sheldon的评论中所建议的那样),然后根据命令行参数将其分派到应用程序端点。您使用的每个需要记录某些内容的模块只需要导入日志记录和logger=logging.getLogger(\uuuuu name\uuuuu)
,然后在该模块中需要的任何位置执行日志记录、调试(…)
或其他操作。如果您坚持这一点,所有模块将自动使用
basicConfig()
中设置的日志记录级别,如果您在
格式=
参数中使用
basicConfig()
中的片段
%(名称)s
,那么您将在日志消息的该位置看到完整的模块名称,作为完全限定的虚线名称(如
api.一些功能
)。这种方法在创建记录器时的开销肯定比cookiecutter模板少


更新:我将用一个示例更新。现在,只使用代码。

不会
记录日志。basicConfig(level=LOGLEVEL)
满足您的需要?我用示例代码的链接更新了我的答案(代码太多,无法内联添加到答案中).听起来不错,但我不确定我是否完全理解。你能添加一些示例代码吗?