環境
- Ubuntu 16.04 LTS
VirtualBoxなどで実験用の環境を用意して試したほうが良いです。
目的
logrotateのlogrotateスクリプトで圧縮したファイルのパスを利用したい。
ここではログファイルのうち /var/log/syslog を対象に考えることにします。
前提
- ローテート時にファイル名の接尾辞として日付が付与されるようにする(dateextオプション追加)
- 上記以外はpostrotateを除きlogrotateのデフォルト設定を変更しない
手順
実験用の環境にSSH接続して以下用途別に6つコンソールを開きます。
(1つのコンソールで頑張っても良いですが…)
- /etc/logrotate.d/rsyslog 編集用
- /var/log/syslog* ファイル監視用
- デバッグログ監視
- syslog 出力用
- 日付インクリメント用
- ログローテート実行用
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 ------------------------------
ということで、あとは取得したパスをコマンドの引数として利用できますね。
以上です。