我有两个文件:script.py
和functions.py
。在functions.py
中,我有记录器设置和一组功能(由下面组成):
class ecosystem():
def __init__(self, environment, mode):
self.logger = logging.getLogger(__name__)
if os.path.exists('log.log'):
os.remove('log.log')
handler= logging.FileHandler('log.log')
if mode.lower()== 'info':
handler.setLevel(logging.INFO)
self.logger.setLevel(logging.INFO)
elif mode.lower()== 'warning':
handler.setLevel(logging.WARNING)
self.logger.setLevel(logging.WARNING)
elif mode.lower()== 'error':
handler.setLevel(logging.ERROR)
self.logger.setLevel(logging.ERROR)
elif mode.lower()== 'critical':
handler.setLevel(logging.CRITICAL)
self.logger.setLevel(logging.CRITICAL)
else:
handler.setLevel(logging.DEBUG)
self.logger.setLevel(logging.DEBUG)
#Logging file format
formatter = logging.Formatter(' %(levelname)s | %(asctime)s | %(message)s \n')
handler.setFormatter(formatter)
#Add the handler to the logger
self.logger.addHandler(handler)
self.logger.info('Logging starts here')
def my_function():
self.logger.debug('test log'))
return True
我正在尝试从ecosystem.my_function
拨打script.py
,但是当我这样做时,logger.debug
消息会显示在终端窗口AND log.log
中。任何想法为什么会这样?
如果有帮助,我还会将其他模块导入functions.py
,如果这些模块也导入日志记录,可能会导致问题吗?
答案 0 :(得分:1)
看起来您正在使用log.log
类__init__
方法中的ecosystem
文件初始化记录器。这意味着创建ecosystem
对象的任何代码都将初始化记录器。在代码的某处,在一个文件中,您正在创建该对象,因此初始化记录器并写入该文件。
请注意,您不需要自己调用__init__
,因为它是在创建对象时调用的。即。在这次电话会议之后
my_obj = ecosystem()
将写入日志文件。
您问为什么在附加新文件处理程序后使用stderr和文件。这是因为传播属性。默认情况下,传播为True,这意味着您的日志将冒出记录器的层次结构,每个记录器将继续处理它。由于默认根记录器位于层次结构的顶部,因此它也将处理您的日志。将propagate
设为False可解决此问题:
self.logger.propagate = False
您可能想在logging上稍微阅读一下。此外,如果您想保持关于记录的理智,check how you can use dict to configure logging。