服務器端是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行代碼注釋掉后,問題解決