当前位置: 首页 > news >正文

nginx日志分割


详细步骤

第零步:准备工作(创建脚本目录)

我们先把要用的脚本放在一个专门的目录里,方便管理。

# 在 web 用户家目录下创建一个名为 scripts 的目录
mkdir -p /home/web/scripts# 进入这个目录
cd /home/web/scripts
第一步:编写日志切割脚本

这是核心步骤。我们将创建一个 shell 脚本,来完成之前 logrotate 所做的所有事情。

  1. 创建脚本文件

    # 使用 vim 或 nano 创建脚本文件
    vim rotate_nginx_logs.sh
    
  2. 粘贴以下脚本内容

    请将下面所有的代码完整地复制并粘贴到 rotate_nginx_logs.sh 文件中。

    #!/bin/bash# =================================================================
    # Nginx Log Rotation Script for non-root users
    # Author: Your Name
    # =================================================================# --- 配置区 ---
    # 你的 Nginx 日志文件所在目录
    LOGS_PATH="/home/web/nginx/logs"# 你的 Nginx PID 文件路径
    PID_FILE="$LOGS_PATH/nginx.pid"# 保留多少天的日志(例如,保留14天的压缩日志)
    RETAIN_DAYS=14
    # --- 配置区结束 ---# --- 执行区 ---
    # 检查日志目录是否存在
    if [ ! -d "$LOGS_PATH" ]; thenecho "错误: 日志目录 $LOGS_PATH 不存在。"exit 1
    fi# 检查 PID 文件是否存在
    if [ ! -f "$PID_FILE" ]; thenecho "错误: Nginx PID 文件 $PID_FILE 未找到。"exit 1
    fi# 1. 移动(重命名)当前的日志文件
    # 使用昨天的日期来命名备份文件,更符合常规
    YESTERDAY=$(date -d "yesterday" +%Y-%m-%d)
    mv "$LOGS_PATH/access.log" "$LOGS_PATH/access.log-${YESTERDAY}"
    mv "$LOGS_PATH/error.log" "$LOGS_PATH/error.log-${YESTERDAY}"# 2. 通知 Nginx 重新生成新的日志文件
    # 这是最关键的一步,与之前手动操作完全一样
    kill -USR1 $(cat "$PID_FILE")# 等待一小会儿,确保新日志文件已创建
    sleep 5# 3. 压缩刚刚移动的旧日志文件
    gzip "$LOGS_PATH/access.log-${YESTERDAY}"
    gzip "$LOGS_PATH/error.log-${YESTERDAY}"# 4. 删除超过保留天数的旧日志文件
    # find 命令会查找所有超过 RETAIN_DAYS 天的 .gz 文件并删除它们
    find "$LOGS_PATH" -name "*.log-*.gz" -mtime +$RETAIN_DAYS -exec rm -f {} \;echo "Nginx 日志切割完成。"
    # --- 执行区结束 ---
    
  3. 保存并退出
    vim 中,按 ESC,然后输入 :wq 并回车。

第二步:给脚本添加执行权限

创建的脚本默认是没有执行权限的,我们需要给它加上。

# 确保你还在 /home/web/scripts 目录下
chmod +x rotate_nginx_logs.sh

现在你可以试着手动运行一下这个脚本,看看它是否能正常工作:

./rotate_nginx_logs.sh

如果一切正常,它会切割当前的日志,并输出 “Nginx 日志切割完成”。

第三步:设置定时任务 (Cron Job)

这是实现“自动化”的关键。我们将使用 crontab 命令来为 web 用户添加一个定时任务。

  1. 编辑当前用户的 crontab

    crontab -e
    

    第一次运行时,系统可能会让你选择一个默认的文本编辑器(如 nanovim),推荐选择 nano,因为它对新手更友好。

  2. 添加定时任务规则

    在打开的文件的最末尾,添加新的一行,内容如下:

    # 每天凌晨 00:01 执行 Nginx 日志切割脚本
    01 00 * * * /home/web/scripts/rotate_nginx_logs.sh > /dev/null 2>&1
    
  3. 规则解释

    • 01 00 * * *: 这是 cron 的时间格式,代表“每天的 00 点 01 分”。(分钟 小时 日 月 周)
    • /home/web/scripts/rotate_nginx_logs.sh: 这是要执行的脚本的绝对路径。
    • > /dev/null 2>&1: 这部分的意思是,将脚本执行过程中所有正常的输出(>)和错误输出(2>&1)都重定向到“黑洞”(/dev/null)里。这样做可以防止 cron 因为脚本有输出而给你发送邮件,保持系统干净。
  4. 保存并退出

    • 如果你用的是 nano,按 Ctrl + X,然后会提示你是否保存,按 Y,最后按 Enter 确认文件名。
    • 如果你用的是 vim,按 ESC,然后输入 :wq 并回车。

    保存后,系统会提示 crontab: installing new crontab,这表示你的定时任务已经成功设置好了!


总结

现在,你已经成功地在没有 root 权限的情况下,建立了一套完全属于 web 用户的、功能完备的自动化日志切割系统。

从现在开始:

  1. 每天凌晨 00:01cron 会自动触发你的 rotate_nginx_logs.sh 脚本。
  2. 脚本会重命名前一天的日志,并通知 Nginx 创建新日志文件。
  3. 脚本会压缩重命名后的日志文件。
  4. 脚本会自动删除14天前的旧压缩日志。

你再也不需要手动管理这些日志文件了。

http://www.dtcms.com/a/303346.html

相关文章:

  • 11.Dockerfile简介
  • Java中的协变、逆变
  • 【AI绘画】Stable Diffusion webUI 与 ComfyUI 全解析:安装、模型、插件及功能对比
  • 使用宝塔“PostgreSQL管理器”安装的PostgreSQL,如何设置远程连接?
  • 开发避坑短篇(7):Vue+window.print()打印实践
  • Linux中配置haproxy
  • Java 笔记 serialVersionUID
  • 50etf的实值期权和虚值期权谁涨得快?
  • gdb调试教程
  • 图像轮廓与凸包
  • 网络编程接口htonl学习
  • 如何进行DAP-seq的数据挖掘,筛选验证位点
  • Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现面部口罩的检测识别(C#代码,UI界面版)
  • C++-关于协程的一些思考
  • json取值,如果字段不存在,匹配下一个字段
  • 自定义View学习记录 plinko游戏View
  • 恒坤新材IPO被暂缓审议:收入确认法遭质疑,募资缩水约2亿元
  • 元宇宙经济与数字经济的异同:虚实交织下的经济范式对比
  • 基于Springboot的宠物救助管理系统的设计与实现
  • 【VUE3】搭建项目准备工作
  • 艾格文服装软件怎么用?
  • Windows中查看GPU和Cuda信息的DOS命令总结
  • AI产品经理手册(Ch1-2)AI Product Manager‘s Handbook学习笔记
  • uvm sequence Arbitration
  • AI 驱动、设施扩展、验证器强化、上线 EVM 测试网,Injective 近期动态全更新!
  • git stash apply 冲突合并方法解决
  • 希尔排序(缩小增量排序)面试专题解析
  • unisS5800XP-G交换机配置命令之登录篇
  • 洛谷 P10448 组合型枚举-普及-
  • Visual Studio Code使用