如何在单击 cli 中使用 python 日志输出日志?

Nat*_*teV 7 python logging click command-line-interface

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

logger = logging.getLogger(__name__)

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

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

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.")
Run Code Online (Sandbox Code Playgroud)

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

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

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.")
Run Code Online (Sandbox Code Playgroud)

这好像是:

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

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

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

谢谢你的帮助!

小智 9

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

\n\n

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

\n\n
import click\nfrom loguru import logger\n\n\n@click.command()\n@click.option(\'--count\', default=1, help=\'Number of greetings.\')\n@click.option(\'--name\', prompt=\'Your name\', help=\'The person to greet.\')\ndef hello(count, name):\n    """Simple program that greets NAME for a total of COUNT times."""\n    for x in range(count):\n        logger.info(f"That\'s it, beautiful and simple logging! - Counter: {x}")\n        click.echo(\'Hello %s!\' % name)\n\nif __name__ == \'__main__\':\n    hello()\n
Run Code Online (Sandbox Code Playgroud)\n\n
\xe2\x9d\xaf python loguru-click-cli-test.py --count=3\nYour name: Geraldo\n2020-06-10 20:02:48.297 | INFO     | __main__:hello:11 - That\'s it, beautiful and simple logging! - Counter: 0\nHello Geraldo!\n2020-06-10 20:02:48.297 | INFO     | __main__:hello:11 - That\'s it, beautiful and simple logging! - Counter: 1\nHello Geraldo!\n2020-06-10 20:02:48.297 | INFO     | __main__:hello:11 - That\'s it, beautiful and simple logging! - Counter: 2\nHello Geraldo!\n
Run Code Online (Sandbox Code Playgroud)\n\n

洛鲁鲁: https: //github.com/Delgan/loguru

\n


小智 7

我必须手动设置

logging.basicConfig(level=logging.INFO)
Run Code Online (Sandbox Code Playgroud)

例子

import click
import logging

logging.basicConfig(level=logging.INFO)

@click.command()
def cli():
    logging.info("it works")
Run Code Online (Sandbox Code Playgroud)

给出

$ mycli
INFO:root:it works
Run Code Online (Sandbox Code Playgroud)