若使用logger的类被导入而不是在主py文件中,则Python-logger未定义错误

若使用logger的类被导入而不是在主py文件中,则Python-logger未定义错误,python,class,logging,Python,Class,Logging,下面的代码将按原样从main和RequestReport类记录。它一点也不出错,main和RequestReport都记录到我的文件中。但是,我想将类RequestReport放在另一个文件中。如果我将RequestReport移动到另一个名为submod.py的文件中,并取消注释submod.py import RequestReport中的行,我将返回一个错误,即未定义记录器logger.info('info LEVEL-REQUEST THREAD')name错误:未定义名称“logger

下面的代码将按原样从
main
RequestReport
类记录。它一点也不出错,
main
RequestReport
都记录到我的文件中。但是,我想将类
RequestReport
放在另一个文件中。如果我将
RequestReport
移动到另一个名为
submod.py
的文件中,并取消注释submod.py import RequestReport中的行
,我将返回一个错误,即未定义记录器
logger.info('info LEVEL-REQUEST THREAD')name错误:未定义名称“logger”

我在
RequestReport
类中的代码要复杂得多,但对于记录器来说,该类是否存在于另一个文件中并不重要。为什么日志记录器发现导入类不如将它放在同一个文件中好

范例作品-

示例失败-


嗯。。。类中的代码需要选项卡。询问我它是否仍然不起作用。

这是因为您尚未在submod.py中定义logger对象, 导入模块时,python会运行该模块,以将其所有变量放入当前名称空间。如果要将该类移动到另一个文件中,还应该初始化该文件中的记录器配置,然后将记录器导入main.py

我的意思是:

main.py:

from threading import * # DON'T USE WILDCARD IMPORTS, IMPORT ONLY WHAT YOU NEED!
from rr import RequestReport, logger # Notice we import the class and the logger from rr

if __name__ == '__main__':
    t1 = RequestReport()
    t1.start()

    logger.info('Main')
rr.py:

from threading import * # DON'T USE WILDCARD IMPORTS, IMPORT ONLY WHAT YOU NEED!
import logging
from logging.handlers import RotatingFileHandler

logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
handler = RotatingFileHandler(
    'scratch2.log', maxBytes=10000000, backupCount=10)
logger.addHandler(handler)

class RequestReport(Thread):
    def __init__(self):

        Thread.__init__(self)
        self.reports_to_call = {}

    def run(self):
        logger.info('INFO LEVEL - REQUEST THREAD')
        print("Requst thread Started")

希望这有帮助

我修复了堆栈溢出编辑器中缺少的选项卡。那只是我在把它带进来的时候没有把所有的东西都排好。如果您查看实时代码链接,缩进是确定的,这是有意义的。然而,我仍然想知道是否有一种方法可以让记录器在main中定义,以及从main中调用的类在记录器中,即使它们位于不同的文件中?我是从main.py调用rr.py中的clas和一些新文件zz.py时会发生什么的角度来考虑这个问题的。我不明白为什么需要在main中定义记录器,即使创建一个新文件zz.py,也可以简单地导入在rr中定义的记录器,您可以在任何地方导入它。您甚至可以创建一个名为logger_configuration的新文件,在那里定义logger,并在需要时从那里导入。您是正确的。尽管这不是您编写它的方式,但我认为记录器是从rr.py文件中的类导入的,而不是从文件中导入类和记录器。
from threading import * # DON'T USE WILDCARD IMPORTS, IMPORT ONLY WHAT YOU NEED!
import logging
from logging.handlers import RotatingFileHandler

logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
handler = RotatingFileHandler(
    'scratch2.log', maxBytes=10000000, backupCount=10)
logger.addHandler(handler)

class RequestReport(Thread):
    def __init__(self):

        Thread.__init__(self)
        self.reports_to_call = {}

    def run(self):
        logger.info('INFO LEVEL - REQUEST THREAD')
        print("Requst thread Started")