天天看點

Linux 上使用 Linux Shell 腳本自動化按天分割、壓縮(延遲壓縮)和定期清理日志檔案

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=

繼續閱讀