#创作灵感#
22年写的一个小脚本,当时不会什么特殊语法,都是用的基础语句写出来的,但这几年也算是频繁用到这个脚本,在部署nginx的本机上运行即可
1、脚本功能
这个脚本是用来处理Nginx日志的,主要功能包括:
1.设置日志目录变量:LOG_DIR为Nginx日志存储目录。
2.获取昨天的日期和月份。
3.拷贝日志文件到对应的日期目录:日志文件移动到以昨天的月份命名的目录下,并在目录名后面添加时间戳。
4.发送信号给Nginx以重新打开日志文件。
2、脚本代码
#!/bin/bash
# 定义日志存储目录
LOG_DIR="/usr/local/nginx/logs"
# 获取昨天的日期和月份
YESTERDAY_DATE=$(date -d "yesterday" +%F) # 昨天的日期,格式为 YYYY-MM-DD
LOG_MONTH_DIR=$(date -d "yesterday" +%Y-%m) # 昨天的月份,格式为 YYYY-MM
# 需要处理的日志文件列表,可以根据实际情况添加更多日志文件
LOG_FILE_LIST="default.access.log"
# 遍历日志文件列表
for LOG_FILE in $LOG_FILE_LIST; do
# 创建存放昨天日志的目录,如果目录不存在的话
if [ ! -d "$LOG_DIR/$LOG_MONTH_DIR" ]; then
mkdir -p "$LOG_DIR/$LOG_MONTH_DIR"
fi
# 构建新的日志文件路径,包括日期和时间戳
NEW_LOG_FILE="$LOG_DIR/$LOG_MONTH_DIR/${LOG_FILE}_${YESTERDAY_DATE}"
# 移动日志文件到新的路径
mv "$LOG_DIR/$LOG_FILE" "$NEW_LOG_FILE"
# 输出日志文件移动信息
echo "Moved $LOG_DIR/$LOG_FILE to $NEW_LOG_FILE"
done
# 向Nginx主进程发送信号,重新打开日志文件
if [ -f /var/run/nginx.pid ]; then
kill -USR1 $(cat /var/run/nginx.pid)
echo "Sent USR1 signal to Nginx for log rotation."
else
echo "Nginx PID file not found, skipping log rotation signal."
fi
3、注释详细解释
因需标注点很多,为了不影响可读性,我将较简单的语句注释写在这里方便阅读
- LOG_DIR="/usr/local/nginx/logs":这是Nginx日志文件的存储目录。通常情况下,自动安装的Nginx的日志文件会存储在这个目录下。
- YESTERDAY_DATE=$(date -d "yesterday" +%F):这个命令使用date工具获取昨天的日期,并将其格式化为YYYY-MM-DD的形式,存储在YESTERDAY_DATE变量中。这个变量后续用于构建新的日志文件路径。
- LOG_MONTH_DIR=$(date -d "yesterday" +%Y-%m):同样是使用date命令获取昨天的日期,但这里是将其格式化为YYYY-MM的形式,用于创建存放昨天日志的目录。
- LOG_FILE_LIST="default.access.log":这是需要处理的日志文件列表。在这篇文章中,只有一个日志文件default.access.log,但你可以根据需要添加更多的日志文件。
- for LOG_FILE in $LOG_FILE_LIST; do:这是一个循环语句,用于遍历日志文件列表中的每个日志文件。
- if [ ! -d "$LOG_DIR/$LOG_MONTH_DIR" ]; then:这个条件语句检查存放昨天日志的目录是否存在,如果不存在,则使用mkdir -p命令创建。
- NEW_LOG_FILE="$LOG_DIR/$LOG_MONTH_DIR/${LOG_FILE}_${YESTERDAY_DATE}":这行代码调用变量构建了新的日志文件路径。它包括了昨天的日期和时间戳,以及原始日志文件的名称。
- mv "$LOG_DIR/$LOG_FILE" "$NEW_LOG_FILE":这行代码将原始日志移动到新的路径,实现了按日期归档日志。
- kill -USR1 $(cat /var/run/nginx.pid):这行代码向Nginx主进程发送了USR1信号。-USR1:这是kill命令的选项之一,用于指定要发送的信号类型。USR1信号是Nginx中重新打开日志文件的信号。会重新打开日志文件,实现日志切割和归档的目的。