Python 使用继承设置多文件日志记录
我正在使用模块(Python3.6)设置我的第一个多文件项目,在设置一致的日志方式时遇到了一些问题。我希望我的整个项目在所有模块中都具有相同的日志记录级别,并且知道子日志记录者继承其父日志记录者的属性。因此,当我的2个文件设置如下: main.py:Python 使用继承设置多文件日志记录,python,python-3.x,Python,Python 3.x,我正在使用模块(Python3.6)设置我的第一个多文件项目,在设置一致的日志方式时遇到了一些问题。我希望我的整个项目在所有模块中都具有相同的日志记录级别,并且知道子日志记录者继承其父日志记录者的属性。因此,当我的2个文件设置如下: main.py: import logging logger = logging.getLogger('a') logger.setLevel(logging.DEBUG) ch = logging.StreamHandler() ch.setLevel(logg
import logging
logger = logging.getLogger('a')
logger.setLevel(logging.DEBUG)
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
logger.addHandler(ch)
import GUI
GUI.hello()
GUI/\uuuuu init\uuuuuuuuuuuupy
:
import logging
module_logger = logging.getLogger('a.GUI')
module_logger.info(__name__ + ' imported')
def hello():
module_logger.info('hello')
我明白了
正如所料。但是,当我在根目录和模块中用记录器名称替换\uuuuu name\uuuu
时,(在这两种情况下,logging.getLogger(\uu name\uuu)
),我都没有得到任何输出。我正试图这样做,以避免在发生变化时不得不重构等。我错过了什么?或者,是否有更好的方法来设置日志记录,使其更具可伸缩性等
非常感谢你的帮助
编辑:我已经看到了,这是可行的,但是如果可能的话,我希望有更多的粒度,比如为记录器定制名称等等。如果不可能,我可以使用它。如果所有python模块都使用完全相同的记录器,我强烈建议直接使用“logging.info('blablabla'))'而不是为每个python文件创建多个记录器。那将最符合你的目的。
Florent执行的文件的
\uuuuu name\uuuuuuuu
始终是“\uuuuuu main\uuuuu”
。因此,按名称设置记录器将不会使其成为其余模块的根。在您的情况下,您有以下记录器:
"__main__" # from main.py
"GUI" # from GUI/__init__.py
"GUI.bar" # from GUI/bar.py (hypothetically)
此外,您可能希望以后添加更多的包,如GUI
——这些包将形成更多的层次结构
那么,如何解决这个问题呢
- 在
main
- 使用名称
或None
为您提供所有其他文件的根记录器。其设置由所有其他设置继承。虽然库不应该配置根记录器,但应用程序应该配置根记录器“
如果您的模块实际上是一个库,并且您的# main.py logger = logging.getLogger()
只是使用它的一个可执行文件,那么这是最好的main
- 使用名称
- 固定名称记录器
- 与现在一样,显式设置记录器名称。这还有一个额外的好处,就是将记录器与实现细节分离
# main.py logger = logging.getLogger('a')
- 与现在一样,显式设置记录器名称。这还有一个额外的好处,就是将记录器与实现细节分离
- 基于包的记录器
- 如果您将所有模块重新组织到一个包中,则可以使用
名称\uuuuuuuuuuuuu
注意,# package/main.py logger = logging.getLogger(__package__) # 'package' # package/GUI/__init__.py logger = logging.getLogger(__package__) # 'package.GUI'
应该被称为main.py
python-m main
- 如果您将所有模块重新组织到一个包中,则可以使用
- 基于目的的记录器
- 使用适合功能的名称,而不是位置。请注意,您可以多次使用相同的名称/记录器
# GUI/__init__.py input_logger = logging.getLogger('a.input') output_logger = logging.getLogger('a.output') # GUI/buttons.py input_logger = logging.getLogger('a.input')
- 使用适合功能的名称,而不是位置。请注意,您可以多次使用相同的名称/记录器
# GUI/__init__.py
input_logger = logging.getLogger('a.input')
output_logger = logging.getLogger('a.output')
# GUI/buttons.py
input_logger = logging.getLogger('a.input')