#!/bin/bash COMPOSE_PATH="/data/ir/" LOG_BASE="/data/fi/logs/container_logs" yml="fi.yml" mkdir -p "${LOG_BASE}" cd "${COMPOSE_PATH}" || { echo "ERROR: 无法进入目录 ${COMPOSE_PATH}" exit 1 } PID_FILE="${LOG_BASE}/collect.pid" > "${PID_FILE}" echo "正在读取服务列表..." SERVICES=$(docker-compose -f "${yml}" config --services) echo "${SERVICES}" for svc in ${SERVICES}; do logfile="${LOG_BASE}/${svc}.log" echo "启动采集:${svc} -> ${logfile}" # --since now 只采集启动后新增日志 nohup docker-compose -f "${yml}" logs -f -t "${svc}" >> "${logfile}" & echo $! >> "${PID_FILE}" sleep 0.2 done echo "========================================" echo "日志输出目录:${LOG_BASE}" echo "进程PID文件:${PID_FILE}" echo "========================================"#!/bin/bash LOG_BASE="/data/finicr/container_logs" pkill -f "docker-compose -f fin.yml logs -f" pkill -f "collect.sh" # 杀掉所有日志采集子进程 pkill -f "docker-compose -f f0.yml logs -f" rm -f "${LOG_BASE}/collect.pid" echo "采集进程已全部停止"mkdir -p /data/f/shell目录存放脚本log_stop.sh log_collect.sh log_backup.sh 使用root编辑 这个文件vim /etc/logrotate.d/icr-container-log 添加如下内容 /data/fcr/logs/container_logs/*.log { daily dateext dateformat .%Y%m%d rotate 30 compress copytruncate missingok notifempty create 0644 or or su ocr ocr lastaction TODAY=$(date +%Y%m%d) DIR="/data/fcr/logs/${TODAY}" mkdir -p "${DIR}" chown xyd:xyd "${DIR}" chmod 755 "${DIR}" find /data/cr/logs/container_logs -maxdepth 1 -type f -name "*.log.${TODAY}.gz" -exec mv {} "${DIR}/" \; endscript } 使用or用户执行 logrotate -vf -s /tmp/logrotate-state /etc/logrotate.d/cr-container-log 查看/data/fr/logs/下面是否按照日期生成文件夹 文件夹下面是否存在压缩日志 给普通用户ocr添加定时任务 执行 crontab -e -u or 添加: # 每日02:00 执行日志轮转,使用独立状态文件避免权限报错 0 2 * * * /usr/sbin/logrotate -s /data/fin/logs/logrotate.state /etc/logrotate.d/fcr-container-log >> /data/fcr/logs/logrotate_run.log 2>&1 # 每日03:00 统一执行:远程备份当日日志 + 清理本地过期目录 #0 3 * * * /data/finicr/shell/log_backup_and_clean.sh#!/bin/bash # 每日03:00 统一执行:远程备份当日日志 + 清理本地过期目录 #0 3 * * * /data/f/shell/log_backup_and_clean.sh ########################### 【可自定义参数区】########################### LOG_ROOT="/data/f/logs" LOCAL_RETENTION_DAYS=15 # 本地归档目录保留天数,按需修改 REMOTE_USER="ocr" REMOTE_HOST="远程服务器地址" REMOTE_BASE_PATH="/data/f_backup/logs" ######################################################################### TODAY=$(date +%Y%m%d) LOCAL_TODAY_DIR="${LOG_ROOT}/${TODAY}" LOG_FILE="${LOG_ROOT}/backup_clean_run.log" log_print(){ echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "${LOG_FILE}" } log_print "========== 任务开始 ==========" ## 步骤1:备份当日归档目录 if [ -d "${LOCAL_TODAY_DIR}" ]; then log_print "开始备份目录:${LOCAL_TODAY_DIR}" rsync -avz "${LOCAL_TODAY_DIR}/" "${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_BASE_PATH}/${TODAY}/" if [ $? -eq 0 ]; then log_print "✅ ${TODAY} 日志远程备份成功" else log_print "❌ ${TODAY} 日志远程备份失败" fi else log_print "⚠️ 当日归档目录 ${LOCAL_TODAY_DIR} 不存在,跳过备份" fi ## 步骤2:清理本地超过 N 天的日期归档文件夹 log_print "开始清理本地超过 ${LOCAL_RETENTION_DAYS} 天的归档目录" find "${LOG_ROOT}" -maxdepth 1 -type d -regex ".*/[0-9]{8}" -mtime +${LOCAL_RETENTION_DAYS} -exec rm -rf {} \; log_print "本地清理执行完成" log_print "========== 任务结束 ==========\n"