python记录打印空行消息进行打印

问题描述

我们正在尝试在现有的python项目中引入python 日志记录

由于我们在代码中已经有很多 print 语句,因此我们决定使用以下语句将所有打印日志重定向到日志文件

import logging,sys
import os
from logging.handlers import TimedRotatingFileHandler
formatter = logging.Formatter("%(asctime)s - %(pathname)s - %(funcName)s - %(levelname)s - %(message)s")
log_path = '/logs/server.log'
handler = TimedRotatingFileHandler(filename=log_path,when='midnight')
handler.setFormatter(formatter)
log = logging.getLogger()
log.setLevel(logging.DEBUG)
log.addHandler(handler)
sys.stderr.write = log.error
sys.stdout.write = log.info

但是,它打印两行,第二行为空日志。

2020-09-21 09:03:05,978 - utils.py - logger - INFO - <_io.TextIOWrapper name='<stderr>' mode='w' encoding='UTF-8'>
2020-09-21 09:03:05,978 - utils.py - logger - INFO -

2020-09-21 09:03:05,978 - utils.py - logger - INFO - 1600693385   Mon Sep 21 09:03:05 2020        19882 Registering functions
2020-09-21 09:03:05,978 - utils.py - logger - INFO -

它适用于记录功能,例如信息,错误。它只会发出打印的问题。

如果有人知道原因,那将是很大的帮助。

更详细地,我们使用 gunicorn 作为服务器,并使用 falcon 作为其余框架。

解决方法

您不应修改stdout和stderr的写入功能,而应为信息和错误添加流处理程序(一个在stdout上,另一个在stderr上)

您可以在此处找到关于SO的示例:https://stackoverflow.com/a/31459386/14306518

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...