<kbd id="5sdj3"></kbd>
<th id="5sdj3"></th>

  • <dd id="5sdj3"><form id="5sdj3"></form></dd>
    <td id="5sdj3"><form id="5sdj3"><big id="5sdj3"></big></form></td><del id="5sdj3"></del>

  • <dd id="5sdj3"></dd>
    <dfn id="5sdj3"></dfn>
  • <th id="5sdj3"></th>
    <tfoot id="5sdj3"><menuitem id="5sdj3"></menuitem></tfoot>

  • <td id="5sdj3"><form id="5sdj3"><menu id="5sdj3"></menu></form></td>
  • <kbd id="5sdj3"><form id="5sdj3"></form></kbd>

    推薦一款日志切割神器

    共 17546字,需瀏覽 36分鐘

     ·

    2020-10-28 10:06

    點擊上方藍色“程序猿DD”,選擇“設為星標”

    回復“資源”獲取獨家整理的學習資料!

    鏈接:https://urlify.cn/F3Uzmi

    對于 Linux 系統(tǒng)安全來說,日志文件是極其重要的工具。不知為何,我發(fā)現(xiàn)很多運維同學的服務器上都運行著一些諸如每天切分 Nginx日志之類的 CRON 腳本,大家似乎遺忘了 Logrotate,爭相發(fā)明自己的輪子,這真是讓人沮喪??!就好比明明身邊躺著現(xiàn)成的性感美女,大家卻忙著自娛自樂,罪過!


    logrotate 程序是一個日志文件管理工具。用于分割日志文件,刪除舊的日志文件,并創(chuàng)建新的日志文件,起到“轉儲”作用??梢怨?jié)省磁盤空間。下面就對 logrotate 日志輪轉操作做一梳理記錄。


    1、配置文件介紹


    Linux系統(tǒng)默認安裝logrotate工具,它默認的配置文件在:
    /etc/logrotate.conf
    /etc/logrotate.d/
    logrotate.conf 才主要的配置文件,logrotate.d 是一個目錄,該目錄里的所有文件都會被主動的讀入/etc/logrotate.conf中執(zhí)行。


    另外,如果 /etc/logrotate.d/ 里面的文件中沒有設定一些細節(jié),則會以/etc/logrotate.conf這個文件的設定來作為默認值。


    Logrotate是基于CRON來運行的,其腳本是/etc/cron.daily/logrotate,日志輪轉是系統(tǒng)自動完成的。實際運行時,Logrotate會調用配置文件/etc/logrotate.conf。可以在/etc/logrotate.d目錄里放置自定義好的配置文件,用來覆蓋Logrotate的缺省值。


    [root@huanqiu_web1 ~]# cat /etc/cron.daily/logrotate
    #!/bin/sh
    /usr/sbin/logrotate /etc/logrotate.conf >/dev/null 2>&1
    EXITVALUE=$?
    if?[?$EXITVALUE?!= 0 ];?then
    ????/usr/bin/logger -t logrotate?"ALERT exited abnormally with [$EXITVALUE]"
    fi
    exit?0


    如果等不及cron自動執(zhí)行日志輪轉,想手動強制切割日志,需要加-f參數(shù);不過正式執(zhí)行前最好通過Debug選項來驗證一下(-d參數(shù)),這對調試也很重要:
    #?/usr/sbin/logrotate -f /etc/logrotate.d/nginx
    #?/usr/sbin/logrotate -d -f /etc/logrotate.d/nginx


    logrotate 命令格式:


    logrotate [OPTION...]?
    -d, --debug?:debug模式,測試配置文件是否有錯誤。
    -f, --force :強制轉儲文件。
    -m, --mail=command?:壓縮日志后,發(fā)送日志到指定郵箱。
    -s, --state=statefile :使用指定的狀態(tài)文件。
    -v, --verbose?:顯示轉儲過程。


    根據(jù)日志切割設置進行操作,并顯示詳細信息:


    [root@huanqiu_web1 ~]# /usr/sbin/logrotate -v /etc/logrotate.conf
    [root@huanqiu_web1 ~]# /usr/sbin/logrotate -v /etc/logrotate.d/php

    根據(jù)日志切割設置進行執(zhí)行,并顯示詳細信息,但是不進行具體操作,debug模式

    [root@huanqiu_web1 ~]# /usr/sbin/logrotate -d /etc/logrotate.conf
    [root@huanqiu_web1 ~]# /usr/sbin/logrotate -d /etc/logrotate.d/nginx


    查看各log文件的具體執(zhí)行情況


    [root@fangfull_web1 ~]# cat /var/lib/logrotate.status


    2、切割介紹


    比如以系統(tǒng)日志/var/log/message做切割來簡單說明下:


    • 第一次執(zhí)行完rotate(輪轉)之后,原本的messages會變成messages.1,而且會制造一個空的messages給系統(tǒng)來儲存日志;


    • 第二次執(zhí)行之后,messages.1會變成messages.2,而messages會變成messages.1,又造成一個空的messages來儲存日志!

    如果僅設定保留三個日志(即輪轉3次)的話,那么執(zhí)行第三次時,則 messages.3這個檔案就會被刪除,并由后面的較新的保存日志所取代!也就是會保存最新的幾個日志。

    日志究竟輪換幾次,這個是根據(jù)配置文件中的dateext 參數(shù)來判定的。
    看下logrotate.conf配置:

    # cat /etc/logrotate.conf
    # 底下的設定是 "logrotate 的默認值" ,如果別的文件設定了其他的值,
    # 就會以其它文件的設定為主
    weekly?//默認每一周執(zhí)行一次rotate輪轉工作
    rotate?4???????//保留多少個日志文件(輪轉幾次).默認保留四個.就是指定日志文件刪除之前輪轉的次數(shù),0 指沒有備份
    create?//自動創(chuàng)建新的日志文件,新的日志文件具有和原來的文件相同的權限;因為日志被改名,因此要創(chuàng)建一個新的來繼續(xù)存儲之前的日志
    dateext?//這個參數(shù)很重要!就是切割后的日志文件以當前日期為格式結尾,如xxx.log-20131216這樣,如果注釋掉,切割出來是按數(shù)字遞增,即前面說的 xxx.log-1這種格式
    compress?//是否通過gzip壓縮轉儲以后的日志文件,如xxx.log-20131216.gz ;如果不需要壓縮,注釋掉就行

    include?/etc/logrotate.d
    # 將 /etc/logrotate.d/ 目錄中的所有文件都加載進來

    /var/log/wtmp {?//僅針對 /var/log/wtmp 所設定的參數(shù)
    monthly?//每月一次切割,取代默認的一周
    minsize?1M?//文件大小超過 1M 后才會切割
    create?0664?root utmp?//指定新建的日志文件權限以及所屬用戶和組
    rotate?1????????????????????//只保留一個日志.
    }
    # 這個 wtmp 可記錄用戶登錄系統(tǒng)及系統(tǒng)重啟的時間
    # 因為有 minsize 的參數(shù),因此不見得每個月一定會執(zhí)行一次喔.要看文件大小。

    由這個文件的設定可以知道/etc/logrotate.d其實就是由/etc/logrotate.conf 所規(guī)劃出來的目錄,雖然可以將所有的配置都寫入 /etc/logrotate.conf ,但是這樣一來這個文件就實在是太復雜了,尤其是當使用很多的服務在系統(tǒng)上面時, 每個服務都要去修改 /etc/logrotate.conf 的設定也似乎不太合理了。

    所以,如果獨立出來一個目錄,那么每個要切割日志的服務, 就可以獨自成為一個文件,并且放置到 /etc/logrotate.d/ 當中。

    其他重要參數(shù)說明:

    compress?#通過gzip 壓縮轉儲以后的日志
    nocompress?#不做gzip壓縮處理
    copytruncate?#用于還在打開中的日志文件,把當前日志備份并截斷;是先拷貝再清空的方式,拷貝和清空之間有一個時間差,可能會丟失部分日志數(shù)據(jù)。
    nocopytruncate?#備份日志文件不過不截斷
    create mode owner group?#輪轉時指定創(chuàng)建新文件的屬性,如create 0777 nobody nobody
    nocreate?#不建立新的日志文件
    delaycompress?#和compress 一起使用時,轉儲的日志文件到下一次轉儲時才壓縮
    nodelaycompress?#覆蓋 delaycompress 選項,轉儲同時壓縮。
    missingok?#如果日志丟失,不報錯繼續(xù)滾動下一個日志
    errors address?#專儲時的錯誤信息發(fā)送到指定的Email 地址
    ifempty?#即使日志文件為空文件也做輪轉,這個是logrotate的缺省選項。
    notifempty?#當日志文件為空時,不進行輪轉
    mail address?#把轉儲的日志文件發(fā)送到指定的E-mail 地址
    nomail?#轉儲時不發(fā)送日志文件
    olddir directory?#轉儲后的日志文件放入指定的目錄,必須和當前日志文件在同一個文件系統(tǒng)
    noolddir?#轉儲后的日志文件和當前日志文件放在同一個目錄下
    sharedscripts?#運行postrotate腳本,作用是在所有日志都輪轉后統(tǒng)一執(zhí)行一次腳本。如果沒有配置這個,那么每個日志輪轉后都會執(zhí)行一次腳本
    prerotate?#在logrotate轉儲之前需要執(zhí)行的指令,例如修改文件的屬性等動作;必須獨立成行
    postrotate?#在logrotate轉儲之后需要執(zhí)行的指令,例如重新啟動 (kill -HUP) 某個服務!必須獨立成行
    daily?#指定轉儲周期為每天
    weekly?#指定轉儲周期為每周
    monthly?#指定轉儲周期為每月
    rotate count?#指定日志文件刪除之前轉儲的次數(shù),0 指沒有備份,5 指保留5 個備份
    dateext?#使用當期日期作為命名格式
    dateformat .%s?#配合dateext使用,緊跟在下一行出現(xiàn),定義文件切割后的文件名,必須配合dateext使用,只支持 %Y %m %d %s 這四個參數(shù)
    size(或minsize)?log-size?#當日志文件到達指定的大小時才轉儲,log-size能指定bytes(缺省)及KB (sizek)或MB(sizem).
    當日志文件 >=?log-size 的時候就轉儲。以下為合法格式:(其他格式的單位大小寫沒有試過)
    size = 5 或 size 5 (>= 5 個字節(jié)就轉儲)
    size = 100k 或 size 100k
    size = 100M 或 size 100M

    小示例:下面一個切割nginx日志的配置

    [root@master-server ~]# vim /etc/logrotate.d/nginx
    /usr/local/nginx/logs/*.log?{
    daily
    rotate 7
    missingok
    notifempty
    dateext
    sharedscripts
    postrotate
    if?[ -f /usr/local/nginx/logs/nginx.pid ];?then
    kill?-USR1 `cat /usr/local/nginx/logs/nginx.pid`
    fi
    endscript
    }

    分享一例曾經(jīng)使用過的nginx日志切割處理腳本:

    1)logrotate日志分割配置

    [root@bastion-IDC ~# vim /etc/logrotate.d/nginx
    /data/nginx_logs/*.access_log
    {
    nocompress
    daily
    copytruncate
    create
    ifempty
    olddir /data/nginx_logs/days
    rotate?0????????????????????????????????????????
    }

    2)日志分割腳本

    [root@bastion-IDC ~# vim /usr/local/sbin/logrotate-nginx.sh
    #!/bin/bash
    #創(chuàng)建轉儲日志壓縮存放目錄
    mkdir -p /data/nginx_logs/days
    #手工對nginx日志進行切割轉換
    /usr/sbin/logrotate -vf /etc/logrotate.d/nginx
    #當前時間
    time=$(date -d?"yesterday"?+"%Y-%m-%d")
    #進入轉儲日志存放目錄
    cd?/data/nginx_logs/days
    #對目錄中的轉儲日志文件的文件名進行統(tǒng)一轉換
    for?i?in?$(ls ./ | grep?"^\(.*\)\.[[:digit:]]$")
    do
    mv?${i}?./$(echo?${i}|sed -n?'s/^\(.*\)\.\([[:digit:]]\)$/\1/p')-$(echo?$time)
    done
    #對轉儲的日志文件進行壓縮存放,并刪除原有轉儲的日志文件,只保存壓縮后的日志文件。以節(jié)約存儲空間
    for?i?in?$(ls ./ | grep?"^\(.*\)\-\([[:digit:]-]\+\)$")
    do
    tar jcvf?${i}.bz2 ./${i}
    rm -rf ./${i}
    done
    #只保留最近7天的壓縮轉儲日志文件
    find /data/nginx_logs/days/* -name?"*.bz2"?-mtime 7 -type?f -exec?rm -rf {} \;

    3)crontab定時執(zhí)行

    [root@bastion-IDC ~# crontab -e
    #logrotate
    0?0?* * *?/bin/bash?-x /usr/local/sbin/logrotate-nginx.sh >?/dev/null?2>

    手動執(zhí)行腳本,測試下看看:

    [root@bastion-IDC ~# /bin/bash -x /usr/local/sbin/logrotate-nginx.sh
    [root@bastion-IDC ~# cd /data/nginx_logs/days
    [root@bastion-IDC days# ls
    huantest.access_log-2017-01-18.bz2

    php腳本切割一例:

    [root@huanqiu_web1 ~]# cat /etc/logrotate.d/php
    /Data/logs/php/*log {
    ????daily
    ????rotate?365
    ????missingok
    ????notifempty
    ????compress
    ????dateext
    ????sharedscripts
    ????postrotate
    if?[ -f /Data/app/php5.6.26/var/run/php-fpm.pid ];?then
    kill -USR1 `cat /Data/app/php5.6.26/var/run/php-fpm.pid`
    ????????fi
    ????endscript
    ????postrotate
    ????????/bin/chmod 644 /Data/logs/php/*gz
    ????endscript
    }

    [root@huanqiu_web1 ~]# ll /Data/app/php5.6.26/var/run/php-fpm.pid
    -rw-r--r--?1?root root?4?Dec?28?17:03?/Data/app/php5.6.26/var/run/php-fpm.pid

    [root@huanqiu_web1 ~]# cd /Data/logs/php
    [root@huanqiu_web1 php]# ll
    total?25676
    -rw-r--r--?1?root root?0?Jun?1??2016?error.log
    -rw-r--r--?1?nobody nobody?182?Aug?30??2015?error.log-20150830.gz
    -rw-r--r--?1?nobody nobody?371?Sep?1??2015?error.log-20150901.gz
    -rw-r--r--?1?nobody nobody?315?Sep?7??2015?error.log-20150907.gz
    .........
    .........

    nginx日志切割一例

    [root@huanqiu_web1 ~]#?cat?/etc/logrotate.d/nginx
    /Data/logs/nginx/*/*log?{
    ????daily
    ????rotate?365
    ????missingok
    ????notifempty
    ????compress
    ????dateext
    ????sharedscripts
    ????postrotate
    ????/etc/init.d/nginx reload
    ????endscript
    }

    [root@huanqiu_web1 ~]#?ll?/Data/logs/nginx/www.huanqiu.com/
    ..........
    -rw-r--r--?1?root root?1652?Jan?1?00:00?error.log-20170101.gz
    -rw-r--r--?1?root root?1289?Jan?2?00:00?error.log-20170102.gz
    -rw-r--r--?1?root root?1633?Jan?3?00:00?error.log-20170103.gz
    -rw-r--r--?1?root root?3239?Jan?4?00:00?error.log-20170104.gz

    系統(tǒng)日志切割一例

    [root@huanqiu_web1 ~]#?cat?/etc/logrotate.d/syslog
    /var/log/cron
    /var/log/maillog
    /var/log/messages
    /var/log/secure
    /var/log/spooler
    {
    ????sharedscripts
    ????postrotate
    ????/bin/kill -HUP `cat?/var/run/syslogd.pid?2> /dev/null`?2> /dev/null || true
    ????endscript
    }

    [root@huanqiu_web1 ~]#?ll?/var/log/messages*
    -rw-------?1?root root?34248975?Jan?19?18:42?/var/log/messages
    -rw-------?1?root root?51772994?Dec?25?03:11?/var/log/messages-20161225
    -rw-------?1?root root?51800210?Jan?1?03:05?/var/log/messages-20170101
    -rw-------?1?root root?51981366?Jan?8?03:36?/var/log/messages-20170108
    -rw-------?1?root root?51843025?Jan?15?03:40?/var/log/messages-20170115
    [root@huanqiu_web1 ~]#?ll?/var/log/cron*
    -rw-------?1?root root?2155681?Jan?19?18:43?/var/log/cron
    -rw-------?1?root root?2932618?Dec?25?03:11?/var/log/cron-20161225
    -rw-------?1?root root?2939305?Jan?1?03:06?/var/log/cron-20170101
    -rw-------?1?root root?2951820?Jan?8?03:37?/var/log/cron-20170108
    -rw-------?1?root root?3203992?Jan?15?03:41?/var/log/cron-20170115
    [root@huanqiu_web1 ~]#?ll?/var/log/secure*
    -rw-------?1?root root?275343?Jan?19?18:36?/var/log/secure
    -rw-------?1?root root?2111936?Dec?25?03:06?/var/log/secure-20161225
    -rw-------?1?root root?2772744?Jan?1?02:57?/var/log/secure-20170101
    -rw-------?1?root root?1115543?Jan?8?03:26?/var/log/secure-20170108
    -rw-------?1?root root?731599?Jan?15?03:40?/var/log/secure-20170115
    [root@huanqiu_web1 ~]#?ll?/var/log/spooler*
    -rw-------?1?root root?0?Jan?15?03:41?/var/log/spooler
    -rw-------?1?root root?0?Dec?18?03:21?/var/log/spooler-20161225
    -rw-------?1?root root?0?Dec?25?03:11?/var/log/spooler-20170101
    -rw-------?1?root root?0?Jan?1?03:06?/var/log/spooler-20170108
    -rw-------?1?root root?0?Jan?8?03:37?/var/log/spooler-20170115


    tomcat日志切割一例

    [root@huanqiu-backup?~]# cat /etc/logrotate.d/tomcat
    /Data/app/tomcat-7-huanqiu/logs/catalina.out {
    rotate?14
    daily
    copytruncate
    compress
    notifempty
    missingok
    }

    [root@huanqiu-backup?~]# ll /Data/app/tomcat-7-huanqiu/logs/catalina.*
    -rw-r--r--. 1 root root 0 Jan 19 19:11 /Data/app/tomcat-7-huanqiu/logs/catalina.out
    -rw-r--r--. 1 root root 95668 Jan 19 19:11 /Data/app/tomcat-7-huanqiu/logs/catalina.out.1.gz

    早期用過的nginx日志處理一例

    [root@letv-backup ~]# vim /letv/sh/cut_nginx_log.sh
    #!/bin/bash
    # 你的日志文件存放目錄
    logs_path="/letv/logs/"
    # 日志文件的名字,多個需要空格隔開
    logs_names=(error access pv_access)
    dates=`date -d?"yesterday"?+"%Y%m%d"`
    mkdir -p?${logs_path}$dates/
    num=${#logs_names[@]}
    for((i=0;ido

    mv?${logs_path}${logs_names[i]}.log?${logs_path}$dates/${logs_names[i]}.log
    done
    #nginx平滑重啟
    kill?-USR1 `cat /letv/logs/nginx/nginx.pid`

    結合crontab定時執(zhí)行
    [root@letv-backup ~]# crontab -e
    #nginx日志切割
    00 00 * * *?cd?/letv/logs;/bin/bash /letv/sh/cut_nginx_log.sh > /dev/null 2>$1


    3、嘗試解決logrotate無法自動輪詢日志的辦法


    現(xiàn)象說明:

    使用logrotate輪詢nginx日志,配置好之后,發(fā)現(xiàn)nginx日志連續(xù)兩天沒被切割,這是為什么呢??

    然后開始檢查日志切割的配置文件是否有問題,檢查后確定配置文件一切正常。

    于是懷疑是logrotate預定的cron沒執(zhí)行,查看了cron的日志,發(fā)現(xiàn)有一條Dec 7 04:02:01 www crond[18959]: (root) CMD (run-parts /etc/cron.daily)這樣的日志,證明cron在04:02分時已經(jīng)執(zhí)行/etc/cron.daily目錄下的程序。

    接著查看/etc /cron.daily/logrotate(這是logrotate自動輪轉的腳本)的內容:

    [root@huanqiu_test ~]# cat /etc/cron.daily/logrotate
    #!/bin/sh

    /usr/sbin/logrotate /etc/logrotate.conf >/dev/null 2>&1
    EXITVALUE=$?
    if?[?$EXITVALUE?!= 0 ];?then
    ????/usr/bin/logger -t logrotate?"ALERT exited abnormally with [$EXITVALUE]"
    fi
    exit?0

    沒有發(fā)現(xiàn)異常,配置好的日志輪轉操作都是由這個腳本完成的,一切運行正常,腳本應該就沒問題。

    直接執(zhí)行命令:

    [root@huanqiu_test ~]# /usr/sbin/logrotate /etc/logrotate.conf

    這些系統(tǒng)日志是正常輪詢了,但nginx日志卻還是沒輪詢。

    接著強行啟動記錄文件維護操作,縱使logrotate指令認為沒有需要,應該有可能是logroate認為nginx日志太小,不進行輪詢。

    故需要強制輪詢,即在/etc/cron.daily/logrotate腳本中將 -t 參數(shù)替換成 -f 參數(shù)

    [root@huanqiu_test ~]# cat /etc/cron.daily/logrotate
    #!/bin/sh

    /usr/sbin/logrotate /etc/logrotate.conf >/dev/null 2>&1
    EXITVALUE=$?
    if?[?$EXITVALUE?!= 0 ];?then
    ????/usr/bin/logger -f logrotate?"ALERT exited abnormally with [$EXITVALUE]"
    fi
    exit

    最后最后重啟下cron服務:

    [root@huanqiu_test ~]# /etc/init.d/crond?restart
    Stopping?crond:?[ OK ]
    Starting?crond:?[ OK ]

    logrotate默認自動切割生效時間

    Logrotate是基于CRON來運行的,其腳本是/etc/cron.daily/logrotate,實際運行時,Logrotate會調用配置文件/etc/logrotate.conf。
    [root@test?~]# cat /etc/cron.daily/logrotate
    #!/bin/sh

    /usr/sbin/logrotate /etc/logrotate.conf
    EXITVALUE=$?
    if?[?$EXITVALUE?!= 0 ];?then
    ????/usr/bin/logger -t logrotate?"ALERT exited abnormally with [$EXITVALUE]"
    fi
    exit?0


    Logrotate是基于CRON運行的,所以這個時間是由CRON控制的,具體可以查詢CRON的配置文件/etc/anacrontab(老版本的文件是/etc/crontab)
    [root@test?~]# cat /etc/anacrontab
    # /etc/anacrontab: configuration file for anacron

    # See anacron(8) and anacrontab(5) for details.

    SHELL=/bin/sh
    PATH=/sbin:/bin:/usr/sbin:/usr/bin
    MAILTO=root
    # the maximal random delay added to the base delay of the jobs
    RANDOM_DELAY=45 //這個是隨機的延遲時間,表示最大45分鐘
    # the jobs will be started during the following hours only
    START_HOURS_RANGE=3-22 //這個是開始時間

    #period in days delay in minutes job-identifier command
    1 5 cron.daily nice run-parts /etc/cron.daily
    7 25 cron.weekly nice run-parts /etc/cron.weekly
    @monthly 45 cron.monthly nice run-parts /etc/cron.monthly

    第一個是Recurrence period
    第二個是延遲時間
    所以cron.daily會在3:22+(5,45)這個時間段執(zhí)行,/etc/cron.daily是個文件夾

    通過默認/etc/anacrontab文件配置,會發(fā)現(xiàn)logrotate自動切割日志文件的默認時間是凌晨3點多。

    ==================================================================================================
    現(xiàn)在需要將切割時間調整到每天的晚上12點,即每天切割的日志是前一天的0-24點之間的內容。
    操作如下:
    [root@kevin ~]# mv /etc/anacrontab /etc/anacrontab.bak //取消日志自動輪轉的設置

    [root@G6-bs02 logrotate.d]# cat nstc_nohup.out
    /data/nstc/nohup.out {
    rotate 30
    dateext
    daily
    copytruncate
    compress
    notifempty
    missingok
    }

    [root@G6-bs02 logrotate.d]# cat syslog
    /var/log/cron
    /var/log/maillog
    /var/log/messages
    /var/log/secure
    /var/log/history
    {
    ????sharedscripts
    ????compress
    ????rotate 30
    ????daily
    ????dateext
    ????postrotate
    ????/bin/kill?-HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null ||?true
    ????endscript
    }

    結合crontab進行自定義的定時輪轉操作
    [root@kevin ~]# crontab -l
    #log logrotate
    59 23 * * * /usr/sbin/logrotate -f /etc/logrotate.d/syslog >/dev/null 2>&1
    59 23 * * * /usr/sbin/logrotate -f /etc/logrotate.d/nstc_nohup.out >/dev/null 2>&1

    [root@G6-bs02 ~]# ll /data/nstc/nohup.out*
    -rw------- 1 app app 33218 1月 25 09:43 /data/nstc/nohup.out
    -rw------- 1 app app 67678 1月 25 23:59 /data/nstc/nohup.out-20180125.gz

    除了利用自帶的Logrotate工具實現(xiàn)日志切割之外,還可以編寫python腳本或shell腳本以實現(xiàn)日志切割。下面就簡單列出幾個實例說明下:

    一、Python腳本實現(xiàn)日志切割

    實例1:對jumpserver日志進行切割
    [root@test-vm01 mnt]#?cat?log_rotate.py
    #!/usr/bin/env?python

    import datetime,os,sys,shutil

    log_path =?'/opt/jumpserver/logs/'
    log_file =?'jumpserver.log'

    yesterday = (datetime.datetime.now() - datetime.timedelta(days =?1))

    try:
    ????os.makedirs(log_path + yesterday.strftime('%Y') + os.sep + \
    ????????????????yesterday.strftime('%m'))

    except OSError,e:
    print
    print?e
    ????sys.exit()


    shutil.move(log_path + log_file,log_path \
    ????????????+ yesterday.strftime('%Y') + os.sep \
    ????????????+ yesterday.strftime('%m') + os.sep \
    ????????????+ log_file +?'_'?+ yesterday.strftime('%Y%m%d') +?'.log')


    os.popen("sudo /opt/jumpserver/service.sh restart")

    手動執(zhí)行這個腳本:
    [root@test-vm01 mnt]# chmod?755?log_rotate.py
    [root@test-vm01 mnt]#?python?log_rotate.py

    查看日志切割后的效果:
    [root@test-vm01 mnt]#?ls?/opt/jumpserver/logs/
    2017??jumpserver.log?
    [root@test-vm01 mnt]#?ls?/opt/jumpserver/logs/2017/
    09
    [root@test-vm01 mnt]#?ls?/opt/jumpserver/logs/2017/09/
    jumpserver.log_20170916.log

    然后做每日的定時切割任務:
    [root@test-vm01 mnt]# crontab -e
    30?1?* * * /usr/bin/python?/mnt/log_rotate.py?> /dev/null?2>&1

    --------------------------------------------------------------------------------------
    實例2:對nginx日志進行切割
    [root@test-vm01 mnt]#?vim?log_rotate.py
    #!/usr/bin/env?python

    import datetime,os,sys,shutil

    log_path =?'/app/nginx/logs/'
    log_file =?'www_access.log'

    yesterday = (datetime.datetime.now() - datetime.timedelta(days =?1))

    try:
    ????os.makedirs(log_path + yesterday.strftime('%Y') + os.sep + \
    ????????????????yesterday.strftime('%m'))

    except OSError,e:
    print
    print?e
    ????sys.exit()


    shutil.move(log_path + log_file,log_path \
    ????????????+ yesterday.strftime('%Y') + os.sep \
    ????????????+ yesterday.strftime('%m') + os.sep \
    ????????????+ log_file +?'_'?+ yesterday.strftime('%Y%m%d') +?'.log')


    os.popen("sudo kill -USR1 `cat /app/nginx/logs/nginx.pid`")

    --------------------------------------------------------------------------------------
    其他業(yè)務日志的切割腳本跟上面做法相同

    二、shell腳本實現(xiàn)日志切割

    [root@qd-vpc-op-consumer01 ~]# cat /app/script/log_rotate.sh
    #!/bin/sh

    function?rotate() {
    logs_path=$1

    echo?Rotating Log:?$1
    cp?${logs_path}?${logs_path}.$(date -d?"yesterday"?+"%Y%m%d")
    >?${logs_path}
    ????rm -f?${logs_path}.$(date -d?"7 days ago"?+"%Y%m%d")
    }

    for?i?in?$*
    do
    ????????rotate?$i
    done

    --------------------------------------------------------------------------------------------------------------
    每天定時切割日志的任務制定(比如對python的一個業(yè)務/data/log/xcspam/下的日志進行切割,0K的日志不進行切割):
    [root@qd-vpc-op-consumer01 ~]# crontab -e
    #xcspam 日志切割
    30 0 * * * find /data/log/xcspam/ -size +0 -name?'*.log'?| xargs /app/script/log_rotate.sh

    手動執(zhí)行切割:
    [root@qd-vpc-op-consumer01 ~]# find /data/log/xcspam/ -size +0 -name '*.log' | xargs /app/script/log_rotate.sh

    切割后的日志效果:
    [root@qd-vpc-op-consumer01 ~]# ls /data/log/xcspam/
    xcspam_error.log xcspam_error.log-20170926

    --------------------------------------------------------------------------------------------------------------
    比如對maridb日志進行切割
    [root@qd-vpc-op-consumer01 ~]# crontab -e
    #xcspam 日志切割
    30 0 * * * find /var/log/mariadb/ -size +0 -name?'*.log'?| xargs /app/script/log_rotate.sh

    [root@qd-vpc-op-consumer01 ~]# find /var/log/mariadb/ -size +0 -name '*.log' | xargs /app/script/log_rotate.sh
    [root@qd-vpc-op-consumer01 ~]# ll /var/log/mariadb/
    總用量 8
    -rw-r-----. 1 mysql mysql 0 9月 17 20:31 mariadb.log
    -rw-r-----. 1 root root 4532 9月 17 20:31 mariadb.log.20170916
    --------------------------------------------------------------------------------------------------------------

    日志壓縮腳本:
    [root@localhost ~]# ls /var/log/fss/nginx/
    nginx.20190506.log nginx.20190507.log nginx.20190508.log

    [root@localhost ~]# cat /root/log_clean.sh
    #!/usr/bin/sh
    #根據(jù)系統(tǒng)/服務/日志保留天數(shù)三個參數(shù)壓縮日志
    #usage: sh clearlog.sh sysname appname keepdays
    sysName=$1
    appName=$2
    keepDay=$3
    logDir=/var/log/${sysName}/${appName}
    logFile=${appName}.*[0-9][0-9].log
    cd?${logDir}
    find ./ -name?"${logFile}"?-mtime -${keepDay}?-exec?gzip {} \;


    [root@localhost ~]# sh /root/log_clean.sh fss nginx 3

    [root@localhost ~]# ls /var/log/fss/nginx/
    nginx.20190506.log.gz nginx.20190507.log.gz nginx.20190508.log.gz

    還可以針對日志保留策略,調整成日志清理腳本。

    推薦用的Nginx日志輪轉方法? ?[部署在nginx的日志目錄下]

    #!/bin/bash

    yesterday=`date -d?"-1 days"?+'%Y%m%d'`
    cd?`dirname?$0`
    basedir=`pwd`
    logdir="${basedir}/bak"
    bindir="${basedir%/*}/sbin"
    mkdir -p?${logdir}

    for?log?in?`ls *.log?2>/dev/null`
    do
    ????mv?${log}?${logdir}/${log}.${yesterday}.bak
    # gzip ${logdir}/${log}.${yesterday}
    done

    ${bindir}/nginx -s reload

    cd?${logdir}
    find . -type?f -name?"*.bak"?-mtime +7 | xargs rm -f


    往期推薦

    成為最差開發(fā)者的10條建議

    delete、truncate、drop的區(qū)別有哪些,該如何選擇

    最近很火的 ClickHouse 是什么?

    為何從單體架構遷移到微服務這么難?

    醉酒刪庫:幾杯紅酒下肚,7小時數(shù)據(jù)消失...


    掃一掃,關注我

    一起學習,一起進步

    每周贈書,福利不斷

    深度內容

    推薦加入


    最近熱門內容回顧? ?#技術人系列

    瀏覽 35
    點贊
    評論
    收藏
    分享

    手機掃一掃分享

    分享
    舉報
    評論
    圖片
    表情
    推薦
    點贊
    評論
    收藏
    分享

    手機掃一掃分享

    分享
    舉報

    <kbd id="5sdj3"></kbd>
    <th id="5sdj3"></th>

  • <dd id="5sdj3"><form id="5sdj3"></form></dd>
    <td id="5sdj3"><form id="5sdj3"><big id="5sdj3"></big></form></td><del id="5sdj3"></del>

  • <dd id="5sdj3"></dd>
    <dfn id="5sdj3"></dfn>
  • <th id="5sdj3"></th>
    <tfoot id="5sdj3"><menuitem id="5sdj3"></menuitem></tfoot>

  • <td id="5sdj3"><form id="5sdj3"><menu id="5sdj3"></menu></form></td>
  • <kbd id="5sdj3"><form id="5sdj3"></form></kbd>
    欧亚免费视频 | 欧美美综合网 | 女人18片毛片90分钟在线播放 | 精品欧美一区二区三区四区 | 爽灬爽灬无码无遮挡在线看 |