日志切割脚本
# 日志切割脚本
脚本如下
注:安装zip命令
#!/bin/bash
loglist=`ls -l /data/applications/*.log |awk -F '/' '{print $NF}'`
logdate=`date "+%Y%m%d"`
for logname in $loglist
do
zip -r /data/applications/logs/"$logname"-"$logdate".zip /data/applications/$logname
echo "" > /data/applications/$logname
done
find /data/applications/logs/* -mtime +60 -exec rm {} \;
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# 加强版脚本
功能如下
- 按大小切割
- 按时间切割
- 自动压缩
- 自动清理
- crontab定时
#!/bin/bash
# =========================================================
# 日志轮转与清理脚本
# 功能:
# - 按大小/时间切割日志
# - 历史日志自动压缩
# - 超期 & 超量自动清理
# =========================================================
set -euo pipefail
# ---------------- 基础配置 ----------------
LOG_FILES=(
"/opt/apps/lightpicture/nginx.log/access.log"
"/opt/apps/lightpicture/nginx.log/error.log"
)
ROTATE_MODE="size" # size | time
MAX_SIZE="10M"
ROTATE_INTERVAL="daily" # daily | weekly | monthly
MAX_BACKUP_COUNT=30
COMPRESS_ENABLE=true
COMPRESS_TYPE="gzip" # gzip | bzip2
EXPIRE_DAYS=7
SCRIPT_LOG="/opt/apps/script_log/log_rotate_script.log"
# ---------------- 日志函数 ----------------
log() {
local level=$1
local msg=$2
local ts
ts=$(date "+%F %T")
echo "[$ts] [$level] $msg" | tee -a "$SCRIPT_LOG"
}
# ---------------- 工具函数 ----------------
size_to_bytes() {
local s=$1
local num unit
num=$(echo "$s" | grep -oE '^[0-9]+')
unit=$(echo "$s" | grep -oE '[KMG]$' || true)
case "$unit" in
K) echo $((num * 1024)) ;;
M) echo $((num * 1024 * 1024)) ;;
G) echo $((num * 1024 * 1024 * 1024)) ;;
*) echo"$num" ;;
esac
}
signal_process() {
local logfile=$1
local proc
proc=$(basename "${logfile%.log}")
pgrep -f "$proc" | xargs -r kill -USR1 || true
}
compress_file() {
local f=$1
case "$COMPRESS_TYPE" in
gzip) gzip "$f" ;;
bzip2) bzip2 "$f" ;;
*) log WARN "不支持压缩格式 $COMPRESS_TYPE" ;;
esac
}
# ---------------- 清理逻辑 ----------------
clean_expire_logs() {
local logfile=$1
local dir base
dir=$(dirname "$logfile")
base=$(basename "$logfile")
find "$dir" -maxdepth 1 -name "$base.*" -type f -mtime +"$EXPIRE_DAYS" -delete
log INFO "已清理 $EXPIRE_DAYS 天前日志: $base"
}
clean_count_logs() {
local logfile=$1
local dir base
dir=$(dirname "$logfile")
base=$(basename "$logfile")
ls -t "$dir/$base".* 2>/dev/null | tail -n +$((MAX_BACKUP_COUNT + 1)) | xargs -r rm -f
log INFO "已限制 $base 历史日志数量 <= $MAX_BACKUP_COUNT"
}
# ---------------- 按大小轮转 ----------------
rotate_by_size() {
local logfile=$1
[ -f "$logfile" ] || { log WARN "$logfile 不存在"; return; }
local max current
max=$(size_to_bytes "$MAX_SIZE")
current=$(stat -c %s "$logfile")
if [ "$current" -lt "$max" ]; then
log INFO "$logfile 未达阈值,跳过"
return
fi
local ts backup
ts=$(date +%Y%m%d%H%M%S)
backup="${logfile}.${ts}"
mv "$logfile" "$backup"
signal_process "$logfile"
log INFO "切割完成: $backup"
$COMPRESS_ENABLE && compress_file "$backup"
clean_expire_logs "$logfile"
clean_count_logs "$logfile"
}
# ---------------- 按时间轮转 ----------------
rotate_by_time() {
local logfile=$1
[ -f "$logfile" ] || { log WARN "$logfile 不存在"; return; }
case "$ROTATE_INTERVAL" in
daily) ts=$(date +%Y%m%d) ;;
weekly) ts=$(date +%Y%U) ;;
monthly) ts=$(date +%Y%m) ;;
*) log ERROR "非法周期"; exit 1 ;;
esac
local backup="${logfile}.${ts}"
[ -f "$backup" ] || [ -f "$backup.$COMPRESS_TYPE" ] && {
log INFO "已切割,跳过"
return
}
mv "$logfile" "$backup"
signal_process "$logfile"
log INFO "时间切割完成: $backup"
$COMPRESS_ENABLE && compress_file "$backup"
clean_expire_logs "$logfile"
clean_count_logs "$logfile"
}
# ---------------- 主入口 ----------------
log INFO "日志轮转开始 mode=$ROTATE_MODE"
for f in "${LOG_FILES[@]}"; do
case "$ROTATE_MODE" in
size) rotate_by_size "$f" ;;
time) rotate_by_time "$f" ;;
*) log ERROR "未知模式 $ROTATE_MODE"; exit 1 ;;
esac
done
log INFO "日志轮转结束"
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
# php日志压缩
#!/bin/bash
LOG_DIR="/opt/apps/get_docker/get_web_php_server/php.log"
DATE=$(date -d "yesterday" +"%Y-%m-%d")
cd $LOG_DIR
#压缩php日志
tar -zcf fpm-fcgi-laravel-$DATE.tar.gz fpm-fcgi-laravel-$DATE.log
#删除原始日志文件
rm -rf fpm-fcgi-laravel-$DATE.log
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
上次更新: 2026/01/20, 13:59:30
|