三:记录日志-设置成守护进程-改为生产环境

时间:2025-02-24 19:20:17

接着二:可以完美实现前端与后端的有机结合后
三需要

  1. 实现程序上线后,需要记录日志,
  2. 将程序设置成系统守护进程,方便管理
  3. 将环境设置为生产环境,在这一步前还是使用的app.run(),不符合生产需要

记录日志

需求:出现错误,能够查看日志找出错误的地方,但考虑到日志文件过长长时间不清理会占用空间,需要实现自动清理30天前的日志

  1. 在当前项目中创建一个模块logging_config.py,以及一个log文件abc.log
import logging
from logging.handlers import TimedRotatingFileHandler

def setup_logging(log_file="log文件的绝对路径"):
    handler = TimedRotatingFileHandler(
        filename=log_file,
        when='D',
        interval = 1,   #时间间隔
        backupCount = 30,   # 备份周期
        encoding = 'utf-8'        
    )
    format=logging.Formatter("%(asctime)s-%(levelname)s-%(filename)s-%(funcName)s-%(message)s",
                             datefmt="%Y-%m-%d %H:%M:%S")
    handler.setFormatter(format)

    logger = logging.getLogger()
    logger.setLevel(logging.INFO)
    logger.addHandler(handler)
    

    return logger
    
  1. 在flask文件中引用上述的配置文件
# flask文件以及其他需要log的文件
from log_file.logging_config import *
# 仅flask文件
logger = setup_logging()
  1. 在需要记录到log中的输出使用logging.info/error等即可

设置系统守护进程Daemon

  1. 进入到etc/systemed/system/
  2. 新建文件[daemon文件名].service
  3. 写入
[Unit]
Description=My Python Daemon
After=network.target   # 确保服务在网络服务启动后才启动

[Service]
WorkingDirectory=[项目绝对路径 例如/abc/my_rpogram]
ExecStart=[python虚拟环境路径]  /path/to/your/project/your_script.py    # 不同情况不同写法
Restart=always   # 进程崩溃时自动重启
User=root		# 以root用户权限运行
StandardOutput=append:/var/log/[文件名].log   # 日志输出
StandardError=append:/var/log/[文件名].log

[Install]
WantedBy=multi-user.target   # 服务将在系统启动时自动加载

a. ExecStart的值分几种情况
虚拟环境运行Flask应用:

ExecStart=[python虚拟环境路径]  /path/to/your/project/your_script.py

非虚拟环境运行:

ExecStart=[python路径]   /path/to/your/project/your_script.py
  1. 重新加载systemd配置并启动服务
# 输入以下四行
sudo systemctl daemon-reload   # 重新加载
sudo systemctl enable [daemon文件名].service  # 设置开机自启
sudo systemctl start [daemon文件名].service   # 启动进程
sudo systemctl status [daemon文件名].service  # 查看运行状态
# 下面命令看需求输入
# 查看系统日志 非程序logger输出实时日志
journalctl -u [daemon文件名] -f
# 取消开机自启
sudo systemctl disable [daemon文件名].service  
# 导出所有日志
journalctl > system_logs.txt
# 仅导出某个服务的日志
journalctl -u [daemon文件名].service > [文件名].log
  1. 如果需要改动代码需要停止服务再重启才可以生效
sudo systemctl stop [daemon文件名].service    # 停止
sudo systemctl restart [daemon文件名].service # 重启

使用gunicorn部署Flask应用

这一步将环境改为生产环境(WSGI服务器)
gunicorn支持多进程,高并发,适合生产环境,支持自动重启
进入到项目目录,

  1. 安装gunicorn
pip install gunicorn

如果是虚拟环境,安装完成后gunicorn就会出现在.venv/bin目录中
2. 启动flask应用

gunicorn -w 4 -b 0.0.0.0:[端口号] your_app:app

1)-w 4 表示worker,开启4个工作进程,通常设置为CPU数量*2+1
2)-b 0.0.0.0:[端口号] 绑定到所有网卡的xx端口
3)your_app:app :your_app是flask所在的python文件不带.py,并且your_app不是绝对或者香炉路径,而是python的模块名称,app是flask实例名称
3. 将应用作为linux服务启动,自动管理进程
将前面的daemon.service文件打开,更改变量

ExecStart=[gunicorn路径] -w 4 -b 0.0.0.0:[端口号] your_app:app

a. Flask应用运行在系统python环境中:
[gunicorn路径]: /usr/local/bin/gunicorn
b. Flask应用运行在虚拟环境中:
[gunicorn路径]:/path/to/venv/bin/gunicorn
4. 重载systemd,重启flask服务即可

sudo systemctl daemon-reload
sudo systemctl start [daemon文件名].service
sudo systemctl status [daemon文件名].service
sudo systemctl enable [daemon文件名].service