nginx日誌切割的2種方法

  • 2019 年 10 月 4 日
  • 筆記

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

}

Tags: