首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python日志-特定函数的不同级别

python日志-特定函数的不同级别
EN

Stack Overflow用户
提问于 2021-01-29 16:43:15
回答 2查看 560关注 0票数 1

我试图减少napalm库发送给syslog的日志数量,但也允许从代码的其他部分发送info日志。我将logging.basicConfig设置为INFO,但是我希望napalm函数是WARNING及更高版本。

所以我有这样的代码:

代码语言:javascript
复制
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级别生成了大量其他日志记录,这只是一种噪音。所以试着减少这一点。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-01-29 18:16:17

通过在没有参数的情况下调用logging.getLogger(),您目前正在检索根记录器,并且覆盖它的级别也会影响所有其他记录器。相反,您应该检索库的记录器,并且只对该特定级别重写级别。

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

代码语言:javascript
复制
logger = logging.getLogger("napalm")

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

代码语言:javascript
复制
logging.getLogger("napalm").setLevel(logging.WARNING)

一般例子:

代码语言:javascript
复制
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")

输出:

代码语言:javascript
复制
DEBUG: #1 from A gets printed
DEBUG: #1 from B gets printed
DEBUG: #2 from B gets printed

编辑:

因为这对您来说不太好,这可能是因为这个库中有许多其他的记录器:

代码语言:javascript
复制
$ 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__)

然后,我会求助于这样的东西(related:):

代码语言:javascript
复制
# increase level for all loggers
for name, logger in logging.root.manager.loggerDict.items():
    logger.setLevel(logging.WARNING)

或者,如果你只打印不同的伐木者,找出最嘈杂的伐木者,然后一个一个地让他们安静下来,也许就足够了。

票数 0
EN

Stack Overflow用户

发布于 2021-01-29 17:14:20

一本书“有效的Python”中的一个很好的技巧。看看能不能帮上忙。

代码语言:javascript
复制
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)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65958465

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档