python - Flask 部署gunicorn,supervisor部署日誌問題

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章