2019-02-26 10:10:54
最近 Hgh這邊有一個需求,需要對Linux伺服器上的日志進行相應地自動化處理:
1) 定期清理:當分區的可使用空間超過一個預先設定好的門檻值(如當分區的可使用空間超過 80 % 時)就自動清 理日志,清理周期是一天一次;
2) 按天分割:有的日志檔案如 access.log 會不斷地增長,現在需要對其進行分割操作(假設今天的日期是 2019 年 1 月 25 日,當時間到達 2019 年 1 月 26 日 0 點 0 分時,自動分割出一個 access.log.20190125 的日志文 件;
3) 壓縮:對 access.log.20190125 這樣的日志檔案進行壓縮,即生成壓縮包 access.log.20190125.tar.gz 并删除日志檔案 access.log.20190125 ;
4) 延遲壓縮:有的開發可能需要檢視最近幾天的日志,為了友善開發檢視日志,可對最近幾天的日志檔案進行延遲壓縮的操作(假設今天的日期是 2019 年 1 月 25 日,根據開發的要求暫時不壓縮最近一天的日志,則當時間到達 2019 年 1 月 26 日 0 點 0 分時,壓縮的是 2019 年 1 月 24 日的日志檔案 access.log.20190124 ,過了 24 小時以後再壓縮 access.log.20190125 )。
部署:
1 、編寫腳本,在指令行界面輸入:
[root@host ~]# vi /root/log.sh
鍵入小寫字母 i ,進入編輯模式,将 “ 附錄 ” 中的 log.sh 複制粘貼進去。
按一次 ESC 鍵退出編輯模式,然後鍵入 “ :wq ” 儲存并退出。
2 、建立并修改配置檔案,在指令行界面輸入:
[root@host ~]# vi /root/log.config
鍵入小寫字母 i ,進入編輯模式,将 “ 附錄 ” 中的 log.config 複制粘貼進去(請根據實際需要修改相應地配置)。
3 、為上述腳本賦予可執行權限,并建立日志檔案:
[root@host ~]# chmod +x /root/log.sh
[root@host ~]# touch /root/log.log
4 、讓上述腳本每天淩晨 0 點 0 分自動運作一次,在指令行界面輸入:
[root@host ~]# echo "0 0 * sh /root/log.sh" >> /var/spool/cron/root
至此,部署完成。
應用舉例:
Hgh将會通過應用舉例的方式來說明這個腳本具體是如何使用的。
舉例用的作業系統版本号如下所示:
[root@host ~]# cat /etc/redhat-release
CentOS Linux release 7.0.1406 (Core)
[root@host ~]#
簡單使用和定期清理日志:
1 、先建立一些日志檔案用來模拟生産環境:
[root@host ~]# mkdir -p /www/log/applog/
[root@host ~]# mkdir -p /www/log/accesslog/
[root@host ~]# echo 123 > /www/log/applog/www.test.com.log
[root@host ~]# echo 123 > /www/log/applog/www.test.net.log
[root@host ~]# echo 123 > /www/log/accesslog/www.test.com.log
[root@host ~]# echo 123 > /www/log/accesslog/www.test.net.log.20190128.00
[root@host ~]# echo 123 > /www/log/accesslog/www.test.net.log.20190128.01
[root@host ~]# echo 123 > /www/log/accesslog/www.test.net.log.20190128.02
現在使用 tree 指令來看一下日志檔案夾的目錄結構:
[root@host ~]# tree /www/log/
/www/log/
├── accesslog
│ ├── www.test.com.log
│ ├── www.test.net.log.20190128.00
│ ├── www.test.net.log.20190128.01
│ └── www.test.net.log.20190128.02
└── applog
├── www.test.com.log
└── www.test.net.log
2 directories, 6 files
2 、修改配置檔案,具體配置如下所示:
[root@host ~]# cat log.config
mount=/www
mount_used_size_percent=50
log_dir=/www/log
log_format_regex=.tar.gz
這裡解釋說明一下上述配置的作用:
mount :設定日志檔案所在的挂載點,具體挂載點請用 df -h 指令檢視;
mount_used_size_percent :設定該挂載點最多可以使用多少空間,機關是百分比;
log_dir :設定日志檔案所在的檔案夾,用于自動清理日志檔案(從檔案修改時間是最舊的日志檔案開始删除,包括子檔案夾下的日志檔案),直到上述挂載點的可使用空間最多不超過 mount_used_size_percent 這個百分比為止(除非日志檔案已經全部删除完畢);
log_format_regex :是一串正規表達式,用于自定義待删除的日志檔案格式,防止誤删除。
和上述配置的舉例、注意事項:
( 1 )log_format_regex 舉例和注意事項:
如待删除的日志檔案均為壓縮格式,則這麼配置即可(其中 ” \ ” 是轉義字元,” | ” 是 ” 或 ” ):log_format_regex=(.tar|.gz|.tar.gz|.bz2|.tar.bz2|.bz|.tar.bz|.Z|.tar.Z|.tgz|.tar.tgz|.zip|.lha|.rar)$ ;
注意:請不要把 .log 這個關鍵字寫入進去,因為很多正在寫入的日志檔案都是以 xxx.log 命名的,這些檔案是不能比對到并删除的。
和上述配置的取值範圍:
mount :該值必須配置且僅允許配置一次;
mount_used_size_percent :該值必須配置且僅允許配置一次,取值範圍在 50 ≤ x ≤ 85 之間;
log_dir :該值必須配置且允許配置多次,如果檔案夾不存在會将錯誤資訊寫入到日志檔案 log.log 并終止運作;
log_format_regex :該值必須配置且僅允許配置一次。
3 、現在我們來看看這個腳本是如何運作的,如果直接運作會彈出如下提示:
[root@host ~]# sh log.sh
Please run the script at 0 a.m.
因為該腳本最主要的一個功能就是自動化按天分割日志檔案,為了讓該功能能夠準确地運作,建議您在每天 0 點 0 分的時候才執行該腳本(或者說在每天 0 點 0 分的時候才執行 “ 按天分割日志 ” 的操作),是以 這裡限制了該腳本的運作時間(該腳本隻允許在每天 0 點 0 分至 0 點 59 分之間運作)。
那如何調試腳本呢?您需要這麼運作:
[root@host ~]# sh log.sh debug_mode=yes
debug_mode is enabled ! Do NOT use in production environment !
即開啟調試模式,強行讓腳本執行起來(請不用在生産環境上調試,以免誤删除重要檔案)。
同時,log.config 配置檔案和 log.log 該腳本的日志檔案預設是放置在 /root/ 目錄下的,如果您想自定義路徑,可以這麼運作腳本:
[root@host ~]# sh log.sh config_file=/ricky/log.config
config file ( /ricky/log.config ) not found !
[root@host ~]#
[root@host ~]# sh log.sh log_file=/ricky/log.log
log file ( /ricky/log.log ) not found !
[root@host ~]# sh log.sh config_file=/ricky/log.config log_file=/ricky/log.log
[root@host ~]# sh log.sh log_file=/ricky/log.log config_file=/ricky/log.config
[root@host ~]# sh log.sh log_file=/ricky/log.log config_file=/ricky/log.config debug_mode=yes
如上所示,腳本會自動判斷 config_file 和 log_file 這兩個檔案是否存在;如果這兩個檔案不存在,腳本會終止運作。
4 、此時 /www/log/ 的目錄結構和 log.config 配置檔案如下所示:
[root@host ~]# cat /root/log.config
執行該腳本:
腳本執行完畢後 /www/log/ 的目錄結構和 log.log 日志檔案如下所示:
[root@host ~]# cat /root/log.log
2019-01-29 09:35 - debug_mode is enabled ! Do NOT use in production environment !
2019-01-29 09:35 - Delete all the log files is completed , but did not reach the 50 % used precent !
2019-01-29 09:35 - === gz log ===
此時 /www/log/ 目錄結構無任何變化,因為我們在 log.config 配置檔案裡面配置了這兩句:
是以腳本隻會在 /www/log/ 目錄(包括子目錄)裡删除檔案名帶有 tar.gz 字樣的檔案,而 /www/log 目錄下并無帶有 tar.gz 字樣的檔案。
此時 log.log 日志檔案裡還記錄了一條日志:
該日志的意思是說所有的日志檔案已經删除完畢了(因為确實也不存在檔案名帶有 tar.gz 字樣的檔案了),但是挂載點 /www 的已使用空間依然超過了 50 % ,df -h 指令的執行結果如下所示:
[root@host ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 3.9G 0 3.9G 0% /dev
tmpfs 3.9G 0 3.9G 0% /dev/shm
tmpfs 3.9G 369M 3.6G 10% /run
tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup
/dev/sda2 10G 6.5G 3.5G 66% /
/dev/sda5 48G 30G 18G 63% /www
/dev/sda1 197M 107M 90M 55% /boot
5 、現在我們多建立幾個檔案再測試一次:
[root@host ~]# echo 456 > /www/log/accesslog/www.test.net.log.tar
[root@host ~]# echo 456 > /www/log/accesslog/www.test.net.log.tar.gz
[root@host ~]# echo 456 > /www/log/applog/www.test.net.log.tar
[root@host ~]# echo 456 > /www/log/applog/www.test.net.log.tar.gz
[root@host ~]# echo 456 > /www/log/applog/www.test.net.tar.gz.log
│ ├── www.test.net.log.20190128.02
│ ├── www.test.net.log.tar
│ └── www.test.net.log.tar.gz
├── www.test.net.log
├── www.test.net.log.tar
├── www.test.net.log.tar.gz
└── www.test.net.tar.gz.log
2 directories, 11 files
檢視 /www/log/ 目錄我們可以發現,凡是檔案名帶有 tar.gz 字樣的檔案都删除掉了:
│ └── www.test.net.log.tar
└── www.test.net.log.tar
2 directories, 8 files
6 、如果您隻想删除以 .tar.gz 結尾的檔案,隻需要這麼配置:
log_format_regex=.tar.gz$
加一個正規表達式裡的 $ 符号即可(即隻比對以 .tar.gz 結尾的檔案),這樣檔案 www.test.net.tar.gz.log 就不會被删除了(親測有效)。
7 、log_dir 允許配置多個值,如:
log_dir=/www/log/accesslog
log_dir=/www/log/applog
log_dir=/tmp/applog
腳本會預先判斷這些檔案夾是否存在,如果其中一個檔案夾是不存在的,腳本會将錯誤資訊寫入到日志檔案 log.log 并終止運作。具體報錯資訊如下所示:
[root@host ~]# cat log.log
2019-01-29 15:17 - debug_mode is enabled ! Do NOT use in production environment !
2019-01-29 15:17 - log_dir /tmp/applog does not exist !
按天分割日志:
1 、修改配置檔案,具體配置如下所示:
cut_log=/www/log/accesslog/www.test.com.log
cut_log :設定需要進行按天分割的日志檔案的檔案路徑。
和上述配置的舉例:
( 1 )cut_log 舉例:
比如:cut_log=/www/accesslog/www.test.com/access.log ,假設今天的日期是 2019 年 1 月 29 日,那麼到了 2019 年 1 月 30 日淩晨 0 點 0 分會分卷一份 access.log.20190129 出來。
允許設定多條,如:
cut_log=/www/accesslog/www.test.com/access.log
cut_log=/www/accesslog/www.test.net/access.log
也可以不設定,如:
cut_log=
cut_log :該值可不配置且允許配置多次,日志檔案路徑必須是絕對路徑,如果檔案不存在會将錯誤資訊寫入到日志檔案 log.log 并終止運作。
2 、此時 /www/log/ 的目錄結構和 log.config 配置檔案如下所示:
[root@host ~]# tree /www/log
/www/log
cut_log=/www/log/applog/www.test.com.log
目前兩個日志檔案 /www/log/accesslog/www.test.com.log 和 /www/log/applog/www.test.com.log 的内容如下所示:
[root@host ~]# cat /www/log/accesslog/www.test.com.log
123
[root@host ~]# cat /www/log/applog/www.test.com.log
執行完腳本以後會發現多出了兩個日志檔案 /www/log/accesslog/www.test.com.log.20190129 和 /www/log/applog/www.test.com.log.20190129(假設執行腳本的時間是 2019 年 1 月 30 日 0 點 0 分):
│ ├── www.test.com.log.20190129
├── www.test.com.log.20190129
同時原日志檔案已經被清空:
[root@host ~]# cat /www/log/accesslog/www.test.com.log.20190129
[root@host ~]# cat /www/log/applog/www.test.com.log.20190129
3 、腳本會預先判斷這些檔案是否存在,如果其中一個檔案是不存在的,腳本會将錯誤資訊寫入到日志檔案 log.log 并終止運作。此時 /www/log/ 的目錄結構和 log.config 配置檔案如下所示:
cut_log=/www/log/applog/www.test.com.log123
具體報錯資訊如下所示:
2019-01-31 09:18 - debug_mode is enabled ! Do NOT use in production environment !
2019-01-31 09:18 - log_file /www/log/applog/www.test.com.log123 does not exist !
壓縮日志:
gz_log=/www/log/applog/www.test.com.log
gz_delay_day=
gz_log :設定需要進行壓縮的日志檔案(支援自定義日期格式和模糊比對)的檔案路徑;
gz_delay_day :設定延遲壓縮的天數。
( 1 )gz_log 舉例:
支援自定義日期格式,其中:
” %YYYY ” 是年
” %MMMM ” 是月
” %DDDD ” 是日;
支援模糊比對:比如檔案 /tmp/app.log.2019-01-30-00 和 /tmp/app.log.2019-01-30-01 這兩個檔案 ,隻需要這麼設定 gz_log=/tmp/app.log.%YYYY-%MMMM-%DDDD 即可自動将上述兩個檔案一同打入壓縮包 /tmp/app.log.2019-01-30.tar.gz 。
( 2 )gz_delay_day 舉例:
支援延遲壓縮日志檔案:有的開發可能需要檢視最近幾天的日志,壓縮後就不容易直接檢視了;為了友善開發檢視最近幾天的日志,那麼每天就不能壓縮昨天的日志了,而是每天壓縮前天或者大前天的日志,這樣開發就還可以檢視昨天或者前天的日志。比如:gz_delay_day=1 表示壓縮昨天的日志,gz_delay_day=2 表示壓縮前天的日志,gz_delay_day=3 表示壓縮大前天的日志。
gz_log :該值可不配置且允許配置多次,日志檔案路徑必須是絕對路徑,如果檔案不存在會将錯誤資訊寫入到日志檔案 log.log 并終止運作;
gz_delay_day :該值可不配置且僅允許配置一次,取值範圍是 x ≥ 1 ,預設值是 1 。
2 、現在打算對日志檔案 /www/log/applog/www.test.com.log 進行壓縮,此時 /www/log/ 的目錄結構和 log.config 配置檔案如下所示:
目前日志檔案 /www/log/applog/www.test.com.log 的内容如下所示:
執行完腳本以後會發現多出了一個壓縮包 www.test.com.log.tar.gz ,同時原日志檔案 www.test.com.log 已經被删除:
├── www.test.com.log.tar.gz
我們解壓看看:
[root@host ~]# mkdir /tmp/log/
[root@host ~]# mv /www/log/applog/www.test.com.log.tar.gz /tmp/log/
[root@host ~]# cd /tmp/log/
[root@host log]# tar zxf www.test.com.log.tar.gz
[root@host log]# ls
www.test.com.log www.test.com.log.tar.gz
[root@host log]#
[root@host log]# cat www.test.com.log
[root@host log]#
可以看到日志檔案 www.test.com.log 就是原來那個。
3 、我們現在來看看自定義日期格式和模糊比對的使用,現在我們要壓縮:
/www/log/accesslog/www.test.net.log.20190128.00
/www/log/accesslog/www.test.net.log.20190128.01
/www/log/accesslog/www.test.net.log.20190128.02
這三個日志檔案,此時 /www/log/ 的目錄結構和 log.config 配置檔案如下所示:
2 directories, 5 files
gz_log=/www/log/accesslog/www.test.net.log.%YYYY%MMMM%DDDD
gz_delay_day=3
假設今天的日期是 2019 年 1 月 31 日,那麼 30 日是昨天,29 日是前天,28 日是大前天,是以 gz_delay_day 的值為 3 。
執行完腳本以後會發現多出了一個壓縮包 www.test.net.log.20190128.tar.gz ,同時三個日志檔案已經被删除:
│ └── www.test.net.log.20190128.tar.gz
2 directories, 3 files
我們同樣解壓出來看看:
[root@host ~]# mkdir /tmp/log_20190128/
[root@host ~]# mv /www/log/accesslog/www.test.net.log.20190128.tar.gz /tmp/log_20190128/
[root@host ~]# cd /tmp/log_20190128/
[root@host log_20190128]# tar zxf www.test.net.log.20190128.tar.gz
[root@host log_20190128]# ls
www.test.net.log.20190128.00 www.test.net.log.20190128.01 www.test.net.log.20190128.02 www.test.net.log.20190128.tar.gz
[root@host log_20190128]#
可以看到三個日志檔案都在壓縮包中。
4 、其他自定義日期格式的例子,假設有的程式已經能夠每小時自動生成一個日志檔案,例如:
/www/log/accesslog/www.test.net.log.2019-01-30-00
/www/log/accesslog/www.test.net.log.2019-01-30-01
/www/log/accesslog/www.test.net.log.2019-01-30-02
……
/www/log/accesslog/www.test.net.log.2019-01-30-23
那麼隻需要這麼設定即可:
gz_log=/www/log/accesslog/www.test.net.log.%YYYY-%MMMM-%DDDD
這樣,上述 24 個日志檔案将會在 2019 年 1 月 31 日 0 點 0 分統一壓縮進壓縮包 www.test.net.log.2019-01-30.tar.gz ,然後再删除上述 24 個日志檔案。
按天分割和壓縮(延遲壓縮)的功能是可以互相獨立使用的;當然也可以結合起來使用,具體請看下方的 “ 綜合應用 ” 。
綜合應用:
現在有如下所示的四個日志檔案:
│ └── www.test.com.log.20190129
└── www.test.net.log.20190129
2 directories, 4 files
現在的需求是:
( 1 )當 /www 的挂載點的可使用空間超過 50 % 時,自動删除 /www/log/ 目錄下(包括子目錄)檔案名帶有 tar.gz 字樣的檔案,以釋放硬碟空間。
( 2 )假設今天的日期是 2019 年 1 月 30 日,當時間走到 2019 年 1 月 31 日 0 點 0 分時,需要對日志檔案做一個分割:
/www/log/accesslog/www.test.com.log → /www/log/accesslog/www.test.com.log.20190130
/www/log/applog/www.test.net.log → /www/log/applog/www.test.net.log.20190130
( 3 )然後再對前天的日志檔案進行一個壓縮:
/www/log/accesslog/www.test.com.log.20190129 → /www/log/accesslog/www.test.com.log.20190129.tar.gz
/www/log/applog/www.test.net.log.20190129 → /www/log/applog/www.test.net.log.20190129.tar.gz
那麼,log.config 配置檔案隻需要這麼配置即可:
cut_log=/www/log/applog/www.test.net.log
gz_log=/www/log/accesslog/www.test.com.log.%YYYY%MMMM%DDDD
gz_log=/www/log/applog/www.test.net.log.%YYYY%MMMM%DDDD
gz_delay_day=2
執行腳本後,結果如下所示:
│ ├── www.test.com.log.20190129.tar.gz
│ └── www.test.com.log.20190130
├── www.test.net.log.20190129.tar.gz
└── www.test.net.log.20190130
至此,該腳本介紹完畢。
附錄:
1 、log.sh :
#!/bin/bash
config_file="/root/log.config"
log_file="/root/log.log"
debug_mode="no"
for i in $* ; do
if [[ "$i" =~ "config_file=" ]] ; then
config_file=echo $i | awk -F'=' '{print $2}'
elif [[ "$i" =~ "log_file=" ]] ; then
log_file=echo $i | awk -F'=' '{print $2}'
elif [[ "$i" =~ "debug_mode=" ]] ; then
debug_mode=echo $i | awk -F'=' '{print $2}'
fi
done
if [ ! -f "$config_file" ] ; then
echo "config file ( $config_file ) not found !"
exit
if [ ! -f "$log_file" ] ; then
echo "log file ( $log_file ) not found !"
if [ "$debug_mode" == "no" -a "date '+%H'" != "00" ] ; then
echo Please run the script at 0 a.m.
elif [ "$debug_mode" != "no" ] ; then
debug_mode="yes"
echo debug_mode is enabled ! Do NOT use in production environment !
echo $(date "+%F %H:%M") - debug_mode is enabled ! Do NOT use in production environment ! >> $log_file
#1. get mount
config_file_flag=cat $config_file | grep -v "#" | sed "s# ##g" | grep -vE "=$" | grep -c "mount="
if [ $config_file_flag == 1 ] ; then
mount=cat $config_file | grep -v "#" | sed "s# ##g" | grep -vE "=$" | grep "mount=" | awk -F'=' '{print $2}'
elif [ $config_file_flag == 0 ] ; then
echo $(date "+%F %H:%M") - "mount parameter is not found !" >> $log_file
else
echo $(date "+%F %H:%M") - "mount parameter is too many !" >> $log_file
if [ df -h | grep "$mount" | awk -F' ' '{print $5}' | awk -F'%' '{print $1}' | grep -c '^[[:digit:]]*$' == 0 ] ; then
echo $(date "+%F %H:%M") - "mount parameter is error !" >> $log_file
#2. get mount_used_size_percent
config_file_flag=cat $config_file | grep -v "#" | sed "s# ##g" | grep -vE "=$" | grep -c "mount_used_size_percent="
mount_used_size_percent=cat $config_file | grep -v "#" | sed "s# ##g" | grep -vE "=$" | grep "mount_used_size_percent=" | awk -F'=' '{print $2}'
echo $(date "+%F %H:%M") - "mount_used_size_percent parameter is not found !" >> $log_file
echo $(date "+%F %H:%M") - "mount_used_size_percent parameter is too many !" >> $log_file
if [ echo $mount_used_size_percent | grep -c '^[[:digit:]]*$' == 0 ] ; then
echo $(date "+%F %H:%M") - "mount_used_size_percent parameter is not number !" >> $log_file
if [ $mount_used_size_percent -lt 50 ] ; then
echo $(date "+%F %H:%M") - "mount_used_size_percent parameter requires more than or equal to 50 !" >> $log_file
elif [ $mount_used_size_percent -gt 85 ] ; then
echo $(date "+%F %H:%M") - "mount_used_size_percent parameter requires less than or equal to 85 !" >> $log_file
#3. get log_format_regex
config_file_flag=cat $config_file | grep -v "#" | sed "s# ##g" | grep -vE "=$" | grep -c "log_format_regex="
log_format_regex=cat $config_file | grep -v "#" | sed "s# ##g" | grep -vE "=$" | grep "log_format_regex=" | awk -F'=' '{print $2}'
echo $(date "+%F %H:%M") - "log_format_regex parameter is not found !" >> $log_file
echo $(date "+%F %H:%M") - "log_format_regex parameter is too many !" >> $log_file
#4. get log_dir_list
config_file_flag=cat $config_file | grep -v "#" | sed "s# ##g" | grep -vE "=$" | grep -c "log_dir="
if [ $config_file_flag -ge 1 ] ; then
log_dir_list=cat $config_file | grep -v "#" | sed "s# ##g" | grep -vE "=$" | grep "log_dir=" | awk -F'=' '{print $2}'
echo $(date "+%F %H:%M") - "log_dir parameter is not found !" >> $log_file
for log_dir in $log_dir_list ; do
if [ ! -d "$log_dir" ] ; then
echo $(date "+%F %H:%M") - "log_dir $log_dir does not exist !" >> $log_file
#5. delete log file
while [ df -h | grep "$mount" | awk -F' ' '{print $5}' | awk -F'%' '{print $1}' -gt $mount_used_size_percent ] ; do
while_flag=""
if [ find $log_dir -type f | grep -cE $log_format_regex -gt 0 ] ; then
find $log_dir -type f | grep -E $log_format_regex | xargs ls -ta | tail -1 | xargs rm -f
while_flag=$while_flag"1"
while_flag=$while_flag"0"
if [ echo $while_flag | grep -c 1 == 0 ] ; then
echo $(date "+%F %H:%M") - "Delete all the log files is completed , but did not reach the $mount_used_size_percent % used precent !" >> $log_file
break
#6. get cut_log_list
cut_log_list=cat $config_file | grep -v "#" | sed "s# ##g" | grep -vE "=$" | grep "cut_log=" | awk -F'=' '{print $2}'
for cut_log in $cut_log_list ; do
if [ ! -f "$cut_log" ] ; then
echo $(date "+%F %H:%M") - "cut_log $cut_log does not exist !" >> $log_file
#7. cut log
yesterday=$(date -d "$(date) -1 day" +%Y%m%d)
cp $cut_log $cut_log.$yesterday && echo > $cut_log
#8. get gz_log_list
config_file_flag=cat $config_file | grep -v "#" | sed "s# ##g" | grep -vE "=$" | grep -c "gz_delay_day="
if [ $config_file_flag == 0 -o $config_file_flag == 1 ] ; then
if [ $config_file_flag == 1 ] ; then
gz_delay_day=`cat $config_file | grep -v "#" | sed "s# ##g" | grep -vE "=$" | grep "gz_delay_day=" | awk -F'=' '{print $2}'`
elif [ $config_file_flag == 0 ] ; then
gz_delay_day=1
fi
if [ `echo $gz_delay_day | grep -c '^[[:digit:]]*$'` == 0 ] ; then
echo $(date "+%F %H:%M") - "gz_delay_day parameter is not number !" >> $log_file
exit
fi
if [ $gz_delay_day -lt 1 ] ; then
echo $(date "+%F %H:%M") - "gz_delay_day parameter requires more than or equal to 1 !" >> $log_file
exit
fi
gz_log_list=`cat $config_file | grep -v "#" | sed "s# ##g" | grep -vE "=$" | grep "gz_log=" | awk -F'=' '{print $2}'`
date_year=`date -d "$(date) - ${gz_delay_day} day" +%Y`
date_month=`date -d "$(date) - ${gz_delay_day} day" +%m`
date_day=`date -d "$(date) - ${gz_delay_day} day" +%d`
for gz_log in $gz_log_list ; do
gz_log=`echo $gz_log | sed "s#%YYYY#$date_year#g" | sed "s#%MMMM#$date_month#g" | sed "s#%DDDD#$date_day#g"`
if [ `ls "$gz_log"* | grep -v "${gz_log}.tar.gz" 2>/dev/null | wc -l` == 0 ] ; then
echo $(date "+%F %H:%M") - "gz_log $gz_log does not exist !" >> $log_file
exit
fi
done
elif [ $config_file_flag -gt 1 ] ; then
echo $(date "+%F %H:%M") - "gz_delay_day parameter is too many !" >> $log_file
#9. gz log
echo $(date "+%F %H:%M") - "=== gz log ===" >> $log_file
for gz_log in $gz_log_list ; do
gz_log=echo $gz_log | sed "s#%YYYY#$date_year#g" | sed "s#%MMMM#$date_month#g" | sed "s#%DDDD#$date_day#g"
cd dirname ${gz_log}
echo dirname ${gz_log}" :" >> $log_file
log_filename=basename ${gz_log}
tar zcvf ${log_filename}.tar.gz --exclude=.tar.gz ${log_filename} >> $log_file
ls ${log_filename}* | grep -v "${log_filename}.tar.gz" | xargs rm -f
echo "===========================" >> $log_file
2 、log.config :
mount:設定日志檔案所在的挂載點,如:mount=/www ,具體挂載點請用 df -h 指令檢視。
mount 取值範圍:該值必須配置且僅允許配置一次。
mount_used_size_percent:設定該挂載點最多可以使用多少空間,機關是百分比。
mount_used_size_percent 取值範圍:該值必須配置且僅允許配置一次,取值範圍在 50 ≤ x ≤ 85 之間。
mount=
mount_used_size_percent=
log_dir:設定日志檔案所在的檔案夾,如:log_dir=/www/accesslog ,用于自動清理日志檔案(從檔案修改時間是最舊的日志檔案開始删除,包括子檔案夾下的日志檔案),
直到上述挂載點的可使用空間最多不超過 mount_used_size_percent 這個百分比為止(除非日志檔案已經全部删除完畢)。
log_dir 取值範圍:該值必須配置且允許配置多次,如果檔案夾不存在會将錯誤資訊寫入到日志檔案 log.log 并終止運作。
log_dir=/www/accesslog
log_dir=/www/applog
log_dir=