<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                ## 18.3 登錄文件的輪替(logrotate) 假設我們已經將登錄數據寫入了記錄文件中了,也已經利用 chattr 設置了 +a 這個屬性了,那么該如何進行 logrotate 的工作呢?這里請特別留意的是:“rsyslogd 利用的是 daemon 的方式來啟動的, 當有需求的時候立刻就會被執行的,但是 logrotate 卻是在規定的時間到了之后才來進行登錄文件的輪替, 所以這個 logrotate 程序當然就是掛在 [cron](../Text/index.html) 下面進行的呦!” 仔細看一下 /etc/cron.daily/ 里面的文件,嘿嘿~看到了吧! /etc/cron.daily/logrotate 就是記錄了每天要進行的登錄文件輪替的行為啦! ^_^!下面我們就來談一談怎么樣設計這個 logrotate 吧! ### 18.3.1 logrotate 的配置文件 既然 logrotate 主要是針對登錄文件來進行輪替的動作,所以啰,他當然必須要記載“ 在什么狀態下才將登錄文件進行輪替”的設置啊!那么 logrotate 這個程序的參數配置文件在哪里呢?呵呵!那就是: * /etc/logrotate.conf * /etc/logrotate.d/ 那個 logrotate.conf 才是主要的參數文件,至于 logrotate.d 是一個目錄, 該目錄里面的所有文件都會被主動的讀入 /etc/logrotate.conf 當中來進行!另外,在 /etc/logrotate.d/ 里面的文件中,如果沒有規定到的一些細部設置,則以 /etc/logrotate.conf 這個文件的規定來指定為默認值! 好了,剛剛我們提到 logrotate 的主要功能就是將舊的登錄文件移動成舊文件, 并且重新創建一個新的空的文件來記錄,他的執行結果有點類似下面的圖示: ![登錄文件進行 logrotate 的結果](https://box.kancloud.cn/2016-05-13_5735737bc61f6.gif)圖18.3.1、登錄文件進行 logrotate 的結果 由上面的圖示我們可以清楚的知道,當第一次執行完 rotate 之后,原本的 messages 會變成 messages.1 而且會制造一個空的 messages 給系統來儲存登錄文件。而第二次執行之后,則 messages.1 會變成 messages.2 而 messages 會變成 messages.1 ,又造成一個空的 messages 來儲存登錄文件!那么如果我們僅設置保留三個登錄文件而已的話,那么執行第四次時,則 messages.3 這個文件就會被刪除,并由后面的較新的保存登錄文件所取代!基本的工作就是這樣啦! 不過近年來磁盤空間容量比較大了,加上管理員又擔心登錄文件數據真的給它不見去,因此,你可能已經發現到,最近的登錄文件輪替后的文件名已經會加上日期參數, 然后源源不絕的保留在你的系統上耶~雖然這個設置是可以修訂的,不過,鳥哥也真的希望保留日期的文件名延伸記錄,真的比較不用擔心未來要找問題時, 登錄文件卻已經 GG 了... 那么多久進行一次這樣的 logrotate 工作呢?這些都記錄在 logrotate.conf 里面,我們來看一下默認的 logrotate 的內容吧! ``` [root@study ~]# vim /etc/logrotate.conf # 下面的設置是 "logrotate 的默認設置值" ,如果個別的文件設置了其他的參數, # 則將以個別的文件設置為主,若該文件沒有設置到的參數則以這個文件的內容為默認值! weekly &lt;==默認每個禮拜對登錄文件進行一次 rotate 的工作 rotate 4 &lt;==保留幾個登錄文件呢?默認是保留四個! create &lt;==由于登錄文件被更名,因此創建一個新的來繼續儲存之意! dateext &lt;==就是這個設置值!可以讓被輪替的文件名稱加上日期作為文件名喔! #compress &lt;==被更動的登錄文件是否需要壓縮?如果登錄文件太大則可考慮此參數啟動 include /etc/logrotate.d # 將 /etc/logrotate.d/ 這個目錄中的所有文件都讀進來執行 rotate 的工作! /var/log/wtmp { &lt;==僅針對 /var/log/wtmp 所設置的參數 monthly &lt;==每個月一次,取代每周! create 0664 root utmp &lt;==指定新建文件的權限與所屬帳號/群組 minsize 1M &lt;==文件大小一定要超過 1M 后才進行 rotate (略過時間參數) rotate 1 &lt;==僅保留一個,亦即僅有 wtmp.1 保留而已。 } # 這個 wtmp 可記錄登陸者與系統重新開機時的時間與來源主機及登陸期間的時間。 # 由于具有 minsize 的參數,因此不見得每個月一定會進行一次喔!要看文件大小。 # 由于僅保留一個登錄文件而已,不滿意的話可以將他改成 rotate 5 吧! ``` 由這個文件的設置我們可以知道 /etc/logrotate.d 其實就是由 /etc/logrotate.conf 所規劃出來的目錄,所以,其實我們可以將所有的數據都給他寫入 /etc/logrotate.conf 即可,但是這樣一來這個文件就實在是太復雜了,尤其是當我們使用很多的服務在系統上面時, 每個服務都要去修改 /etc/logrotate.conf 的設置也似乎不太合理~ 所以,如果獨立出來一個目錄,那么每個以 RPM 打包方式所創建的服務的登錄文件輪替設置, 就可以獨自成為一個文件,并且放置到 /etc/logrotate.d/ 當中即可,真是方便又合理的做法啊! ^_^ 一般來說,這個 /etc/logrotate.conf 是“默認的輪替狀態”而已, 我們的各個服務都可以擁有自己的登錄文件輪替設置,你也可以自行修改成自己喜歡的樣式啊! 例如,如果你的系統的空間夠大,并且擔心除錯以及駭客的問題,那么可以: * 將 rotate 4 改成 rotate 9 左右,以保存較多的備份文件。不過如果已經加上 dateext 的參數,那這個項目就不用更動了! * 大部分的登錄文件不需要 compress 啰!但是空間太小就需要 compress !尤其是很占硬盤空間的 httpd 更需要 compress 的! 好了,上面我們大致介紹了 /var/log/wtmp 這個文件的設置,現在你知道了 logrotate.conf 的設置語法是: ``` 登錄文件的絕對路徑文件名 ... { 個別的參數設置值,如 monthly, compress 等等 } ``` 下面我們再以 /etc/logrotate.d/syslog 這個輪替 rsyslog.service 服務的文件,來看看該如何設置他的 rotate 呢? ``` [root@study ~]# vim /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&gt; /dev/null` 2&gt; /dev/null &#124;&#124; true endscript } ``` 在上面的語法當中,我們知道正確的 logrotate 的寫法為: * 文件名:被處理的登錄文件絕對路徑文件名寫在前面,可以使用空白字符分隔多個登錄文件; * 參數:上述文件名進行輪替的參數使用 { } 包括起來; * 執行腳本:可調用外部指令來進行額外的命令下達,這個設置需與 sharedscripts .... endscript 設置合用才行。至于可用的環境為: * prerotate:在啟動 logrotate 之前進行的指令,例如修改登錄文件的屬性等動作; * postrotate:在做完 logrotate 之后啟動的指令,例如重新啟動 (kill -HUP) 某個服務! * Prerotate 與 postrotate 對于已加上特殊屬性的文件處理上面,是相當重要的執行程序! 那么 /etc/logrotate.d/syslog 內設置的 5 個文件的輪替功能就變成了: * 該設置只對 /var/log/ 內的 cron, maillog, messages, secure, spooler 有效; * 登錄文件輪替每周一次、保留四個、且輪替下來的登錄文件不進行壓縮(未更改默認值); * 輪替完畢后 (postrotate) 取得 syslog 的 PID 后,以 kill -HUP 重新啟動 syslogd 假設我們有針對 /var/log/messages 這個文件增加 chattr +a 的屬性時, 依據 logrotate 的工作原理,我們知道,這個 /var/log/messages 將會被更名成為 /var/log/messages.1 才是。但是由于加上這個 +a 的參數啊,所以更名是不可能成功的! 那怎么辦呢?呵呵!就利用 prerotate 與 postrotate 來進行登錄文件輪替前、后所需要作的動作啊! 果真如此時,那么你可以這樣修改一下這個文件喔! ``` [root@study ~]# vim /etc/logrotate.d/syslog /var/log/cron /var/log/maillog /var/log/messages /var/log/secure /var/log/spooler { sharedscripts prerotate /usr/bin/chattr -a /var/log/messages endscript sharedscripts postrotate /bin/kill -HUP `cat /var/run/syslogd.pid 2&gt; /dev/null` 2&gt; /dev/null &#124;&#124; true /usr/bin/chattr +a /var/log/messages endscript } ``` 看到否?就是先給他去掉 a 這個屬性,讓登錄文件 /var/log/messages 可以進行輪替的動作, 然后執行了輪替之后,再給他加入這個屬性!請特別留意的是,那個 /bin/kill -HUP ... 的意義,這一行的目的在于將系統的 rsyslogd 重新以其參數文件 (rsyslog.conf) 的數據讀入一次!也可以想成是 reload 的意思啦! 由于我們創建了一個新的空的記錄文件,如果不執行此一行來重新啟動服務的話, 那么記錄的時候將會發生錯誤呦!(請回到[第十六章](../Text/index.html)讀一下 kill 后面的 signal 的內容說明) ### 18.3.2 實際測試 logrotate 的動作 好了,設置完成之后,我們來測試看看這樣的設置是否可行呢?給他執行下面的指令: ``` [root@study ~]# logrotate [-vf] logfile 選項與參數: -v :啟動顯示模式,會顯示 logrotate 運行的過程喔! -f :不論是否符合配置文件的數據,強制每個登錄文件都進行 rotate 的動作! 范例一:執行一次 logrotate 看看整個流程為何? [root@study ~]# logrotate -v /etc/logrotate.conf reading config file /etc/logrotate.conf &lt;==讀取主要配置文件 including /etc/logrotate.d &lt;==調用外部的設置 reading config file chrony &lt;==就是外部設置啊! ....(中間省略).... Handling 18 logs &lt;==共有 18 個登錄文件被記錄 ....(中間省略).... rotating pattern: /var/log/cron /var/log/maillog /var/log/messages /var/log/secure /var/log/spooler weekly (52 rotations) empty log files are not rotated, old logs are removed considering log /var/log/cron log does not need rotating considering log /var/log/maillog log does not need rotating considering log /var/log/messages &lt;==開始處理 messages log does not need rotating &lt;==因為時間未到,不需要更動! ....(下面省略).... 范例二:強制進行 logrotate 的動作 [root@study ~]# logrotate -vf /etc/logrotate.conf ....(前面省略).... rotating log /var/log/messages, log-&gt;rotateCount is 52 dateext suffix '-20150820' glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]' compressing log with: /bin/gzip ....(下面省略).... # 看到否?整個 rotate 的動作就是這樣一步一步進行的~ [root@study ~]# ll /var/log/messages*; lsattr /var/log/messages -rw-------. 1 root root 143 Aug 20 01:45 /var/log/messages -rw-------. 1 root root 167125 Aug 20 01:40 /var/log/messages-20150820 -----a---------- /var/log/messages &lt;==主動加入 a 的隱藏屬性啰! ``` 上面那個 -f 具有“強制執行”的意思,如果一切的設置都沒有問題的話,那么理論上,你的 /var/log 這個目錄就會起變化啰!而且應該不會出現錯誤訊息才對!嘿嘿!這樣就 OK 了!很棒不是嗎?! 由于 logrotate 的工作已經加入 crontab 里頭了!所以現在每天系統都會自動的給他查看 logrotate 啰!不用擔心的啦!只是要注意一下那個 /var/log/messages 里頭是否常常有類似下面的字眼: > Aug 20 01:45:34 study rsyslogd: [origin software="rsyslogd" swVersion="7.4.7" x-pid="2145" x-info="http://www.rsyslog.com"] rsyslogd was HUPed 這說明的是 rsyslogd 重新啟動的時間啦 (就是因為 /etc/logrotate.d/syslog 的設置之緣故!) 下面我們來進行一些例題的練習,讓你更詳細的了解 logrotate 的功用啊! ### 18.3.3 自訂登錄文件的輪替功能 假設前提是這樣的,前一小節當中,假設你已經創建了 /var/log/admin.log 這個文件, 現在,你想要將該文件加上 +a 這個隱藏標簽,而且設置下面的相關信息: * 登錄文件輪替一個月進行一次; * 該登錄文件若大于 10MB 時,則主動進行輪替,不需要考慮一個月的期限; * 保存五個備份文件; * 備份文件需要壓縮 那你可以怎么樣設置呢?呵呵~很簡單啊!看看下面的動作吧! ``` # 1\. 先創建 +a 這個屬性啊! [root@study ~]# chattr +a /var/log/admin.log [root@study ~]# lsattr /var/log/admin.log -----a---------- /var/log/admin.log [root@study ~]# mv /var/log/admin.log /var/log/admin.log.1 mv: cannot move `/var/log/admin.log' to `/var/log/admin.log.1': Operation not permitted # 這里確定了加入 a 的隱藏屬性!所以 root 無法移動此登錄文件! # 2\. 開始創建 logrotate 的配置文件,增加一個文件在 /etc/logrotate.d 內就對了! [root@study ~]# vim /etc/logrotate.d/admin # This configuration is from VBird 2015/08/19 /var/log/admin.log { monthly &lt;==每個月進行一次 size=10M &lt;==文件大小大于 10M 則開始處置 rotate 5 &lt;==保留五個! compress &lt;==進行壓縮工作! sharedscripts prerotate /usr/bin/chattr -a /var/log/admin.log endscript sharedscripts postrotate /bin/kill -HUP `cat /var/run/syslogd.pid 2&gt; /dev/null` 2&gt; /dev/null &#124;&#124; true /usr/bin/chattr +a /var/log/admin.log endscript } # 3\. 測試一下 logrotate 相關功能的信息顯示: [root@study ~]# logrotate -v /etc/logrotate.conf ....(前面省略).... rotating pattern: /var/log/admin.log 10485760 Bytes (5 rotations) empty log files are rotated, old logs are removed considering log /var/log/admin.log log does not need rotating not running prerotate script, since no logs will be rotated not running postrotate script, since no logs were rotated ....(下面省略).... # 因為還不足一個月,文件也沒有大于 10M,所以不需進行輪替! # 4\. 測試一下強制 logrotate 與相關功能的信息顯示: [root@study ~]# logrotate -vf /etc/logrotate.d/admin reading config file /etc/logrotate.d/admin reading config file /etc/logrotate.d/admin Handling 1 logs rotating pattern: /var/log/admin.log forced from command line (5 rotations) empty log files are rotated, old logs are removed considering log /var/log/admin.log log needs rotating rotating log /var/log/admin.log, log-&gt;rotateCount is 5 dateext suffix '-20150820' glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]' renaming /var/log/admin.log.5.gz to /var/log/admin.log.6.gz (rotatecount 5, logstart 1, i 5), old log /var/log/admin.log.5.gz does not exist renaming /var/log/admin.log.4.gz to /var/log/admin.log.5.gz (rotatecount 5, logstart 1, i 4), old log /var/log/admin.log.4.gz does not exist renaming /var/log/admin.log.3.gz to /var/log/admin.log.4.gz (rotatecount 5, logstart 1, i 3), old log /var/log/admin.log.3.gz does not exist renaming /var/log/admin.log.2.gz to /var/log/admin.log.3.gz (rotatecount 5, logstart 1, i 2), old log /var/log/admin.log.2.gz does not exist renaming /var/log/admin.log.1.gz to /var/log/admin.log.2.gz (rotatecount 5, logstart 1, i 1), old log /var/log/admin.log.1.gz does not exist renaming /var/log/admin.log.0.gz to /var/log/admin.log.1.gz (rotatecount 5, logstart 1, i 0), old log /var/log/admin.log.0.gz does not exist log /var/log/admin.log.6.gz doesn't exist -- won't try to dispose of it running prerotate script fscreate context set to system_u:object_r:var_log_t:s0 renaming /var/log/admin.log to /var/log/admin.log.1 running postrotate script compressing log with: /bin/gzip [root@study ~]# lsattr /var/log/admin.log* -----a---------- /var/log/admin.log ---------------- /var/log/admin.log.1.gz &lt;==有壓縮過喔! ``` 看到了嗎?通過這個方式,我們可以創建起屬于自己的 logrotate 設置文件, 很簡便吧!尤其是要注意的, /etc/rsyslog.conf 與 /etc/logrotate.d/* 文件常常要搭配起來,例如剛剛我們提到的兩個案例中所創建的 /var/log/admin.log 就是一個很好的例子~創建后,還要使用 logrotate 來輪替啊! ^_^
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看