uwsgi 的 log 分割方法

1. 指定 touch-logreopen 文件

复制代码
[uwsgi]
socket = 0.0.0.0:23288
processes = 4
threads = 1
master = true
pythonpath = /app/aiphoto/ai_photo
module = aiphoto
callable = app
env = AIPHOTO=Production
#env = AIPHOTO_SERVER_NAME=https://aiphoto.howfun.tv
env = AIPHOTO_APP=True
buffer-size = 32768
logto = /app/aiphoto/logs/uwsgi/aiphoto.log
pidfile = /app/aiphoto/logs/uwsgi/aiphoto_uwsgi.pid
#memory-report = true
gevent=512
gevent-monkey-patch=true
touch-logreopen = /app/aiphoto/logs/uwsgi/touchforlogrotate #对应的目录建立此文件,防止压缩过程中日志写入不成功
复制代码

 

这里我们指定日志文件就在项目目录下叫 uwsgi.daemonize.log,监听项目目录下的 touchforlogrotate 文件,如果文件发生变化,就重新打开日志,再 touch 一下 touchforlogrotate,之前的文件便停止写入

 

2. 自动脚本

自动压缩脚本

复制代码
# # -*- coding: utf8 -*-
"""
新建touchlog 防止压缩后日志出现中断的情况
"""
import os
import shutil
import glob
import time
import gzip
import argparse


def rotate_to_gz(source, limit=0):
    if os.path.exists(source):
        target = "%s.%s.gz" % (source, time.strftime("%Y-%m-%d_%H-%M-%S"))
        new_name = "{}_1".format(source)
        shutil.move(source,new_name)
        # cmd = "mv {} {}".format(source, new_name)
        # os.popen(cmd).readlines()

        #touchfile = "/data/ai_photo/logs/uwsgi/touchforlogrotate"  # 新建touchlog 防止压缩后日志出现中断的情况
        touchfile = args.touchforlogrotate # 新建touchlog 防止压缩后日志出现中断的情况
        touch_cmd = "touch {}".format(touchfile)

        os.popen(touch_cmd).readlines()
        with open(new_name, 'rb') as fin, gzip.open(target, 'wb') as fout:
            shutil.copyfileobj(fin, fout)

        # limit file number
        if limit > 0:
            rm_files = sorted(glob.glob(
                '%s.[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]' % source +
                '_[0-9][0-9]-[0-9][0-9]-[0-9][0-9].gz'))[:-limit]
            for f in rm_files:
                delete_file(f)


def delete_file(file):
    if os.path.exists(file):
        os.remove(file)


def main():
    # rotate_by_date = ["/data/ai_photo/logs/uwsgi/aiphoto.log"]
    rotate_by_date = [args.aiphoto_log_src]

    # rotate stdout and stderr by size
    for f in rotate_by_date:
        try:
            if os.path.exists(f):
                # file size > 1GB, backupCount=5
                rotate_to_gz(f, 7)
        except BaseException:
            print("rotate %s error", f)


if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="ai_photo log back")
    parser.add_argument('aiphoto_log_src')  # 日志路径
    parser.add_argument('touchforlogrotate')  # 新建touchlog 防止压缩后日志出现中断的情况
    args = parser.parse_args()

    main()
复制代码

 

 

3. crontab 定时调用

#定时脚本命令推荐放到root用户下执行
00 00 * * * cd /app/aiphoto/ai_photo && python aiphoto/maintenances/rotate_logs.py /app/aiphoto/logs/uwsgi/aiphoto.log  /app/aiphoto/logs/uwsgi/touchforlogrotate >/tmp/rotate_logs.cron 2>&1

 

好了,重启 uwsgi,logs 文件夹下便会有每天的日志了。

 

posted on   星河赵  阅读(749)  评论(0编辑  收藏  举报

编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示