【问题标题】:How to format log records created by the same function in the same way如何以相同的方式格式化相同函数创建的日志记录
【发布时间】:2020-07-19 23:35:53
【问题描述】:

是否可以以相同的方式格式化由于运行特定功能而创建的所有日志记录?

例如,而不是:

import requests
import logging

logging.basicConfig(level=logging.DEBUG)


def foo():
    logging.info("Running foo")
    requests.get("http://www.google.com")


def bar():
    logging.info("Running bar")
    requests.get("http://www.google.com")


foo()
bar()

给予:

INFO:root:Running foo
DEBUG:urllib3.connectionpool:Starting new HTTP connection (1): www.google.com:80
DEBUG:urllib3.connectionpool:http://www.google.com:80 "GET / HTTP/1.1" 200 5499
INFO:root:Running bar
DEBUG:urllib3.connectionpool:Starting new HTTP connection (1): www.google.com:80
DEBUG:urllib3.connectionpool:http://www.google.com:80 "GET / HTTP/1.1" 200 5470

我想要类似的东西:

foo | INFO:root:Running foo
foo | DEBUG:urllib3.connectionpool:Starting new HTTP connection (1): www.google.com:80
foo | DEBUG:urllib3.connectionpool:http://www.google.com:80 "GET / HTTP/1.1" 200 5499
bar | INFO:root:Running bar
bar | DEBUG:urllib3.connectionpool:Starting new HTTP connection (1): www.google.com:80
bar | DEBUG:urllib3.connectionpool:http://www.google.com:80 "GET / HTTP/1.1" 200 5470

【问题讨论】:

    标签: python python-3.x debugging logging python-logging


    【解决方案1】:

    输出看起来会有所不同,因为函数名称将被调用的函数名称覆盖,如下面的输出所示。

        import requests
        import logging
        logger = logging.getLogger()
        FORMAT = "%(funcName)20s | %(levelname)s:%(name)s: %(message)s"
        logging.basicConfig(format=FORMAT)
        logger.setLevel(logging.DEBUG)
    
    
    def foo():
        logging.info(f"Starting {foo.__name__}")
        requests.get("http://www.google.com")
    
    
    
    def bar():
        logging.info(f"Starting {bar.__name__}")
        requests.get("http://www.google.com")
    
    
    foo()
    bar()
    

    输出:

                 foo | INFO:root: Starting foo
           _new_conn | DEBUG:urllib3.connectionpool: Starting new HTTP connection (1): www.google.com:80
       _make_request | DEBUG:urllib3.connectionpool: http://www.google.com:80 "GET / HTTP/1.1" 200 5778
                 bar | INFO:root: Starting bar
           _new_conn | DEBUG:urllib3.connectionpool: Starting new HTTP connection (1): www.google.com:80
       _make_request | DEBUG:urllib3.connectionpool: http://www.google.com:80 "GET / HTTP/1.1" 200 5745
    

    【讨论】:

    • 您好,感谢您的回复。有没有办法用foobar等覆盖requests模块中的函数名?
    • 很遗憾没有;根据docs - %(funcName)s Name of function containing the logging call. 并且由于输出(例如'正在启动新的 HTTP 连接...)`来自get 方法..
    【解决方案2】:

    您正在寻找的是格式化程序。它们内置于日志记录模块中。

    import logging
    
    FORMAT = "%(funcName)s - %(asctime)s - %(levelname)s - %(message)s"
    
    logging.basicConfig(format=FORMAT, level=logging.DEBUG)
    
    def foo():
        logging.info("In foo")
    
    def bar():
        logging.info("In bar")
    
    foo()
    bar()
    

    将输出:

    foo - 2020-04-07 17:55:07,125 - INFO - In foo
    bar - 2020-04-07 17:55:07,132 - INFO - In bar
    

    docs 解释了所有关于它们的信息。您可以将各种自定义输出添加到每个日志记录调用。

    【讨论】:

    • 您好,感谢您的回复,但我正在寻找一种在requests moudle 创建的日志记录开头也有foo | bar | 的方法。有没有办法做到这一点?
    • 哦,我明白你的意思了。你希望它只深入一层。不,这不会那样做。
    猜你喜欢
    • 2021-03-03
    • 1970-01-01
    • 1970-01-01
    • 2016-07-26
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多