Ubuntu

如何正確地自動/手動輪換生產 Rails 應用程序的日誌文件

  • August 6, 2013

我正在接管具有定制的 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 沒有旋轉上述文件夾中的任何日誌。

基本上:

  1. 我希望能夠執行命令手動輪換日誌和/或讓日誌在每個星期天晚上自動輪換。
  2. 如果我需要關閉我的 Rails 應用程序來輪換日誌,我對此沒有任何問題,因為我每週日晚上都有一個維護視窗來執行此操作。
  3. 最後,我不確定是否應該每週將日誌文件壓縮到 bz2 中,或者只每月壓縮與上個月相關的任何輪換日誌的日誌。這主要是因為我不確定這個應用程序是如何利用日誌的,而且我從未使用過 Rails 應用程序,也不必手動配置日誌輪換。

此時我確實需要保留所有日誌文件而不丟棄任何文件。歡迎提供有關輪換日誌相關問題的任何資訊,例如在嘗試輪換之前備份日誌。

logrotate系統使用它來輪換日誌,因此您有 2 個選擇。您可以將這些應用程序日誌的輪換合併到系統輪換中,或者設置自己的輪換,然後手動執行它們或從 root 使用者的 crontab 執行它們(假設 Rails 應用程序以 root 執行,因為它的目錄是/root/...)。

系統旋轉

要在系統預先存在的日誌中設置日誌輪換,只需在目錄中添加一個新文件/etc/logrotate.d。呼叫它railsapp.conf。我會使用那裡的其他範例來建構它。還與logrotate手冊頁交談。

使用者輪換

如果您想執行您自己的實例,logrotate您只需為其提供命令行開關即可。

  1. 首先複製一份/etc/logrotate.conf /root/rails_logrotate.conf
  2. 編輯文件,使其按照您想要的方式配置日誌輪換(即保留所有日誌、每週輪換等)
  3. 執行
# 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開關時看到的輸出。

例子

  1. 從此日誌文件開始。
$ 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
  1. 現在執行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
  1. 檢查結果
$ 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 * * * *".

參考

引用自:https://unix.stackexchange.com/questions/85662