服務器報Input/output error問題
服務器端是nginx + uwsgi + flask
報錯后,網上搜到可能是print語句引起,但是檢查代碼,并未發現print語句
開啟logger:
import logging
logging.basicConfig(filename='logger.log', format='%(asctime)s - %(levelname)s - %(message)s',level=logging.INFO)
logger = logging.getLogger(__name__) #定義一次就可以,其他地方需要調用logger,只需要直接使用logger就行了
logger.setLevel(level=logging.INFO) #定義過濾級別
filehandler = logging.FileHandler("log.txt") # Handler用于將日志記錄發送至合適的目的地,如文件、終端等
filehandler.setLevel(logging.INFO)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
filehandler.setFormatter(formatter)
console = logging.StreamHandler() #日志信息顯示在終端terminal
console.setLevel(logging.INFO)
console.setFormatter(formatter)
logger.addHandler(filehandler)
logger.addHandler(console)
logger.info("Start log")
logger.debug("Do something")
logger.warning("Something fail.")
logger.info("Finish")
在產生異常的模塊上:
try:
........
except Exception as e:
logger.exception(e)
最后發現是該模塊開啟了多進程,多進程有個模塊popen_fork.py中存在如下代碼:
class Popen(object):
method = 'fork'
def __init__(self, process_obj):
try:
sys.stdout.flush()
except (AttributeError, ValueError):
pass
try:
sys.stderr.flush()
except (AttributeError, ValueError):
pass
self.returncode = None
self._launch(process_obj)
是其中的sys.stdout.flush()和sys.stderr.flush()引起的,將涉及8行代碼注釋掉后,問題解決
浙公網安備 33010602011771號