0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

logrotate postrotate スクリプトの挙動確認 (/var/log/syslog)

Last updated at Posted at 2020-01-18

環境

  • Ubuntu 16.04 LTS

VirtualBoxなどで実験用の環境を用意して試したほうが良いです。

目的

logrotateのlogrotateスクリプトで圧縮したファイルのパスを利用したい。
ここではログファイルのうち /var/log/syslog を対象に考えることにします。

前提

  • ローテート時にファイル名の接尾辞として日付が付与されるようにする(dateextオプション追加)
  • 上記以外はpostrotateを除きlogrotateのデフォルト設定を変更しない

手順

実験用の環境にSSH接続して以下用途別に6つコンソールを開きます。
(1つのコンソールで頑張っても良いですが…)

  1. /etc/logrotate.d/rsyslog 編集用
  2. /var/log/syslog* ファイル監視用
  3. デバッグログ監視
  4. syslog 出力用
  5. 日付インクリメント用
  6. ログローテート実行用

1. /etc/logrotate.d/rsyslog 編集

ログローテートの設定を編集します。

$ sudo vi /etc/logrotate.d/rsyslog

ログローテートが起こった時にファイル名の接尾辞に日付が付与され、
postrotateで /var/log/logrotate.log にログを出力するようにします。

/var/log/syslog
{
        rotate 7
        daily
        missingok
        notifempty
        dateext # <= 追加
        delaycompress
        compress
        su root adm # <= cron実行の際には必要かも
        postrotate
                /usr/lib/rsyslog/rsyslog-rotate

                echo "begin------------------------------" >> /var/log/logrotate.log
                COMPRESSED_YYYYMMDD=$(date --date '1 day ago' +%Y%m%d)
                for f in $1
                do
                        echo "${f}" >> /var/log/logrotate.log
                        TARGET_LOGFILE="${f}-${COMPRESSED_YYYYMMDD}.gz"
                        echo "${TARGET_LOGFILE}" >> /var/log/logrotate.log
                        if [ -e ${TARGET_LOGFILE} ]; then
                                echo "exist !" >> /var/log/logrotate.log
                        else
                                echo "not exist..." >> /var/log/logrotate.log
                        fi
                done
                echo "end  ------------------------------" >> /var/log/logrotate.log
        endscript
}
以下省略

なお、Ubuntu 16.04LTSにおいて syslog グループが無いにもかかわらず、
/etc/logrotate.conf で su root syslog が設定されている問題があり、
su オプションの明示的な指定が必要かもしれません。
(今一つ、把握できていません)

$ less /etc/logrotate.conf

su root syslog

$ groups

ユーザー名 adm cdrom sudo dip plugdev lxd lpadmin sambashare

2. /var/log/syslog* ファイル監視

ログがローテートされていく様を監視します。

$ watch -n 10 "ls -l /var/log/syslog*"

3. デバッグログ監視

ログローテート時のデバッグログを監視します。

$ tail -f /var/log/logrotate.log

4. syslog 出力

/var/log/syslog にログを出力します。

$ logger aaaaaaa

5. 日付インクリメント

システム時刻を1日進めます。

$ sudo date --set "$(date --date '1 day')"

なお、実際のローテートの発動タイミングは以下で確認できます。

$ sudo less /etc/crontab

以下から6時25分に発動するとわかります。

25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )

こいつが発動元ですね。

$ ll /etc/cron.daily/logrotate
-rwxr-xr-x 1 root root 372 May  6  2015 /etc/cron.daily/logrotate

以下のように設定して起動することもできます。

$ sudo date -s "2020/01/27 06:24:59"

この場合、日付更新を止めておく必要があります。

$ sudo timedatectl set-ntp 0

6. ログローテート実行

ログローテートを強制実行します。

sudo logrotate -f -v /etc/logrotate.conf

事前に -d オプションで実際のログローテートをせずにドライランして、
権限エラー有無などを確認しておくと効率が良いと思います。
(-d 付けてることを忘れて「あれ?ログがローテートされてない?」と焦らないようにお気を付けください)

sudo logrotate -d /etc/logrotate.conf

ということで…

1 で編集し、
2, 3 の表示を確認しながら、
4, 5, 6 を繰り返す

という手順で挙動を確認します。

結果

手順を何度か繰り返すと…

/var/log/syslog* ファイル監視用コンソールで、
昨日日付のログファイルが圧縮されていることが確認できます。

Every 10.0s: ls -l /var/log/syslog*                     Tue Jan 28 23:57:39 2020

-rw-r----- 1 syslog adm   0 Jan 28 23:56 /var/log/syslog
-rw-r----- 1 syslog adm 191 Jan 26 23:55 /var/log/syslog-20200126.gz
-rw-r----- 1 syslog adm 194 Jan 27 23:56 /var/log/syslog-20200127.gz
-rw-r----- 1 syslog adm 603 Jan 28 23:56 /var/log/syslog-20200128

次に、デバッグログ監視コンソールでは、
logrotateスクリプトの中で圧縮されたログファイルのパスを
取得できていることが確認できます。

begin------------------------------
/var/log/syslog
/var/log/syslog-20200125.gz
not exist...
end  ------------------------------
begin------------------------------
/var/log/syslog
/var/log/syslog-20200126.gz
exist !
end  ------------------------------
begin------------------------------
/var/log/syslog
/var/log/syslog-20200127.gz
exist !
end  ------------------------------

ということで、あとは取得したパスをコマンドの引数として利用できますね。

以上です。

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?