【问题标题】:How to output logs with python logging in a click cli?如何在单击 cli 中使用 python 日志输出日志?
【发布时间】:2020-04-23 12:38:03
【问题描述】:

我用“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 创建一个记录器,我必须为我的记录器显式创建一个处理程序。
  • 我必须在 both 记录器和处理程序上设置日志级别?

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

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

感谢您的帮助!

【问题讨论】:

    标签: python logging click command-line-interface


    【解决方案1】:

    我个人喜欢使用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!
    

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

    【讨论】:

      【解决方案2】:

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

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

      它为您提供以下输出:

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

      【讨论】:

        【解决方案3】:

        我必须手动设置

        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
        

        【讨论】:

          猜你喜欢
          • 2018-09-22
          • 1970-01-01
          • 1970-01-01
          • 2012-04-21
          • 2020-08-27
          • 1970-01-01
          • 2011-11-02
          • 2012-03-28
          • 1970-01-01
          相关资源
          最近更新 更多