如何使用记录器在Python中仅一行打印列表

时间:2018-07-23 10:58:44

标签: python python-3.x logging

我想在Python 3.6中仅使用一行登录来打印列表。目前,我的代码如下所示。

logger = logging.getLogger()
logger.setLevel(log_level)
ch = logging.StreamHandler(sys.stdout)
ch.setLevel(log_level)
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
ch.setFormatter(formatter)
logger.addHandler(ch)

# some codes in-between

num_list = [1, 2, 3, 4, 5]
logger.info("Numbers in num_list are: ")
for item in num_list:
    logger.info(item)

我想得到的是

2018-07-23 17:29:30,200 - root - INFO - Numbers in num_list are: 1 2 3 4 5

但是,我会得到

2018-07-23 17:29:30,200 - root - INFO - Numbers in num_list are:
2018-07-23 17:29:30,200 - root - INFO - 1
2018-07-23 17:29:30,200 - root - INFO - 2
2018-07-23 17:29:30,200 - root - INFO - 3
2018-07-23 17:29:30,200 - root - INFO - 4
2018-07-23 17:29:30,200 - root - INFO - 5

我知道如果使用print进行输出,我本可以使用print(item, end=" ")来显式更改输出之后的内容。但是,日志记录似乎不会接受end作为输入参数。

有人对我如何获得所需的输出有任何想法吗?非常感谢!

5 个答案:

答案 0 :(得分:3)

您正在使用for循环,该循环遍历所有列表并一次尝试记录一次:logger.info("Numbers in num_list are: {}".format(' '.join(map(str, num_list))))将它们全部一次发布

请参阅:https://docs.python.org/3/library/stdtypes.html?highlight=str#str.join

答案 1 :(得分:2)

输出流(由print使用)和消息日志之间存在很大差异。流是一个字符序列(或二进制字符串的字节),可能恰好包含换行符。当您在终端上显示(或打印它们)时,这些换行符将被解释。

日志是消息的序列,每个消息都应该是原子的。一旦记录了一条消息,您将无法添加任何内容,而只能记录新消息。

因此,您必须首先完全构建您的消息,然后将其记录:

num_list = [1, 2, 3, 4, 5]
msg = "Numbers in num_list are: " + " ".join(num_list)      # fully build the message
logger.info(msg)                                            #  and then log it

答案 2 :(得分:1)

我发现的另一个不错的捷径 here -

nums = [3, 87, 28, 25, 96]
logging.debug("Here are my favourite numbers: " + str(nums)[1:-1])

"""
 Output:
 Here are my favorite numbers: 3, 87, 28, 25, 96
""" 

再使用 map -

logging.debug("Favourite numbers are: ".join(map(str, nums))

答案 3 :(得分:0)

不完全是您想要的,但是更懒: 当您要创建一些快速调试时,它可能会很有用:

num_list = [1, 2, 3, 4, 5]
logger.info(str(("Numbers in num_list are: ",num_list))

输出:

('Numbers in num_list are: ', [1, 2, 3, 4, 5])

答案 4 :(得分:0)

Python 日志记录的一个重要特性是(可能很昂贵)字符串连接仅在日志记录级别意味着要输出消息时才执行。

但是,在以下代码中,始终执行 str()map()join(),如果日志记录级别高于 debug,则结果可能会被丢弃:

logging.debug("Favourite numbers are: ".join(map(str, nums))

我创建了一个小类,它允许像这样对序列进行直观的单行记录:

logging.debug("Favourite numbers are: %s", rstr(nums))

其中 rstr 类的定义如下:

class rstr:
    """Wrapper to recursively str()ise a list or tuple or set. The work is only
    performed in the __str__ call so these objects 'cost' very little if they
    are never actually used (e.g. as in a logger.debug() argument when the
    message is never output."""
    
    def __init__(self, seq):
        """Creates an rstr instance which will string-ise the argument when
        called."""
        self._seq = seq
    
    def __str__(self):
        """String-ise and return the argument passed to the constructor."""
        if isinstance(self._seq, list):
            return "[" + self._str_items() + "]"
        elif isinstance(self._seq, tuple):
            return "(" + self._str_items() + ")"
        elif isinstance(self._seq, set):
            return "{" + self._str_items() + "}"
        else:
            return str(self._seq)
    
    def _str_items(self):
        """Returns the string-ised forms of the items in the argument passed to
        the constructor - no start/end brackets/braces."""
        return ", ".join(map(str, self._seq))
    

如果需要,这显然可以完全递归,但为了清楚起见,此处显示了更简单的版本。