本文目录导读:

- Linux/Unix 环境下 (Shell脚本 + Crontab)
- Python 版本 (跨平台)
- Windows 版本 (PowerShell)
- Node.js 版本
- Docker 环境 (推荐)
- 使用方法
- 安全建议
我来为您提供几种不同环境下实现定时清理聊天记录的脚本方案。
Linux/Unix 环境下 (Shell脚本 + Crontab)
Shell 清理脚本
#!/bin/bash # 聊天记录清理脚本 # 保存为:clean_chat_logs.sh # 配置变量 LOG_DIR="/var/log/chat" # 聊天记录目录 RETENTION_DAYS=7 # 保留天数 LOG_FILE="/var/log/chat_clean.log" # 清理日志 # 记录开始时间 echo "[$(date '+%Y-%m-%d %H:%M:%S')] 开始清理聊天记录" >> $LOG_FILE # 清理超过指定天数的文件 find $LOG_DIR -name "*.log" -type f -mtime +$RETENTION_DAYS -delete 2>>$LOG_FILE # 或者清理指定目录下的所有文件(谨慎使用) # find $LOG_DIR -type f -mtime +$RETENTION_DAYS -delete # 清理空目录 find $LOG_DIR -type d -empty -delete 2>>$LOG_FILE # 记录结束时间 echo "[$(date '+%Y-%m-%d %H:%M:%S')] 清理完成" >> $LOG_FILE echo "---" >> $LOG_FILE # 设置执行权限 # chmod +x clean_chat_logs.sh
添加到 Crontab 定时任务
# 编辑 crontab crontab -e # 添加以下行(每天凌晨2点执行) 0 2 * * * /path/to/clean_chat_logs.sh # 或者每6小时执行一次 0 */6 * * * /path/to/clean_chat_logs.sh
Python 版本 (跨平台)
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
聊天记录定时清理脚本
文件名:clean_chat_logs.py
"""
import os
import time
import logging
from datetime import datetime, timedelta
import schedule # 需要安装: pip install schedule
# 配置
CHAT_DIR = "./chat_logs" # 聊天记录目录
RETENTION_DAYS = 7 # 保留天数
LOG_FILE = "clean_log.txt"
# 设置日志
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(message)s',
handlers=[
logging.FileHandler(LOG_FILE, encoding='utf-8'),
logging.StreamHandler()
]
)
def clean_chat_logs():
"""清理过期聊天记录"""
try:
if not os.path.exists(CHAT_DIR):
logging.warning(f"目录不存在: {CHAT_DIR}")
return
cutoff_date = datetime.now() - timedelta(days=RETENTION_DAYS)
cleaned_count = 0
for filename in os.listdir(CHAT_DIR):
filepath = os.path.join(CHAT_DIR, filename)
# 跳过目录
if os.path.isdir(filepath):
continue
# 获取文件修改时间
file_time = datetime.fromtimestamp(os.path.getmtime(filepath))
# 删除过期文件
if file_time < cutoff_date:
os.remove(filepath)
cleaned_count += 1
logging.info(f"已删除: {filename}")
logging.info(f"清理完成,共删除 {cleaned_count} 个文件")
except Exception as e:
logging.error(f"清理过程中出错: {e}")
def clean_by_file_count(max_files=100):
"""按文件数量清理(保留最新文件)"""
try:
files = []
for filename in os.listdir(CHAT_DIR):
filepath = os.path.join(CHAT_DIR, filename)
if os.path.isfile(filepath):
files.append((filepath, os.path.getmtime(filepath)))
# 按修改时间排序
files.sort(key=lambda x: x[1], reverse=True)
# 删除超出限制的文件
if len(files) > max_files:
for filepath, _ in files[max_files:]:
os.remove(filepath)
logging.info(f"按数量限制删除: {os.path.basename(filepath)}")
except Exception as e:
logging.error(f"按数量清理出错: {e}")
# 定时任务设置
def run_scheduled_tasks():
"""运行定时任务"""
# 每天凌晨2点执行
schedule.every().day.at("02:00").do(clean_chat_logs)
# 每天凌晨3点执行按数量清理
schedule.every().day.at("03:00").do(clean_by_file_count, max_files=100)
# 或者每6小时执行一次
# schedule.every(6).hours.do(clean_chat_logs)
logging.info("定时清理任务已启动...")
while True:
schedule.run_pending()
time.sleep(60) # 每分钟检查一次
if __name__ == "__main__":
# 立即执行一次
clean_chat_logs()
# 启动定时任务
# run_scheduled_tasks()
# 或者使用更简单的方式:Windows任务计划/Linux cron
print("脚本配置完成")
Windows 版本 (PowerShell)
# 聊天记录清理脚本
# 文件名: Clean-ChatLogs.ps1
# 配置参数
$ChatLogPath = "C:\ChatLogs"
$RetentionDays = 7
$LogFile = "C:\Logs\chat_clean.log"
# 记录函数
Function Write-Log {
param([string]$Message)
$TimeStamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
"$TimeStamp - $Message" | Out-File -FilePath $LogFile -Append
}
# 清理函数
Function Clean-ChatLogs {
try {
# 获取过期文件
$CutoffDate = (Get-Date).AddDays(-$RetentionDays)
# 删除过期文件
Get-ChildItem -Path $ChatLogPath -File |
Where-Object { $_.LastWriteTime -lt $CutoffDate } |
Remove-Item -Force
# 删除空文件夹
Get-ChildItem -Path $ChatLogPath -Directory |
Where-Object { (Get-ChildItem $_.FullName -File).Count -eq 0 } |
Remove-Item -Force
Write-Log "清理完成"
}
catch {
Write-Log "错误: $_"
}
}
# 执行清理
Write-Log "开始清理"
Clean-ChatLogs
# 设置Windows任务计划程序示例命令:
# schtasks /create /tn "CleanChatLogs" /tr "powershell.exe -File C:\scripts\Clean-ChatLogs.ps1" /sc daily /st 02:00
Node.js 版本
// clean_chat.js
const fs = require('fs');
const path = require('path');
const schedule = require('node-schedule'); // 需要安装: npm install node-schedule
// 配置
const config = {
chatDir: './chat_logs',
retentionDays: 7,
logFile: './clean_log.txt'
};
// 日志函数
function log(message) {
const timestamp = new Date().toISOString();
const logMessage = `${timestamp} - ${message}\n`;
console.log(logMessage.trim());
fs.appendFileSync(config.logFile, logMessage);
}
// 清理函数
async function cleanChatLogs() {
try {
if (!fs.existsSync(config.chatDir)) {
log(`目录不存在: ${config.chatDir}`);
return;
}
const files = fs.readdirSync(config.chatDir);
const cutoffDate = new Date();
cutoffDate.setDate(cutoffDate.getDate() - config.retentionDays);
let cleanedCount = 0;
files.forEach(filename => {
const filepath = path.join(config.chatDir, filename);
const stats = fs.statSync(filepath);
if (stats.isFile() && stats.mtime < cutoffDate) {
fs.unlinkSync(filepath);
cleanedCount++;
log(`已删除: ${filename}`);
}
});
log(`清理完成,共删除 ${cleanedCount} 个文件`);
} catch (error) {
log(`错误: ${error.message}`);
}
}
// 定时任务设置
function setupSchedule() {
// 每天凌晨2点执行
schedule.scheduleJob('0 2 * * *', () => {
log('定时清理任务开始');
cleanChatLogs();
});
log('定时任务已设置');
}
// 立即执行一次
cleanChatLogs();
// 启动定时任务
// setupSchedule();
// 或者使用setInterval(简单定时)
// setInterval(cleanChatLogs, 6 * 60 * 60 * 1000); // 每6小时
module.exports = { cleanChatLogs, setupSchedule };
Docker 环境 (推荐)
# Dockerfile FROM alpine:latest RUN apk add --no-cache bash COPY clean_chat.sh /usr/local/bin/ RUN chmod +x /usr/local/bin/clean_chat.sh # 安装cron RUN apk add --no-cache dcron # 添加定时任务 RUN echo "0 2 * * * /usr/local/bin/clean_chat.sh" >> /var/spool/cron/crontabs/root # 启动crond CMD ["crond", "-f", "-l", "2"]
使用方法
Linux/Mac:
# 直接执行 ./clean_chat_logs.sh # 添加到crontab crontab -e 0 2 * * * /path/to/clean_chat_logs.sh
Windows:
# 执行PowerShell脚本 .\Clean-ChatLogs.ps1 # 通过任务计划程序设置定时
Docker:
# 构建镜像 docker build -t chat-cleaner . # 运行容器 docker run -d --name chat-cleaner \ -v /path/to/chat/logs:/var/log/chat \ chat-cleaner
安全建议
- 先测试再正式使用
- 保留备份:首次使用前备份聊天记录
- 设置日志:记录清理操作以便审计
- 权限控制:确保脚本只有必要的权限
- 正则匹配:如果需要清理特定格式文件
请根据您的具体环境和需求选择合适的脚本,并确保在测试环境中充分测试后再部署到生产环境。