Skip to content
Artwork for 八百万のOSS
八百万のOSS · Tuesday · 1 hr

#24 ログローテートで何が起きている?ファイルディスクリプタとinodeの仕組み

CloudWatch Logsのようなクラウドのログ機能も、裏側ではログファイルを読み取り、別のサーバーへ送る仕組みが動いています。今回はFluentdを入口に、Linuxのファイル操作とログローテートの仕組みをcatatsuyが解説します。 まずはファイルディスクリプタとinodeの基本から。`read()`によるファイルポジションの更新、並行処理での`pread()`の利用、複数プロセスからログを書き込む際の`O_APPEND`と`write()`の関係を説明します。 続いてログローテートの仕組みを掘り下げます。ファイルを`mv`してもinodeは変わらず、開いたままのファイルディスクリプタは古いファイルを参照し続けます。Fluentdの`in_tail`はどうやってローテートを検知するのか。inotifyによるファイル監視がログの書き込み頻度によってCPU負荷を高める問題や、`enable_stat_watcher`による対策も紹介します。さらに、nginxが`USR1`シグナルでログを開き直す理由や、logrotateの`create`と`nocreate`の違いも解説します。 logrotateの`O_EXCL`によるファイル作成にも触れ、最後はFluentdの不具合をcronの`touch`で回避した結果、ログファイルの所有者がrootになり、アプリケーションが書き込めなくなった実際の障害を紹介します。 普段は意識しないLinuxのファイル操作が、ログ収集や運用上の問題にどうつながるのかを掘り下げる回です。 ## 関連リンク - catatsuy「logrotateの設定とファイルのアクセスモードについて」(2018年): https://catatsuy.medium.com/logrotateの設定とファイルのアクセスモードについて-f9719352dada - Fluentd: https://www.fluentd.org/ - Fluentd(GitHub): https://github.com/fluent/fluentd - Fluentd in_tail(rotate_wait / enable_stat_watcher): https://docs.fluentd.org/input/tail - Fluentdのログローテート検知時のwatcher修正: https://github.com/fluent/fluentd/pull/1598 - Fluent Bit: https://fluentbit.io/ - logrotate: https://github.com/logrotate/logrotate - logrotateのファイル作成処理(O_EXCL): https://github.com/logrotate/logrotate/blob/1aba3764602a0a013ac3fb1ee57ed547dff03f88/logrotate.c#L600-L614 - logrotate(8): https://man7.org/linux/man-pages/man8/logrotate.8.html - Debianのnginxパッケージのlogrotate設定: https://sources.debian.org/src/nginx/1.26.3-3+deb13u7/debian/nginx-common.nginx.logrotate/ - nginxのシグナル制御(USR1): https://nginx.org/en/docs/control.html - open(2): https://man7.org/linux/man-pages/man2/open.2.html - write(2): https://man7.org/linux/man-pages/man2/write.2.html - pread(2): https://man7.org/linux/man-pages/man2/pread.2.html - inotify(7): https://man7.org/linux/man-pages/man7/inotify.7.html - Go os.SameFile: https://pkg.go.dev/os#SameFile - Go os.File.ReadAt: https://pkg.go.dev/os#File.ReadAt - Amazon CloudWatch Logs: https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/WhatIsCloudWatchLogs.html ───────────── YouTube: https://youtu.be/vcakJioDvIs Web: https://yaoyorozu-oss.henteko07.com/ X: https://x.com/yaoyorozu_oss

0:00-1:00:48

transcript

No transcript — this publisher did not publish one.

show notes

CloudWatch Logsのようなクラウドのログ機能も、裏側ではログファイルを読み取り、別のサーバーへ送る仕組みが動いています。今回はFluentdを入口に、Linuxのファイル操作とログローテートの仕組みをcatatsuyが解説します。


まずはファイルディスクリプタとinodeの基本から。`read()`によるファイルポジションの更新、並行処理での`pread()`の利用、複数プロセスからログを書き込む際の`O_APPEND`と`write()`の関係を説明します。


続いてログローテートの仕組みを掘り下げます。ファイルを`mv`してもinodeは変わらず、開いたままのファイルディスクリプタは古いファイルを参照し続けます。Fluentdの`in_tail`はどうやってローテートを検知するのか。inotifyによるファイル監視がログの書き込み頻度によってCPU負荷を高める問題や、`enable_stat_watcher`による対策も紹介します。さらに、nginxが`USR1`シグナルでログを開き直す理由や、logrotateの`create`と`nocreate`の違いも解説します。


logrotateの`O_EXCL`によるファイル作成にも触れ、最後はFluentdの不具合をcronの`touch`で回避した結果、ログファイルの所有者がrootになり、アプリケーションが書き込めなくなった実際の障害を紹介します。


普段は意識しないLinuxのファイル操作が、ログ収集や運用上の問題にどうつながるのかを掘り下げる回です。


## 関連リンク


- catatsuy「logrotateの設定とファイルのアクセスモードについて」(2018年): https://catatsuy.medium.com/logrotateの設定とファイルのアクセスモードについて-f9719352dada

- Fluentd: https://www.fluentd.org/

- Fluentd(GitHub): https://github.com/fluent/fluentd

- Fluentd in_tail(rotate_wait / enable_stat_watcher): https://docs.fluentd.org/input/tail

- Fluentdのログローテート検知時のwatcher修正: https://github.com/fluent/fluentd/pull/1598

- Fluent Bit: https://fluentbit.io/

- logrotate: https://github.com/logrotate/logrotate

- logrotateのファイル作成処理(O_EXCL): https://github.com/logrotate/logrotate/blob/1aba3764602a0a013ac3fb1ee57ed547dff03f88/logrotate.c#L600-L614

- logrotate(8): https://man7.org/linux/man-pages/man8/logrotate.8.html

- Debianのnginxパッケージのlogrotate設定: https://sources.debian.org/src/nginx/1.26.3-3+deb13u7/debian/nginx-common.nginx.logrotate/

- nginxのシグナル制御(USR1): https://nginx.org/en/docs/control.html

- open(2): https://man7.org/linux/man-pages/man2/open.2.html

- write(2): https://man7.org/linux/man-pages/man2/write.2.html

- pread(2): https://man7.org/linux/man-pages/man2/pread.2.html

- inotify(7): https://man7.org/linux/man-pages/man7/inotify.7.html

- Go os.SameFile: https://pkg.go.dev/os#SameFile

- Go os.File.ReadAt: https://pkg.go.dev/os#File.ReadAt

- Amazon CloudWatch Logs: https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/WhatIsCloudWatchLogs.html


─────────────

YouTube: https://youtu.be/vcakJioDvIs

Web: https://yaoyorozu-oss.henteko07.com/

X: https://x.com/yaoyorozu_oss