如何正確地自動/手動輪換生產 Rails 應用程序的日誌文件
我正在接管具有定制的 3rd 方 Rails 應用程序的伺服器的管理。應用程序開發人員告訴我 ruby 日誌文件越來越大,並指向以下連結:- https://stackoverflow.com/questions/4883891/ruby-on-rails-production-log-rotation
日誌位於 /root/production/app/log 中。此文件夾包含多個以 .log 結尾的文件。目前日誌文件大小約為 2GB,該文件夾還包含格式為“logname.log.2013_01_18.bz2”的歸檔日誌文件。
我嘗試搜尋 ssh 命令歷史以查看是否可以看到用於創建存檔文件的命令,但這些命令並沒有回溯到那麼遠。我還執行了“cat /var/lib/logrotate/status”,但它看起來不像 logrotate 沒有旋轉上述文件夾中的任何日誌。
基本上:
- 我希望能夠執行命令手動輪換日誌和/或讓日誌在每個星期天晚上自動輪換。
- 如果我需要關閉我的 Rails 應用程序來輪換日誌,我對此沒有任何問題,因為我每週日晚上都有一個維護視窗來執行此操作。
- 最後,我不確定是否應該每週將日誌文件壓縮到 bz2 中,或者只每月壓縮與上個月相關的任何輪換日誌的日誌。這主要是因為我不確定這個應用程序是如何利用日誌的,而且我從未使用過 Rails 應用程序,也不必手動配置日誌輪換。
此時我確實需要保留所有日誌文件而不丟棄任何文件。歡迎提供有關輪換日誌相關問題的任何資訊,例如在嘗試輪換之前備份日誌。
logrotate
系統使用它來輪換日誌,因此您有 2 個選擇。您可以將這些應用程序日誌的輪換合併到系統輪換中,或者設置自己的輪換,然後手動執行它們或從 root 使用者的 crontab 執行它們(假設 Rails 應用程序以 root 執行,因為它的目錄是/root/...
)。系統旋轉
要在系統預先存在的日誌中設置日誌輪換,只需在目錄中添加一個新文件
/etc/logrotate.d
。呼叫它railsapp.conf
。我會使用那裡的其他範例來建構它。還與logrotate
手冊頁交談。使用者輪換
如果您想執行您自己的實例,
logrotate
您只需為其提供命令行開關即可。
- 首先複製一份
/etc/logrotate.conf
/root/rails_logrotate.conf
- 編輯文件,使其按照您想要的方式配置日誌輪換(即保留所有日誌、每週輪換等)
- 執行
# 1st time $ logrotate -d -f -s $HOME/my_logrotate.state logrotate.conf # afterwards $ logrotate -d -s $HOME/my_logrotate.state logrotate.conf
-d
如果一切正常,您可以在沒有開關的情況下重新執行這些命令。這僅用於調試目的,實際上不會執行任何任務,只是向您展示它會做什麼。$ logrotate -s $HOME/my_logrotate.state logrotate.conf
您還可以使用
-v
開關使其詳細,類似於使用-d
開關時看到的輸出。例子
- 從此日誌文件開始。
$ dd if=/dev/zero of=afile bs=1k count=10k 10240+0 records in 10240+0 records out 10485760 bytes (10 MB) copied, 0.0702393 s, 149 MB/s $ ll afile -rw-rw-r-- 1 saml saml 10485760 Aug 6 14:37 afile $ touch -t 201307010101 afile $ ll afile -rw-rw-r-- 1 saml saml 10485760 Jul 1 01:01 afile
- 現在執行
logrotate
$ logrotate -v -f -s $HOME/my_logrotate.state logrotate.conf reading config file logrotate.conf reading config info for /home/saml/afile Handling 1 logs rotating pattern: /home/saml/afile forced from command line (1 rotations) empty log files are rotated, old logs are removed considering log /home/saml/afile log needs rotating rotating log /home/saml/afile, log->rotateCount is 1 dateext suffix '-20130806' glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]' glob finding old rotated logs failed renaming /home/saml/afile to /home/saml/afile-20130806 creating new /home/saml/afile mode = 0664 uid = 500 gid = 501
- 檢查結果
$ ll afile* -rw-rw-r-- 1 saml saml 0 Aug 6 14:40 afile -rw-rw-r-- 1 saml saml 10485760 Jul 1 01:01 afile-20130806
每週計劃
要讓這個在每個星期天執行,您可以為 root 使用者創建以下 crontab 條目。
$ crontab -e
添加以下行:
# Example of job definition: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat # | | | | | # * * * * * user-name command to be executed 0 0 * * sun logrotate -v -f -s $HOME/my_logrotate.state $HOME/logrotate.conf
然後保存上面的。
您還可以使用這些類型的快捷方式,而不是指定實際的天數、分鐘數、秒數等。
string meaning ------ ------- @reboot Run once, at startup. @yearly Run once a year, "0 0 1 1 *". @annually (same as @yearly) @monthly Run once a month, "0 0 1 * *". @weekly Run once a week, "0 0 * * 0". @daily Run once a day, "0 0 * * *". @midnight (same as @daily) @hourly Run once an hour, "0 * * * *".
參考