トップ 差分 一覧 ソース 検索 ヘルプ PDF RSS ログイン

logfile_moveing

ログファイルをmoveしたらえらいこっちゃ!?

運用監視業務をしているとログファイルのローテーションなんてことを
する機会が多いと思います。

ログファイルのローテーションにも色々と方法が考えられますが今回は
一般的なmoveでファイル名を変名しするパターンの際の注意事項です。

さて、定期的に出力されているログファイル(syslogなど)をUNIXのmv(move)コマンドで
ファイル名を変名したらどういうことが起こるのでしょうか?

この事を知っていないとログ監視する際にえらいことになってしまいますので
知っていると良いと思います。

ログファイルのmove検証

では、Linuxのmessages(syslog)ファイルをmoveしたらどうなるのか検証してみます。

1.現在の状況確認とログファイルのmove

ここではファイルのinode番号が重要なポイントですのでコマンドはinode番号を
表示する為に「-i」オプションをつけて実行しています。
※一番左側の数字がinode番号になります。

[root@asiapacific log]# ls -li messages*
2785680 -rw-------  1 root root  29144  7月 21 23:02 messages
2785622 -rw-------  1 root root 154460  7月 13 01:38 messages.1
2785682 -rw-------  1 root root  60483  5月  1 11:01 messages.2
2785562 -rw-------  1 root root  27860  4月 28 18:55 messages.3
2785331 -rw-------  1 root root 206133  4月 13 19:40 messages.4
[root@asiapacific log]# 
[root@asiapacific log]# mv messages messages.old

inode番号『2785680』のmessagesファイルをmoveしてみました。
さてinode番号はどうなっているのでしょうか?

2.move後のファイル確認(inode番号)

moveしたろところinode番号は変わらずにファイル名だけ変名されています!!

[root@asiapacific log]# ls -li messages*
2785622 -rw-------  1 root root 154460  7月 13 01:38 messages.1
2785682 -rw-------  1 root root  60483  5月  1 11:01 messages.2
2785562 -rw-------  1 root root  27860  4月 28 18:55 messages.3
2785331 -rw-------  1 root root 206133  4月 13 19:40 messages.4
2785680 -rw-------  1 root root  29144  7月 21 23:02 messages.old
[root@asiapacific log]# 

3.messagesファイルに文字列を書き込んでみます。

loggerコマンドでmessagesに文字列を書き込むテストをしてみます。
loggerが何するのかよく分からない人は『man logger』などで
調べてみてください。運用監視系ではよく使うコマンドの一つだと思いますので。

[root@asiapacific log]# logger "syslog moveing `date`"
[root@asiapacific log]# tail messages.old
Jul 21 23:00:40 asiapacific kernel: fb0: VGA16 VGA frame buffer device
Jul 21 23:00:41 asiapacific fstab-sync[3702]: removed all generated mount points
Jul 21 23:00:42 asiapacific fstab-sync[3727]: added mount point /media/cdrecorder  for /dev/hdb
Jul 21 23:04:38 asiapacific root: syslog moveing 2007年  7月 21日 土曜日 23:04:38 JST
[root@asiapacific log]# 

なんと変名したはずの『messages.old』ファイルに書き込まれているではありませんかっ!
以下の部分がその部分になります。

Jul 21 23:04:38 asiapacific root: syslog moveing 2007年  7月 21日 土曜日 23:04:38 JST

4.syslogデーモンをリフレッシュして新たにmessagesファイルを作成する。

元のmessagesファイルはmoveでmessages.oldに変名されてしまったのでファイルがありません。
「3.」の事象から今後はmessages.oldの方へログが出力されることになります。
もし、messagesファイルをログ監視していたら大変っ!監視されていないことになります!
ってことで、syslogデーモンを『kill -HUP』コマンドでリフレッシュします。
『kill -HUP』の代わりにLinuxなら『service syslod restart』などでも構わないと思います。
※『service syslod restart』するとPIDが変わるのでPIDによるプロセス監視などを実装しているとこれまた影響ありありなわけです。。。 >_<

[root@asiapacific log]# ps -ef | grep syslog | grep -v grep
root      2690     1  0 23:00 ?        00:00:00 syslogd -m 0
canna     3046     1  0 23:00 ?        00:00:00 /usr/sbin/cannaserver -syslog -u   canna
[root@asiapacific log]# kill -HUP 2690
[root@asiapacific log]# ps -ef | grep syslog | grep -v grep
root      2690     1  0 23:00 ?        00:00:00 syslogd -m 0
canna     3046     1  0 23:00 ?        00:00:00 /usr/sbin/cannaserver -syslog -u canna
[root@asiapacific log]# 

『kill -HUP』ならプロセスID(PID)が変更されていないですね!

5.syslogデーモンのリフレッシュ

syslogデーモンプロセスのリフレッシュ後にもう一度『logger』コマンドで
文字列を書き込んでみよう。

[root@asiapacific log]# ll messages*
-rw-------  1 root root     49  7月 21 23:05 messages
-rw-------  1 root root  29233  7月 21 23:04 messages.old

リフレッシュしたら新しくmessagesが作成されていますね。

[root@asiapacific log]# logger "syslog moveing `date`"
[root@asiapacific log]# cat messages
Jul 21 23:05:07 asiapacific syslogd 1.4.1: restart.
Jul 21 23:05:23 asiapacific root: syslog moveing 2007年  7月 21日 土曜日 23:05:23 JST
[root@asiapacific log]# 

今度は新しく作成されたmessagesファイルの方にキチンと書き込まれていますね。
一安心です。

6.この検証で分かったポイントは?

  • mvでファイルを変名してもinode番号は変わらない。
  • syslodデーモンはinodeをポインタしているようでファイルを変名しても旧ファイル名のinode番号を持つファイルにログを書き込む。
  • デーモンをリフレッシュする際にkill -HUPを使うことでPIDを変えずにリフレッシュ出来る。

日々業務で忙しいですが、時間があればinode番号、ファイルサイズなどをチェックし、
オリジナルのログファイルを切り出すスクリプトやログローテーションのスクリプトなども紹介していきたいと思います。