Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/339.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_Python 3.x - Fatal编程技术网

Python 使用继承设置多文件日志记录

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

我正在使用模块(Python3.6)设置我的第一个多文件项目,在设置一致的日志方式时遇到了一些问题。我希望我的整个项目在所有模块中都具有相同的日志记录级别,并且知道子日志记录者继承其父日志记录者的属性。因此,当我的2个文件设置如下:

main.py:

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')