若使用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")