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

news/2025/2/24 22:29:24

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

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

记录日志

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

  1. 在当前项目中创建一个模块logging_config.py,以及一个log文件abc.log
python">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文件中引用上述的配置文件
python"># 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. 写入
python">[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应用:

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

非虚拟环境运行:

linux">ExecStart=[python路径]   /path/to/your/project/your_script.py
  1. 重新加载systemd配置并启动服务
linux"># 输入以下四行
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. 如果需要改动代码需要停止服务再重启才可以生效
linux">sudo systemctl stop [daemon文件名].service    # 停止
sudo systemctl restart [daemon文件名].service # 重启

使用gunicorn部署Flask应用

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

  1. 安装gunicorn
python">pip install gunicorn

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

python">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文件打开,更改变量

python">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服务即可

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

http://www.niftyadmin.cn/n/5864838.html

相关文章

开源一款I2C电机驱动扩展板-FreakStudio多米诺系列

总线直流电机扩展板 原文链接: FreakStudio的博客 摘要 设计了一个I2C电机驱动板,通过I2C接口控制多个电机的转速和方向,支持刹车和减速功能。可连接16个扩展板,具有PWM输出、过流过热保护和可更换电机驱动芯片。支持按键控制…

第十章 Kubernetes Ingress

目录 一、四层负载与七层负载 1、工作层次 2、七层负载的应用场景 二、Ingress概念和应用场景 使用Nginx的Ingress内部工作原理图 基于Ingress API的七层实现 三、Ingress安装部署 1、各节点安装2个镜像 2、下载nginx-ingress-controller的chart以及修改values.yaml文…

全面汇总windows进程通信(三)

在Windows操作系统下,实现进程间通信(IPC, Inter-Process Communication)有几种常见的方法,包括使用管道(Pipe)、共享内存(Shared Memory)、消息队列(Message Queue)、命名管道(Named Pipe)、套接字(Socket)等。本文介绍如下几种: RPC(远程过程调用,Remote Pr…

大语言模型(LLM)提示词(Prompt)高阶撰写指南

——结构化思维与工程化实践 一、LLM提示词设计的核心逻辑 1. 本质认知 LLM是「超强模式识别器概率生成器」,提示词的本质是构建数据分布约束,通过语义信号引导模型激活特定知识路径。优秀提示词需实现: 精准性:消除歧义&#…

C#快速幂算法

快速幂算法:数学运算中的 “光速引擎” 在数学运算的奇妙世界里,计算一个数的幂次方是常有的事。想象一下,你要计算 2 的 100 次方,要是按照传统的方法,一个一个地乘,那可得花费不少时间,就像徒…

【亲测有效】百度Ueditor富文本编辑器添加插入视频、视频不显示、和插入视频后二次编辑视频标签不显示,显示成img标签,二次保存视频被替换问题,解决方案

【亲测有效】项目使用百度Ueditor富文本编辑器上传视频相关操作问题 1.百度Ueditor富文本编辑器添加插入视频、视频不显示 2.百度Ueditor富文本编辑器插入视频后二次编辑视频标签不显示,在编辑器内显示成img标签,二次保存视频被替换问题 问题1&#xff1…

Oracle中补全时间的处理

在实际数据处理的过程中,存在日期不连续的问题,可能会导致数据传到前后端出现异常,为了避免这种问题,通常会从数据端进行日期不全的处理: 以下为补全年份的案例: with x as (select 开始年份 (…

MySQL中Binlog Redolog Undolog区别?

MySQL中Binlog Redolog Undolog区别 在学习MySQL数据库管理和优化的过程中,理解和区分Binlog(二进制日志)、RedoLog(重做日志)和UndoLog(撤销日志)是至关重要的。这三种日志在MySQL中扮演着不同…