天天看點

改變nginx logrotate方式采用sh檔案自動切割日志檔案

Logrotate讀取/etc/logrotate.d目錄下的檔案

這裡的檔案會被系統自動執行

logrotate是作為linux系統日志的管理工具存在。他可以輪換,壓縮,郵件系統日志檔案。

預設的logrotate被加入cron的/etc/cron.daily中作為每日任務執行。

/etc/logrotate.conf為其預設配置檔案指定每個日志檔案的預設規則。

/etc/logrotate.d/* 為/etc/logrotate.conf預設包含目錄其中檔案也會被logrotate讀取。指明每個日志檔案的特定規則。

/var/lib/logrotate/status中預設記錄logrotate上次輪換日志檔案的時間。

翻開叫nginx這個檔案内容如下

<code>/var/log/nginx/</code><code>*.log {</code>

<code>        </code><code>daily</code>

<code>        </code><code>missingok</code>

<code>        </code><code>rotate 52</code>

<code>        </code><code>compress</code>

<code>        </code><code>delaycompress</code>

<code>        </code><code>notifempty</code>

<code>        </code><code>create 640 nginx adm</code>

<code>        </code><code>sharedscripts</code>

<code>        </code><code>postrotate</code>

<code>                </code><code>[ -f </code><code>/var/run/nginx</code><code>.pid ] &amp;&amp; </code><code>kill</code> <code>-USR1 `</code><code>cat</code> <code>/var/run/nginx</code><code>.pid`</code>

<code>        </code><code>endscript</code>

<code>}</code>

解釋

daily 腳本按天執行

missingok 當日志為空不進行翻滾

rotate 52 當日志超過52個之後,從頭開始,即第53個會覆寫第一個

compress gzip壓縮,nocompress表示不壓縮,如果是httpd一定要壓縮,這太占硬碟了

delaycompress 延遲壓縮

prerotate 開始滾動日志的時候執行的代碼

postrotate 滾動日志後執行的代碼 可以看到nginx在滾動之後會執行一句shell ,用來讓nginx重新生成日志

全部參數詳情

compress 通過gzip 壓縮轉儲以後的日志

nocompress 不需要壓縮時,用這個參數

copytruncate 用于還在打開中的日志檔案,把目前日志備份并截斷

nocopytruncate 備份日志檔案但是不截斷

create mode owner group 轉儲檔案,使用指定的檔案模式建立新的日志檔案

nocreate 不建立新的日志檔案

delaycompress 和 compress 一起使用時,轉儲的日志檔案到下一次轉儲時才壓縮

nodelaycompress 覆寫 delaycompress 選項,轉儲同時壓縮。

errors address 專儲時的錯誤資訊發送到指定的Email 位址

ifempty 即使是空檔案也轉儲,這個是 logrotate 的預設選項。

notifempty 如果是空檔案的話,不轉儲

mail address 把轉儲的日志檔案發送到指定的E-mail 位址

nomail 轉儲時不發送日志檔案

olddir directory 轉儲後的日志檔案放入指定的目錄,必須和目前日志檔案在同一個檔案系統

noolddir 轉儲後的日志檔案和目前日志檔案放在同一個目錄下

prerotate/endscript 在轉儲以前需要執行的指令可以放入這個對,這兩個關鍵字必須單獨成行

postrotate/endscript 在轉儲以後需要執行的指令可以放入這個對,這兩個關鍵字必須單獨成行

daily 指定轉儲周期為每天

weekly 指定轉儲周期為每周

monthly 指定轉儲周期為每月

rotate count 指定日志檔案删除之前轉儲的次數,0 指沒有備份,5 指保留5 個備份

tabootext [+] list 讓logrotate 不轉儲指定擴充名的檔案,預設的擴充名是:.rpm-orig, .rpmsave, v, 和 ~

size size 當日志檔案到達指定的大小時才轉儲,Size 可以指定 bytes (預設)以及KB (sizek)或者MB (sizem).

具體執行時間沒怎麼搞明白。我的系統裡每天是7.35左右發生第一條日志,說明在7:35 執行了這個指令。但是時間不固定。目前推測為系統滾動日志按天的計劃很多要一個一個的做。大家排隊。

是以使用這種預設的日志切割方式,無法比較準确的按天來分日志。(理想的方式從0:00:00開始分日志。)

日志切割操作辦法第一步:删除原來自動切割

是以删除這個方式的小辦法就是删除/etc/logrotate.d/nginx 這個檔案

來個腳本試試

日志切割操作辦法第二步

功能點:

1.自動按天切割日志

2.按時間排放檔案夾

3.保留30天的日志檔案

4.自動壓縮日志檔案

<code>#!/bin/bash</code>

<code>#set the path to nginx log files</code>

<code>log_files_path=</code><code>"/var/log/nginx/"</code>

<code>log_files_dir=${log_files_path}$(</code><code>date</code> <code>-d </code><code>"yesterday"</code> <code>+</code><code>"%Y"</code><code>)/$(</code><code>date</code> <code>-d </code><code>"yesterday"</code> <code>+</code><code>"%m"</code><code>)</code>

<code>#set nginx log files you want to cut</code>

<code>log_files_name=(access error)</code>

<code>#set the path to nginx.</code>

<code>nginx_sbin=</code><code>"/etc/init.d/nginx"</code>

<code>#Set how long you want to save</code>

<code>save_days=30</code>

<code> </code><code>############################################</code>

<code>#Please do not modify the following script #</code>

<code>############################################</code>

<code>mkdir</code> <code>-p $log_files_dir</code>

<code> </code><code>log_files_num=${</code><code>#log_files_name[@]}</code>

<code> </code><code>#cut nginx log files</code>

<code>for</code><code>((i=0;i&lt;$log_files_num;i++));</code><code>do</code>

<code>mv</code> <code>${log_files_path}${log_files_name[i]}.log ${log_files_dir}/${log_files_name[i]}_$(</code><code>date</code> <code>-d </code><code>"yesterday"</code> <code>+</code><code>"%Y%m%d"</code><code>).log</code>

<code>gzip</code> <code>${log_files_dir}/${log_files_name[i]}_$(</code><code>date</code> <code>-d </code><code>"yesterday"</code> <code>+</code><code>"%Y%m%d"</code><code>).log </code>

<code>done</code>

<code> </code><code>#delete 30 days ago nginx log files</code>

<code>find</code> <code>$log_files_path -mtime +$save_days -</code><code>exec</code> <code>rm</code> <code>-rf {} \; </code>

<code> </code><code>$nginx_sbin  reload</code>

用這個腳本,設定為0:00:00開始執行,這樣就可以基本在0點進行日志快速切割了。

将腳本設定到crontab 裡就好了。

本文轉自 boy461205160 51CTO部落格,原文連結:http://blog.51cto.com/461205160/1741264