Skip to content

3. Linux日志配置

定期压缩日志文件

可以添加到crontab里自动执行

bash
#!/bin/bash

# 接收目标目录参数,如果未提供则使用当前目录
TARGET_DIR="${1:-.}"

if [ ! -d "$TARGET_DIR" ]; then
    echo "错误: 目录 $TARGET_DIR 不存在"
    exit 1
fi

# 进入目标目录
cd "$TARGET_DIR" || exit 1

# 获取今天的日期,格式为 YYYYMMDD
TODAY=$(date +%Y%m%d)
echo "提示: 今天日期为 $TODAY,文件名包含该日期的 txt 文件将被保留。"

found=0

# 查找所有不包含当天日期的 txt 文件,并逐个处理(支持带空格的文件名)
find . -maxdepth 1 -name "*.txt" ! -name "*${TODAY}*" -print0 | while IFS= read -r -d '' file; do
    found=1
    # 去除开头的 ./
    filename="${file#./}"
    archive_name="${filename}.tar.gz"
    
    echo "----------------------------------------"
    echo "正在处理: $filename"
    
    # 将单个文件打包为独立的 tar.gz
    tar -zcvf "$archive_name" "$filename"
    
    # 检查打包是否成功,成功后才删除原 txt 文件
    if [ $? -eq 0 ]; then
        echo "压缩成功,正在删除原文件: $filename"
        rm "$filename"
    else
        echo "错误: $filename 压缩失败,未删除原文件。"
    fi
done

if [ "$found" -eq 0 ]; then
    echo "提示: 没有找到需要压缩的 txt 文件(可能不存在,或者所有文件都包含今天的日期)。"
else
    echo "----------------------------------------"
    echo "所有符合条件的文件处理完成!"
fi

crontab日志堆积问题

nano /etc/logrotate.d/my_cron_jobs 去掉里边的 /var/log/cron

nano /etc/logrotate.d/my_cron_jobs 填入

yaml
/etc/logrotate.d/cron

/var/log/cron {
    # 每天切割
    daily
    # 保留最近60份切割文件
    rotate 60
    maxage 60
    # 单文件 200M 时自动切割并压缩
    size 200M
    compress
    missingok
    sharedscripts
    postrotate
        /usr/bin/systemctl -s HUP kill rsyslog.service >/dev/null 2>&1 || true

    endscript

}