影刀RPA 日志归档自动化:按天压缩与过期清理
影刀RPA 日志归档自动化按天压缩与过期清理作者林焱 | 分类影刀RPA新手教程 | 难度★★什么情况用服务器日志、应用日志、Nginx访问日志如果不定期归档清理磁盘很快就满了。一个中等规模的Web应用每天可能产生几十GB的日志。手动登录服务器逐个目录压缩归档再删除过期日志重复枯燥且容易误删。用影刀RPA定时登录服务器执行日志归档策略按天压缩、按月归档、自动清理90天以上的旧日志。怎么做第一步定义归档策略店群矩阵自动化突破运营极限在配置表中定义日志归档规则目录日志类型归档周期保留天数操作/var/log/nginx/Nginx访问日志每天30天压缩归档/var/log/app/应用日志每周90天压缩归档/tmp/logs/临时日志每天7天直接删除/data/backup/logs/备份日志每月365天压缩远程备份第二步登录服务器执行归档# 影刀Python节点通过SSH执行归档操作importparamikofromdatetimeimportdatetime,timedelta SERVER_CONFIG{host:192.168.1.10,port:22,user:ops,key_file:C:/Users/ops/.ssh/id_rsa,# SSH密钥}defarchive_logs(server,log_dir,pattern,days_to_keep,archive_typecompress):归档指定目录的日志文件sshparamiko.SSHClient()ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())ssh.connect(**server)commands[]cutoff_datedatetime.now()-timedelta(daysdays_to_keep)cutoff_strcutoff_date.strftime(%Y%m%d)ifarchive_typecompress:# 压缩7天前的日志compress_date(datetime.now()-timedelta(days7)).strftime(%Y%m%d)cmdf cd{log_dir}for f in $(find . -name {pattern} -mtime 7 -not -name *.gz); do gzip $f echo Compressed: $f done commands.append(cmd)# 删除过期日志cmd_deletef cd{log_dir}find . -name {pattern} -mtime {days_to_keep}-delete echo Deleted logs older than{days_to_keep}days commands.append(cmd_delete)results[]forcmdincommands:stdin,stdout,stderrssh.exec_command(cmd)outputstdout.read().decode()errorsstderr.read().decode()results.append({command:cmd[:80],output:output,errors:errors,})ssh.close()returnresults# 执行归档forruleinlog_rules:resultarchive_logs(SERVER_CONFIG,rule[目录],rule[pattern],rule[保留天数],)# 统计forrinresult:linesr[output].strip().split(\n)iflines:print(f{rule[目录]}:{len(lines)}个文件已处理)第三步磁盘空间检查# 影刀Python节点归档前后磁盘空间对比defcheck_disk_usage(server,mount_point/):检查磁盘使用率sshparamiko.SSHClient()ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())ssh.connect(**server)stdin,stdout,stderrssh.exec_command(fdf -h{mount_point})outputstdout.read().decode()# 解析df输出linesoutput.strip().split(\n)iflen(lines)2:partslines[1].split()usage_pctint(parts[4].replace(%,))ssh.close()return{总量:parts[1],已用:parts[2],可用:parts[3],使用率:usage_pct,告警:usage_pct80,}ssh.close()returnNone# 归档前检查beforecheck_disk_usage(SERVER_CONFIG)print(f归档前使用率{before[使用率]}%)# 执行归档...# 归档后检查aftercheck_disk_usage(SERVER_CONFIG)freedbefore[使用率]-after[使用率]print(f归档后使用率{after[使用率]}% 释放了约{freed}%的磁盘空间)ifafter[使用率]80:print(f⚠️ 磁盘使用率仍高于80%{after[使用率]}%)第四步远程备份重要日志# 影刀Python节点将重要日志同步到OSS/文件服务器importboto3# AWS S3 SDKdefbackup_to_s3(local_log_dir,s3_bucket,s3_prefix):将本地日志上传到S3做长期备份s3boto3.client(s3)importos uploaded0forroot,dirs,filesinos.walk(local_log_dir):forfileinfiles:iffile.endswith(.gz):# 只上传已压缩的local_pathos.path.join(root,file)s3_keyf{s3_prefix}/{file}s3.upload_file(local_path,s3_bucket,s3_key)uploaded1returnf已上传{uploaded}个文件到 s3://{s3_bucket}/{s3_prefix}# 或者用rsync同步到备份服务器defrsync_to_backup(source,dest_server,dest_path):rsync同步到备份服务器cmdfrsync -avz --progress{source}/{dest_server}:{dest_path}/resultsubprocess.run(cmd,shellTrue,capture_outputTrue,textTrue)returnresult.stdout第五步生成归档报告defgenerate_archive_report(results,before_disk,after_disk):生成日志归档日报reportf ## 日志归档日报 ({datetime.now().strftime(%Y-%m-%d)}) ### 磁盘空间 - 归档前{before_disk[使用率]}% ({before_disk[可用]}可用) - 归档后{after_disk[使用率]}% ({after_disk[可用]}可用) - 释放空间约{before_disk[使用率]-after_disk[使用率]}% -  ### 归档明细 forrinresults:reportf-{r[目录]}{r[操作]}→{r[文件数]}个文件\nreturnreport影刀【企微推送】给运维团队。有什么坑坑1误删正在写入的日志temu店群自动化报活动案例如果应用正在往日志文件里写直接gzip或删除会导致应用报错或丢日志。压缩时用find ... -mtime 7确保只处理7天前已关闭的日志。同时检查lsof | grep deleted确认没有被进程占用的已删除文件。坑2SSH密钥权限问题Windows上的SSH密钥文件权限可能太开放paramiko会拒绝使用。需要设置正确的权限。如果觉得SSH麻烦改用影刀的【运行Python脚本】在本地执行通过API调用目标服务器上的归档脚本。坑3压缩大文件很慢一个几十GB的Nginx日志文件gzip可能要压缩几分钟。在这期间SSH连接可能超时断开。建议用nohup后台执行或者用Python的多线程分片压缩。坑4没有日志的日志归档操作本身应该留下操作记录什么时间、谁RPA机器人、执行了什么操作、影响了哪些文件。如果某天发现日志丢了可以通过审计日志追溯是不是被RPA删了。坑5不同服务器的日志路径不同如果有20台服务器每台的日志路径都可能不一样有的在/var/log/、有的在/data/logs/、有的在自定义路径。需要为每台服务器单独维护归档配置而不是一套规则用到底。总结日志归档看似简单难点在于不能影响正在运行的服务。压缩/删除之前必须确认文件没有被占用操作后要检查磁盘空间是否真的释放了。RPA把这些检查自动化比人工手动操作安全得多。