这里提到这个问题:LINK我如何设置一个配置,它只会记录我的根脚本和我自己的子脚本?链接的问题要求禁用所有导入的模块,但这不是我的意图。
我的根目录设置:
import logging
from exchangehandler import send_mail
log_wp = logging.getLogger(__name__)
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s - %(levelname)s [%(filename)s]: %(name)s %(funcName)20s - Message: %(message)s',
datefmt='%d.%m.%Y %H:%M:%S',
filename='C:/log/myapp.log',
filemode='a')
handler = logging.StreamHandler()
log_wp.addHandler(handler)
log_wp.debug('This is from root')
send_mail('address@eg.com', 'Request', 'Hi there')
我的子模块exchangehandler.py:
import logging
log_wp = logging.getLogger(__name__)
def send_mail(mail_to,mail_subject,mail_body, mail_attachment=None):
log_wp.debug('Hey this is from exchangehandler.py!')
m.send_and_save()
我的应用程序。日志:
16.07.2018 10:27:40 - DEBUG [test_script.py]: __main__ <module> - Message: This is from root
16.07.2018 10:28:02 - DEBUG [exchangehandler.py]: exchangehandler send_mail - Message: Hey this is from exchangehandler.py!
16.07.2018 10:28:02 - DEBUG [folders.py]: exchangelib.folders get_default_folder - Message: Testing default <class 'exchangelib.folders.SentItems'> folder with GetFolder
16.07.2018 10:28:02 - DEBUG [services.py]: exchangelib.services get_payload - Message: Getting folder ArchiveDeletedItems (archivedeleteditems)
16.07.2018 10:28:02 - DEBUG [services.py]: exchangelib.services get_payload - Message: Getting folder ArchiveInbox (archiveinbox)
我的问题是,日志文件还包含exchangehandler中导入的exchangelib模块的大量信息。皮耶。要么导入的exchangelib模块配置不正确,要么我犯了错误。那么,如何将日志输出仅减少到日志消息?
编辑:一个exChangelib模块的folder.py的摘录。这不是我写的任何东西:
import logging
log = logging.getLogger(__name__)
def get_default_folder(self, folder_cls):
try:
# Get the default folder
log.debug('Testing default %s folder with GetFolder', folder_cls)
# Use cached instance if available
for f in self._folders_map.values():
if isinstance(f, folder_cls) and f.has_distinguished_name:
return f
return folder_cls.get_distinguished(account=self.account)
在日志记录方面,导入的exchangelib模块根本没有配置。您正在通过调用日志隐式地配置它。主模块中的basicConfig()
。
exChangelib确实为它们创建记录器和日志,但是默认情况下,这些记录器没有附加处理程序和格式化程序,所以它们不会执行任何可见的操作。它们所做的是向上传播到根记录器,默认情况下,根记录器也没有附加处理程序和格式化程序。
通过调用日志记录。basicConfig
在主模块中,实际上是将处理程序附加到根记录器。您自己所需的记录器会传播到根记录器,因此消息会写入处理程序,但从那时起,exchangelib记录器也是如此。
这里至少有两种选择。您可以显式配置“您的”命名记录器:
主模块
import logging
log_wp = logging.getLogger(__name__) # or pass an explicit name here, e.g. "mylogger"
hdlr = logging.StreamHandler()
fhdlr = logging.FileHandler("myapp.log")
log_wp.addHandler(hdlr)
log_wp.addHandler(fhdlr)
log_wp.setLevel(logging.DEBUG)
上面就很简化了。要显式配置多个命名记录器,请参阅logging.configHowTo
如果您想坚持只使用根记录器(通过basicConfig()
配置),还可以在导入exchangelib并创建这些记录器后显式禁用不需要的记录器:
logging.getLogger("exchangelib.folders").disabled = True
logging.getLogger("exchangelib.services").disabled = True
如果您不知道要禁用的记录器的名称,logging
有一个包含所有已知记录器的字典。因此,您可以临时执行此操作以查看程序创建的所有记录器:
# e.g. after the line 'log_wp.addHandler(handler)'
print([k for k in logging.Logger.manager.loggerDict])
使用dict也可以让你做这样的事情:
for v in logging.Logger.manager.loggerDict.values():
if v.name.startswith('exchangelib'):
v.disabled = True