python - Flask 部署gunicorn,supervisor部署日誌問題
Max.Bai
2019-10
1. gunicorn部署Flask日誌設置
日誌有Flask日誌,有gunicorn日誌,首先合併到一個文件。
在app.py文件添加如下代碼,當gunicorn啓動的時候獲取gunicorn的日誌,賦值爲flask。
當debug啓動的時候,日誌全部寫到指定文件
if __name__ != '__main__':
gunicorn_logger = logging.getLogger('gunicorn.error')
logging.basicConfig(level=gunicorn_logger.level, handlers=gunicorn_logger.handlers)
app.logger.handlers = gunicorn_logger.handlers
if __name__ == '__main__':
fh = logging.FileHandler(filename="./logs/dms-api.log", encoding='utf-8')
# 日誌
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
datefmt='%a, %d %b %Y %H:%M:%S',
handlers=[fh])
app.debug = True
app.run()
2. gunicorn本身日誌設置
gunicorn日誌分爲兩個,一個訪問日誌,一個error日誌,flask的日誌是合併到error裏面的。
詳細設置代碼如下: gunicorn_config.py
# _*_coding:utf-8 _*_
import multiprocessing
bind = "0.0.0.0:19099"
backlog = 2048
workers = multiprocessing.cpu_count() * 2 + 1
# workers = 4
worker_class = 'sync' # gevent sync
worker_connections = 1000
timeout = 30
keepalive = 2
chdir = '/opt/dms-api'
logconfig_dict = {
'version':1,
'disable_existing_loggers': False,
'loggers':{
"gunicorn.error": {
"level": "DEBUG",# 打日誌的等級可以換的,下面的同理
"handlers": ["error_file"], # 對應下面的鍵
"propagate": 1,
"qualname": "gunicorn.error"
},
"gunicorn.access": {
"level": "DEBUG",
"handlers": ["access_file"],
"propagate": 0,
"qualname": "gunicorn.access"
}
},
'handlers':{
"error_file": {
"class": "logging.handlers.RotatingFileHandler",
"maxBytes": 1024*1024*1024,# 打日誌的大小,我這種寫法是1個G
"backupCount": 1,# 備份多少份,經過測試,最少也要寫1,不然控制不住大小
"formatter": "generic",# 對應下面的鍵
# 'mode': 'w+',
"filename": "./logs/server.log"# 打日誌的路徑
},
"access_file": {
"class": "logging.handlers.RotatingFileHandler",
"maxBytes": 1024*1024*1024,
"backupCount": 1,
"formatter": "generic",
"filename": "./logs/access.log",
}
},
'formatters':{
"generic": {
"format": "'[%(process)d] [%(asctime)s] %(levelname)s [%(filename)s:%(lineno)s] %(message)s'", # 打日誌的格式
"datefmt": "[%Y-%m-%d %H:%M:%S %z]",# 時間顯示方法
"class": "logging.Formatter"
},
"access": {
"format": "'[%(process)d] [%(asctime)s] %(levelname)s [%(filename)s:%(lineno)s] %(message)s'",
"class": "logging.Formatter"
}
}
}
3. 使用supervisor啓動
supervisor安裝到默認路勁。
添加supervisor配置文件,文件保存到/etc/supervisord.d/dms-api-server.ini
內容如下:
[program:dmsapi] ;進程名稱
directory = /opt/dms-api ;程序的啓動目錄
command = /usr/local/bin/gunicorn3 -c gunicorn_config.py --log-level=info app:app
autostart = true
startsecs = 5
autorestart = true
startretries = 3
;user = leon ; 用哪個用戶啓動
redirect_stderr = true ; 把 stderr 重定向到 stdout,默認 false
stdout_logfile_maxbytes = 20MB ; stdout 日誌文件大小,默認 50MB
stdout_logfile_backups = 20 ; stdout 日誌文件備份數
; stdout 日誌文件,需要注意當指定目錄不存在時無法正常啓動,所以需要手動創建目錄(supervisord 會自動創建日誌文件)
stdout_logfile = /opt/dms-api/logs/dmsapi_stdout.log
啓動直接supervisorctl start dmsapi
重啓supervisorctl restart dmsapi
4. systemctl 部署
可替換supervisor,supervisor好用一點,做個記錄。
配置文件保存地址
/usr/lib/systemd/system/dms-api.service
[Unit]
Description=DMS api daemon
After=dmsapi.service
[Service]
Type=forking
User=root
Group=root
Restart=always
RestartSec=5
StartLimitInterval=0
PIDFile=/opt/dms-api/dmsapi.pid
ExecStart=/usr/local/bin/gunicorn3 -w 4 -b 0.0.0.0:19099 --chdir=/opt/dms-api app:app
PrivateTmp=True
[Install]
WantedBy=multi-user.target