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 文件夹下便会有每天的日志了。
分类:
Linux 服务器那些事
, Python常用方法
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了