如何在Python中同步记录和打印?

4
以下代码:
 logging.info('Collecting available features for location ' + source_feature['properties']['key'] + ' and date range [' + start_date + '..' + end_date + ']...')

    feature_start_time = datetime.now()

    target_directory = util.target_directory(source_feature['properties'])
    if target_directory is None:
        target_directory = util.target_directory_for_point(point)

    try:

        for layer in layers:

            logging.info('Layer: \'' + layer + '\'')

            print('Found dates: ', end='', flush=True)
            criterion_date = end_date
            while criterion_date is not None:

打印出类似于这样的内容

Found dates: 20170630130831 Collecting available features for location 8404222738792 and date range [2016-04-16..2017-06-30]...
20170630130831 Layer: '1_NATURAL_COL0R'
2017-06-22 2017-05-13 2017-04-23 2017-04-03 2017-03-14 2017-02-22 2017-01-23 2016-11-24 2016-10-05 2016-08-06 2016-07-17 2016-06-27 2016-06-07 

即打印输出与记录器输出交替出现。

如何进行同步?我希望日志在被调用时立即打印,而不会与打印内容混合。

更新

以下是初始化日志记录的内容:

import logging

logging.basicConfig(format='%(asctime)s %(message)s', datefmt='%Y%m%d%H%M%S', level=logging.INFO)

1
你能展示一下启动日志记录器的代码吗? - Chris_Rands
你的日志框架应该负责这个吗? - PYA
你可以创建一个函数来处理打印和日志记录吗?还是我误解了? - Nab Ilovich
@Chris_Rands,请查看我关于初始化日志的更新。 - Dims
@Dims 在每个日志后加上 logging.Handler().flush(),这样可以吗? - Chris_Rands
@Chris_Rands 不,它不会。 - George Vinokhodov
3个回答

2
我遇到了同样的问题。默认情况下,StreamHandler将所有数据记录到sys.stderr中。而print将数据打印到sys.stdout中。因此,您的程序是同步的,但终端不是。尝试手动创建StreamHandler并在构造函数中传递stream=sys.stdout。之后,您的输出应该被传递到stdout中,一切都会同步。

0

日志函数主要用于指示发生了某些事件。 打印函数用于向用户显示内容。 如果您想避免与printf交错,可以将日志简单地放入文本文件中。

logging.basicConfig(filename='example.log', filemode='w', level=logging.DEBUG)

1
我想要 stdout :) - Dims

0

尝试在basicConfing()调用中将stream设置为sys.stdout

logging.basicConfig(stream=sys.stdout, format='%(asctime)s %(message)s', datefmt='%Y%m%d%H%M%S', level=logging.INFO)

或者打印到sys.stderr流:

print('Found dates: ', end='', flush=True, file=sys.stderr)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接