我在 /var/log 中有一个这样的文件夹结构:
.
├── customers
│ ├── core00001
│ │ ├── 2016.07.21
│ │ │ ├── apache.log
│ │ │ └── error.log
│ │ └── 2016.07.22
│ │ ├── apache.log
│ │ └── error.log
│ ├── core00002
│ │ ├── 2016.07.21
│ │ │ ├── apache.log
│ │ │ └── error.log
│ │ └── 2016.07.22
│ │ ├── apache.log
│ │ └── error.log
│ ├── dashboard001
│ │ ├── 2016.07.21
│ │ │ ├── dash.log
│ │ │ └── error.log
│ │ └── 2016.07.22
│ │ ├── dash.log
│ │ └── error.log
│ └── dashboard002
│ ├── 2016.07.21
│ │ ├── dash.log
│ │ └── error.log
│ └── 2016.07.22
│ ├── dash.log
│ └── error.log
└── servers
├── server01
│ ├── 2016.07.21
│ │ ├── access.log
│ │ └── system.log
│ └── 2016.07.22
│ ├── access.log
│ └── system.log
└── server02
├── 2016.07.21
│ ├── access.log
│ └── system.log
└── 2016.07.22
├── access.log
└── system.log
对于这些文件夹,我需要进行某种日志轮换。这不是真正的日志轮换,但我需要在一定天数后压缩并删除文件。我想制作一个配置文件,在其中可以输入文件需要压缩的天数以及文件和空文件夹需要删除的天数。
核心和服务器可以增加,每个服务器都可以添加日志文件名。出于这个原因,我想到使用带有 bash 脚本的配置文件,这样我就可以在这里添加名称。
我对配置文件的第一个想法是这样的:
Zip;Delete;Main;Sub;App
7;365;/customers;core*;/apache.log
7;365;/customers;core*;/error.log
7;180;/customers;dash*;/dash.log
7;180;/customers;dash*;/error.log
28;365;/servers;server*;/access.log
14;365;/servers;server*;/error.log
我的问题在于,我不知道如何在没有任何帮助的情况下完成此任务。
我已经尝试创建一个循环来读取配置文件,但只会读取 1 行并且脚本会停止。
#!/bin/bash
configfile="/etc/customlogrotate/logrotation.conf"
logbasefolder="/var/log"
echo " " > log.txt
echo " " >> log.txt
echo "Starting logrotation script" >> log.txt
while IFS=';' read -r daysafterzip daystosave sectionfolder logfilename
do
echo "$daysafterzip $daystosave $logbasefolder$sectionfolder$logfilename" >> log.txt
cd $logbasefolder
done < "$configfile"
编辑:谢谢回复。我终于设法让它与 $logfile 变量一起工作了。
我现在使用这个脚本(没有日志文件变量,因为现在一切正常):
#!/bin/bash
# This file is managed by Ansible - Contact SysAdmin for changes!!
# file: roles/syslog-ng/templates/logrotation.sh.j2
configfile="/etc/customlogrotate/logrotation.conf"
logbasefolder="/var/log"
# Move to logbasefolder
cd $logbasefolder
# Loop all options from the configfile
while IFS=';' read -r daystozip daystodelete sectionfolder subsectionfolder logfilename
do
datetozip=`date -d "$daystozip days ago" +%Y%m%d`
datetodelete=`date -d "$daystodelete days ago" +%Y%m%d`
cd $logbasefolder$sectionfolder
for hostfolder in $subsectionfolder/
do
cd $hostfolder
# loop trough all date folder in hostfolder
for datefolder in [0-9][0-9][0-9][0-9].[0-9][0-9].[0-9][0-9]
do
# remove dashes from datefolder
datefoldershort=`echo "$datefolder" | tr -d .`
# check if logfile is to be deleted based on date
if test "$datefoldershort" -lt "$datetodelete"
then
cd $datefolder
# search folder for logfilename and delete it
for filetodelete in $logfilename.gz
do
#Put script for deletion here
done
# move back one folder to continue the list
cd ..
# check if logfile is to be zipped based on date
elif test "$datefoldershort" -lt "$datetozip"
then
cd $datefolder
# search folder for logfilename and zip it
for filetozip in $logfilename
do
gzip ${logfilename:1}
done
# move back one folder to continue the list
cd ..
fi
done
# move back one folder to continue the list
cd ..
done
done < "$configfile"
使用此配置文件:
11;14;/customers;core*;/apache.log
10;13;/customers;core*;/custom.log
9;12;/customers;core*;/system.log
11;14;/customers;srv*;/error.log
8;9;/customers;srv*;/system.log
再次感谢!!
答案1
该脚本按您预期的方式工作,但它改变了写入的目录log.txt
。
最初,脚本写入log.txt
当前目录,但脚本更改了其目录。命令cd $logbasefolder
更改了当前目录,因此脚本开始写入log.txt
一个目录,但在cd
命令之后,它改为log.txt
写入$logbasefolder
。
通过使用变量来表示可写入路径log.txt
($PWD
或$HOME
可能是),或使用pushd
和popd
在初始目录和之间交换目录来解决问题$logbasefolder
。例如:
#!/bin/bash
configfile="/etc/customlogrotate/logrotation.conf"
logbasefolder="/var/log"
logfile="$PWD/log.txt"
echo " " > $logfile
echo " " >> $logfile
echo "Starting logrotation script" >> $logfile
while IFS=';' read -r daysafterzip daystosave sectionfolder logfilename
do
echo "$daysafterzip $daystosave $logbasefolder$sectionfolder$logfilename" >> $logfile
# alternative method to $logfile variable:
# pushd $logbasefolder > /dev/null
# zip and delete files ...
# popd > /dev/null
cd $logbasefolder # remove with pushd and popd
done < "$configfile"
答案2
我认为您可能需要采取一些不同的做法(但我可能错了)。据我所知,您可能需要一些可以自动化的东西(即使用 crontab 之类的东西)。这意味着:
- 或者,您编写一个脚本,遍历“/var/log/”下的所有文件夹,然后读取每个文件的名称,检查该文件类型的存档计划,然后检查该特定文件最后存档的时间,并进行相应的处理;
- 或者,您可以通过创建一些专用于特定目的的脚本并为每个脚本设置 cronjobs,让您的生活变得更轻松。
我个人更喜欢第二种选择。它更加模块化,一旦安装到位,维护起来也更容易。整个事情看起来会像这样:
- 脚本 1:zip all customers/*/*log;设置 cron 每 7 天运行一次
- 脚本 2:压缩所有 server/*/access.log ;将 cron 设置为每 28 天运行一次
- 脚本 3:压缩所有 server/*/error.log ;每 14 天执行一次
- 脚本4:删除所有需要在365天后删除的文件;相应地设置cron
- 脚本5:删除所有需要在180天后删除的文件;相应地设置cron
听起来比实际设置更繁琐和复杂,但它是模块化的,易于维护和调整。
希望这有帮助。JW