蛮子哥 蛮子哥
首页
  • linux
  • windows
  • 中间件
  • 监控
  • 网络
  • 存储
  • 安全
  • 防火墙
  • 数据库
  • 系统
  • docker
  • 运维工具
  • other
  • elk
  • K8S
  • ansible
  • Jenkins
  • GitLabCI_CD
  • 随笔
  • 面试
  • 工具
  • 收藏夹
  • Shell
  • python
  • golang
友链
  • 索引

    • 分类
    • 标签
    • 归档
    • 首页 (opens new window)
    • 关于我 (opens new window)
    • 图床 (opens new window)
    • 评论 (opens new window)
    • 导航栏 (opens new window)
周刊
GitHub (opens new window)

蛮子哥

业精于勤,荒于嬉
首页
  • linux
  • windows
  • 中间件
  • 监控
  • 网络
  • 存储
  • 安全
  • 防火墙
  • 数据库
  • 系统
  • docker
  • 运维工具
  • other
  • elk
  • K8S
  • ansible
  • Jenkins
  • GitLabCI_CD
  • 随笔
  • 面试
  • 工具
  • 收藏夹
  • Shell
  • python
  • golang
友链
  • 索引

    • 分类
    • 标签
    • 归档
    • 首页 (opens new window)
    • 关于我 (opens new window)
    • 图床 (opens new window)
    • 评论 (opens new window)
    • 导航栏 (opens new window)
周刊
GitHub (opens new window)
  • python

  • shell

    • 进程pid判断脚本
    • 日志切割脚本
      • 加强版脚本
    • 设置跳板机脚本
    • 编写启动、停止、重启的脚本
    • mysql数据库备份的三种方式
    • jenkins编译服务脚本
    • app编译脚本
    • 常用shell脚本
    • 字符串的截取拼接
    • shell基础
    • centos7主机安全检测脚本和初始化脚本
    • 应用服务重启脚本
    • shell重启python程序脚本
    • rancher的证书制作脚本
    • shell常用脚本集合
    • mysql常用的脚本集合
    • shell批量部署安装包并启动
    • 批量添加定时任务
    • mysql备份企业示例
    • shell脚本创建出色用户体验的6种技巧
    • 多系统一键部署zabbix6脚本(已验证)
    • 批量拿取多台服务器的日志文件
    • shell脚本模块集合
    • 测试和生产脚本样例参考
  • go

  • 编程
  • shell
蛮子哥
2022-12-15
目录

日志切割脚本

# 日志切割脚本

脚本如下

注:安装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

# 加强版脚本

功能如下

  • 按大小切割
  • 按时间切割
  • 自动压缩
  • 自动清理
  • 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

# 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
微信 支付宝
上次更新: 2026/01/20, 13:59:30

← 进程pid判断脚本 设置跳板机脚本→

最近更新
01
导航栏
01-28
02
pr剪辑软件
01-22
03
运维面试题
01-22
更多文章>
Theme by Vdoing | Copyright © 2019-2026 | 点击查看十年之约 | 鄂ICP备2024072800号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式