python日志记录-特定功能的不同级别

时间:2021-01-29 16:43:15

标签: 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.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 级别生成了很多其他日志记录,这只是噪音。所以试图减少这种情况。

2 个答案:

答案 0 :(得分:1)

《Effective 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)

答案 1 :(得分:0)

通过不带参数调用 logging.getLogger(),您当前正在检索根记录器,并且覆盖它的级别也会影响所有其他记录器。 您应该改为检索库的记录器并仅针对该特定记录器覆盖级别。

napalm 库在其 __init__.py 中执行以下操作:

logger = logging.getLogger("napalm")

即图书馆记录器的名字是“凝固汽油弹”。 因此,您应该能够通过在脚本中添加以下行来覆盖该特定记录器的级别:

logging.getLogger("napalm").setLevel(logging.WARNING)

通用示例:

import logging

logging.basicConfig(level=logging.DEBUG, format="%(levelname)s: %(message)s")
A = logging.getLogger("A")
B = logging.getLogger("B")

A.debug("#1 from A gets printed")
B.debug("#1 from B gets printed")

logging.getLogger("A").setLevel(logging.CRITICAL)

A.debug("#2 from A doesn't get printed")  # because we've increased the level
B.debug("#2 from B gets printed")

输出:

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__)

然后我会求助于这样的事情(相关:How to list all existing loggers using python.logging module):

# increase level for all loggers
for name, logger in logging.root.manager.loggerDict.items():
    logger.setLevel(logging.WARNING)

或者,如果您只是打印各种记录器,识别最嘈杂的记录器,然后将它们一个一个地静音,也许就足够了。