nginx日志切割的2種方法


 

nginx泡得太久,日志就越來越大,有必要對其切割下,也便於按天統計訪問量神馬的。

沒啥難度,短短幾行的腳本即可

#!/bin/bash # Description: rotate nginx access logs NGX_PID=`cat /usr/local/nginx/logs/nginx.pid` LOGS_DIR="/home/wwwlogs" WWW_LOG_NAME="www.demo.com.log" B2B_LOG_NAME="b2b.demo.com.log" MOBILE_LOG_NAME="mobile.demo.com.log" PLIST_LOG_NAME="plist.demo.com.log" cd $LOGS_DIR /usr/bin/mv $WWW_LOG_NAME $(date +%F -d 'yesterday')_$WWW_LOG_NAME /usr/bin/mv $B2B_LOG_NAME $(date +%F -d 'yesterday')_$B2B_LOG_NAME /usr/bin/mv $MOBILE_LOG_NAME $(date +%F -d 'yesterday')_$MOBILE_LOG_NAME /usr/bin/mv $PLIST_LOG_NAME $(date +%F -d 'yesterday')_$PLIST_LOG_NAME /bin/kill -USR1 $NGX_PID

加到cron計划任務中

echo "0 0 * * * /home/scripts/rotate-nginx-logs.sh > /dev/null 2>&1" >> /var/spool/cron/root

=========================================================

2016-07-14

今天小伙伴給了我另一種更簡潔的方式,只要安裝logrotate這個軟件即可。

參考博客: http://www.pythondev.org/post/8.html

假如我們的安裝好的nginx日志路徑在/home/wwwlogs/,nginx進程PID路徑在/usr/local/nginx/logs/nginx.pid

yum install logrotate

安裝完成后,自動在/etc/cron.daily/下生成個logrotate腳本文件。

cd /etc/logrotate.d/

vim nginx 內容如下:

/home/wwwlogs/*log { su root www create 600 www www daily dateext rotate 10 missingok notifempty compress sharedscripts olddir /home/wwwlogs/oldlogs # 這個目錄要事先創建好,並給相關權限 postrotate kill -USR1 `cat /usr/local/nginx/logs/nginx.pid` endscript }

保存退出即可每天自動切割日志。

logrotate詳解:

logrotate 可以直接執行,后面跟配置文件就可以了,如:/usr/sbin/logrotate -f /etc/logrotate.d/nginx

參數:

-v 顯示指令執行過程

-d Debug模式(模擬執行),詳細顯示指令執行過程,便於排錯或了解程序執行的情況。

-f 強制執行

-s <狀態文件>  使用指定的狀態文件

logrotate 的默認配置文件是 /etc/logrotate.conf。主要參數:

daily指定轉儲周期為每天 

weekly指定轉儲周期為每周 

monthly指定轉儲周期為每月 

dateext在文件末尾添加當前日期 

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轉儲后的日志文件和當前日志文件放在同一個目錄下 

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

tabootext [+] list讓logrotate 不轉儲指定擴展名的文件,缺省的擴展名是:.rpm-orig, .rpmsave, v, 和 ~ 

size size當日志文件到達指定的大小時才轉儲,Size 可以指定 bytes (缺省)以及KB (sizek)或者MB (sizem). 

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

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

實例:

crontab -e

59 23 * * *  /usr/sbin/logrotate -f /etc/logrotate.d/nginx      # 把Nginx日志全部轉儲

vi /etc/logrotate.d/nginx

/var/log/nginx/*.log {

        daily#指定轉儲周期為每天 

        missingok

        rotate 52

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

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

        ifempty

        create 0640 www-data adm

        sharedscripts

        postrotate

  #kill -USR1 `cat /var/run/nginx.pid不是中止Nginx的進程,而是傳遞給它信號重新生成日志,如果nginx沒啟動不做操作

                [ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid`

        endscript

}

Q&A

1.如何測試logrotate程序執行的情況

答:/usr/sbin/logrotate -d /etc/logrotate.d/nginx

2.怎么查看log文件的具體執行情況

答:cat /var/lib/logrotate/status

3.使用-v或-d參數時,顯示log does not need rotating

答:logrotate在對status未記錄的文件進行轉儲時,會在status添加一條該文件的記錄,並將操作時間設為當天。之后程序再次對此文件進行轉儲時發現這個文件今天已經操作過,就不再進行相關操作。

解決方法:1. vi /var/lib/logrotate/status  更改相對應的文件操作日期

 2. 使用-s指定狀態文件

4.分割日志時報錯:error: skipping "/var/log/nginx/test.access.log" because parent directory has insecure permissions (It's world writable or writable by group which is not "root") Set "su" directive in config file to tell logrotate which user/group should be used for rotation.

答:添加“su root list”到/etc/logrotate.d/nginx文件中即可

如下;

/var/log/nginx/*.log {

        su root list

        daily

        missingok

        rotate 52

        compress

        delaycompress

        notifempty

        #ifempty

        create 0640 www-data adm

        sharedscripts

        postrotate

                [ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid`

        endscript

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM