python 2.7记录日志的问题IOError: [Errno 24] Too many open files

wind_liang
  • 96
@app.route('/RechargeToCard', methods=['POST'])
def get_task2():
    
    logger = logging.getLogger('mylogger'+str(time.time()))
    logger.setLevel(logging.DEBUG)
    formatter = logging.Formatter('%(asctime)s - %(levelname)s \n%(message)s')
    #登录的主页面  
    username=request.form.get('id', default='20141000000')
    fh = logging.FileHandler(BASE_DIR+'/log/'+username+'_'+GetNowTime()+'_'+str(random.random())+'.log')
    fh.setLevel(logging.DEBUG)
    fh.setFormatter(formatter)
    logger.addHandler(fh)
    message='RechargeToCard   '+request.remote_addr+'\n'
...
   message=message+'password len is not 6'
        logger.info(message )
        return   jsonify(result=0,reason='密码错误')

用Flask搭的web,放在服务器上

clipboard.png

fh=logging.FileHandler(BASE_DIR+'/log/'+username+'_'+GetNowTime()+'_'+str(random.random())+'.log') 这句出了问题,不是一直出问题,就是偶尔出的问题,不是很明白,明明每个log文件的名字不一样,为什么会提示IOError: [Errno 24] Too many open files
最奇怪的是为什么不是一直出问题,而是偶尔出问题,求解答

回复
阅读 10.7k
4 个回答
oliver_lv
  • 1.7k
✓ 已被采纳
fh =logging.FileHandler(BASE_DIR+'/log/'+username+'_'+GetNowTime()+'_'+str(random.random())+'.log')

这个你每一次创建的handler对象有没有调用`fh.close()`来清除此hander的所拥有的资源。
clino
  • 42

打开太多文件了,一般来说默认是最多1024个文件
你需要把这个值改大,验证多少可以执行 ulimit -a ,看里面的"open files"
更多可以参考: http://askubuntu.com/question...

logger = logging.getLogger('mylogger'+str(time.time()))
这句有问题,你没跑一次get_task2都会获得一个文件句柄,跑多了当然就超了!

logger = logging.getLogger('mylogger'+str(time.time()))

这样的写法本来就不好,潜在风险太高了。每个请求单独生成一个日志,太不合理了。linux系统本身对一个目录下的文件数也是有限制的,请求一多,一下子就达到上限出错了。

至于handler有没有关闭都顶多只能说是编程错误,但每个请求单独一个日志,完全就是思考的方式错误了。

宣传栏