繁体   English   中英

如何使用 python 在单击 cli 中登录 output 日志?

[英]How to output logs with python logging in a click cli?

我用“click”库编写了一个 python cli。 我还想使用 python 的内置logging模块来记录到控制台。 但是我一直在努力将日志消息发送到控制台。 我尝试了一个非常简单的方法:

logger = logging.getLogger(__name__)

@click.command()
def cli():
    logger.setLevel("INFO")
    logger.info("Does this work?")
    print("done.")

记录器内容没有出现在我的控制台中。 也许它需要一个处理程序来显式地将日志消息发送到标准输出?

logger = logging.getLogger(__name__)

@click.command()
def cli():
    handler = logging.StreamHandler(sys.stdout)
    handler.setFormatter(logging.Formatter('%(asctime)s %(message)s'))
    handler.setLevel("INFO")
    logger.addHandler(handler)
    logger.info("Does this work?")
    print("done.")

不幸的是,这也不起作用。

第三个选项——创建一个处理程序并为处理程序和记录器设置日志级别——有效:

logger = logging.getLogger(__name__)

@click.command()
def cli():
    logger.setLevel("INFO")
    handler = logging.StreamHandler(sys.stderr)
    handler.setFormatter(logging.Formatter('%(asctime)s %(message)s'))
    handler.setLevel("INFO")
    logger.addHandler(handler)
    logger.info("Does this work?")
    print("done.")

这好像是:

  • 如果使用logging.getLogger创建一个记录器,我必须明确地为我的记录器创建一个处理程序。
  • 我必须在记录器和处理程序上设置一个日志级别?

那正确吗? 设置两次级别似乎很愚蠢。 重点是什么?

还是我仍然误解了正确的方法?

谢谢你的帮助!

我不得不手动设置

logging.basicConfig(level=logging.INFO)

例子

import click
import logging

logging.basicConfig(level=logging.INFO)

@click.command()
def cli():
    logging.info("it works")

$ mycli
INFO:root:it works

我个人喜欢处理日志的loguru库。 我认为它更简单。

这是我通常如何做的一个例子:

import click
from loguru import logger


@click.command()
@click.option('--count', default=1, help='Number of greetings.')
@click.option('--name', prompt='Your name', help='The person to greet.')
def hello(count, name):
    """Simple program that greets NAME for a total of COUNT times."""
    for x in range(count):
        logger.info(f"That's it, beautiful and simple logging! - Counter: {x}")
        click.echo('Hello %s!' % name)

if __name__ == '__main__':
    hello()
❯ python loguru-click-cli-test.py --count=3
Your name: Geraldo
2020-06-10 20:02:48.297 | INFO     | __main__:hello:11 - That's it, beautiful and simple logging! - Counter: 0
Hello Geraldo!
2020-06-10 20:02:48.297 | INFO     | __main__:hello:11 - That's it, beautiful and simple logging! - Counter: 1
Hello Geraldo!
2020-06-10 20:02:48.297 | INFO     | __main__:hello:11 - That's it, beautiful and simple logging! - Counter: 2
Hello Geraldo!

Loguru: https://github.com/Delgan/loguru

我希望在调用单击处理程序时获取日志(命令名和参数)。 我最终得到了这个片段:

from functools import wraps
import logging
import click

logger = logging.getLogger(__name__)

def click_log(fn):
    @wraps(fn)
    def wrapper(*args, **kwargs):
        context = click.get_current_context()
        logger.info(f"{context.command.name}(**{context.params})")
        return fn(*args, **kwargs)
    return wrapper

@click.command()
@click.option('--count', default=1, help='Number of greetings.')
@click.option('--name', prompt='Your name',
              help='The person to greet.')
@click_log
def hello(count, name):
    """Simple program that greets NAME for a total of COUNT times."""
    for x in range(count):
        click.echo(f"Hello {name}!")  # you can use logger.info


def configure_logger():
    logging.basicConfig(level="DEBUG")

configure_logger()

if __name__ == '__main__':
    hello()

它为您提供以下 output:

python test_click.py --count 3
Your name: ok
INFO:__main__:hello(**{'count': 3, 'name': 'ok'})
Hello ok!
Hello ok!
Hello ok!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM