zoukankan      html  css  js  c++  java
  • 解决gunicorn部署flask程序日志丢失问题

      众所周知日志是我们排查问题和跟隔壁团队撕逼的最佳利器, 真的很重要防止被甩锅(血泪教训), 在一次撕扯中我去线上查看日志发现很多重要证据都没有记录在文件中, 经过对比发现肯定了发生了日志丢失问题, 直接导致本该10分钟解决的战斗,愣是持续了2个小时。

    言归正传, 我们的程序是用gunicorn作为我们的应用服务器, 开启CUP核数+1个进程, 放在docker容器中部署多个服务器。

      发生日志丢失最关键的因素在于, 我们的服务开启了多个进程, 而我们python自带的logging模块只是保证线程安全(可以看源码发现在写入文件前是会加锁的)的不保证进程安全, 所以导致在多进程的情况下会发生日志错乱, 丢失等情况。

      那怎么解决呢?其实很简单,前人有轮子啊, https://github.com/wandaoe/concurrent_log  直接安装 pip install consurrent, 然后替换对应的handle就可以了,详细可以查看链接。

      当然如果你看了这个开源包的代码就知道, 它在进程层面加了一个文件锁, 原理很简单在写入日志前创建一个文件, 然后写完就删除文件, 其他进程在写入日志前,先判断这个文件存不存在 ,如果存在就等待, 如果不存在就自己创建文件,然后写入然后再删除文件, 这就是在进程层面加的锁, 其实如果想效率更高, 可以引入基于redis分布式锁,就是如果系统不大的话, 引入这个比较麻烦。

  • 相关阅读:
    Thinkhphp5控制器调用的Model层的方法总结
    js数组与字符串的相互转换方法
    oop中 限制文件类型和大小
    php常用内置函数
    PHP 面向对象
    微信JSSDK开发
    PHPExcel探索之旅
    php操作Excel
    百度地图和高德地图的API视频教程
    手机号码归属地查询(免费)
  • 原文地址:https://www.cnblogs.com/lifei01/p/13937673.html
Copyright © 2011-2022 走看看