python日志记录-特定函数的不同级别
我试图减少python日志记录-特定函数的不同级别,python,Python,我试图减少napalm库发送到syslog的日志记录量,但也允许从代码的其他部分发送info日志。我将logging.basicConfig设置为INFO,但我希望napalm功能设置为WARNING及以上 我有这样的代码: from napalm import get_network_driver import logging import getpass logging.basicConfig( filename="/var/log/myscripts/script.lo
napalm
库发送到syslog的日志记录量,但也允许从代码的其他部分发送info
日志。我将logging.basicConfig
设置为INFO
,但我希望napalm
功能设置为WARNING
及以上
我有这样的代码:
from napalm import get_network_driver
import logging
import getpass
logging.basicConfig(
filename="/var/log/myscripts/script.log", level=logging.INFO, format="%(asctime)s %(message)s")
def napalm(device):
logging.getLogger().setLevel(logging.WARNING)
username = getpass.getuser()
driver = get_network_driver("junos")
router = driver(str(device), username, "", password="", timeout=120)
router.open()
return router
router = napalm('myrouter')
config = "hostname foobar"
router.load_merge_candidate(config=config)
show = router.compare_config()
logging.info(show)
问题是,
logging.info
输出从未写入日志文件。如果我做了logging.warning(show)
它做了,但是我希望这是info
。我希望函数为WARNING
的原因是,它在info
级别上生成了太多的其他日志记录,这只是噪音。所以尽量减少这种情况。这是《有效Python》一书中的一个好技巧。看看这是否有助于你的处境
def napalm(count):
for x in range(count):
logger.info('useless log line')
@contextmanager
def debug_logging(level):
logger = logging.getLogger()
old_level = logger.getEffectiveLevel()
logger.setLevel(level)
try:
yield
finally:
logger.setLevel(old_level)
napalm(5)
with debug_logging(logging.WARNING):
napalm(5)
napalm(5)
通过在没有参数的情况下调用
logging.getLogger()
,您当前正在检索根记录器,并且覆盖它的级别也会影响所有其他记录器。
相反,您应该检索库的记录器,并仅覆盖该特定记录器的级别
凝固汽油弹库在其\uuuu init\uuuuuuuuuupy
中执行以下操作:
logger=logging.getLogger(“凝固汽油弹”)
i、 e.库记录器的名称为“凝固汽油弹”。
因此,您应该能够通过在脚本中放入以下行来覆盖特定记录器的级别:
logging.getLogger(“凝固汽油弹”).setLevel(logging.WARNING)
一般示例:
导入日志
logging.basicConfig(level=logging.DEBUG,format=“%(levelname)s:%(message)s”)
A=logging.getLogger(“A”)
B=logging.getLogger(“B”)
A.debug(“#1从A开始打印”)
B.debug(“B中的1被打印”)
logging.getLogger(“A”).setLevel(logging.CRITICAL)
A.debug(“#来自A的2不会被打印”)#因为我们提高了级别
B.debug(“B中的2被打印”)
输出:
DEBUG: #1 from A gets printed
DEBUG: #1 from B gets printed
DEBUG: #2 from B gets printed
编辑: 因为这对您来说不太好,可能是因为这个库中有很多其他的记录器:
$ grep -R 'getLogger' .
napalm/junos/junos.py:log = logging.getLogger(__file__)
napalm/base/helpers.py:logger = logging.getLogger(__name__)
napalm/base/clitools/cl_napalm.py:logger = logging.getLogger("napalm")
napalm/base/clitools/cl_napalm_validate.py:logger = logging.getLogger("cl_napalm_validate.py")
napalm/base/clitools/cl_napalm_test.py:logger = logging.getLogger("cl_napalm_test.py")
napalm/base/clitools/cl_napalm_configure.py:logger = logging.getLogger("cl-napalm-config.py")
napalm/__init__.py:logger = logging.getLogger("napalm")
napalm/pyIOSXR/iosxr.py:logger = logging.getLogger(__name__)
napalm/iosxr/iosxr.py:logger = logging.getLogger(__name__)
然后我会求助于这样的事情(相关:):
#提高所有记录器的级别
logging.root.manager.loggerDict.items()中的记录器作为名称:
logger.setLevel(logging.WARNING)
或者,如果您只需打印各种记录器,识别出最嘈杂的记录器,并逐个使其静音,就足够了。设置日志级别是“粘性的”。为什么不在函数结束时返回到
INFO
?这是否回答了您的问题@0x5453哦,这样我就可以在函数的末尾设置logging.getLogger().setLevel(logging.INFO)
?嗯,不走运的话尝试一下。。我需要更改从凝固汽油弹中导入的内容吗?@PhillipCres你能将导入内容添加到问题中吗?我会想办法的。谢谢!我将导入添加到question@PhillipCres我已经编辑了答案,请尝试for
循环。谢谢!!原来是一个完全不同的记录器引起了所有的噪音。我能够使用logging.root.manager.loggerDict.items()
方法将该特定项设置为警告。