2025/07/25 ◆ログローテーションの方式と呼び名 ------ error_log0からerror_log9までの10個のログファイルをローテーションして最大10世代のログを保持する アプリケーションを作りたいと思います。ログのローテーション実装は大きく2種類の方式があります。 方式1. ローテーションのたび、error_log8を9に、7を8に、6を7にと後ろにログをスライドしていき、 最新のログは常にerror_log0ファイルに書き込む方式。 方式2. ローテーションのたび、error_log0から1,2,3…と最新のログを書き込むファイルが変わっていく方式。 それぞれに方式に対して、ソフトウェア開発業界で慣習的な呼称はありますか? ------ 方式1. スライド方式、Move/Rename方式 方式2. ラウンドロビン方式、リングバッファ方式、Circular(循環)方式 ------ rotatelogsには-pという、最新のログを書き込んでいるファイルの名前を保持するファイルに関するオプションがあります。 ということは、rotatelogsはラウンドロビン方式(方式2)ではありませんか? ------ ChatGPTの回答: いいや。rotatelogsも最新は常にerror_log0になるはず(方式1のはず) Claudeの回答: そうです。rotatelogsは方式2です。 Geminiの回答: 若干差異はあるが方式2に分類されます。 ------ logrotate、java.util.loggingのFileHandlerは方式1 rotatelogsは方式2 ◆Apacheのログにlogrotateを適用する ------ /etc/logrotate.d/apache2 実行タイミング:/etc/cron.daily/logrotate により 1日1回実行(または手動でも可) ------ サンプル ------ /usr/local/apache2/logs/*log { daily rotate 10 missingok notifempty compress delaycompress sharedscripts postrotate /bin/systemctl reload apache2 > /dev/null 2>/dev/null || true endscript } ------ 試した例(systemd未登録のためapachectlを使用) ------ /usr/local/apache2/logs/*log { hourly rotate 14 missingok notifempty compress delaycompress sharedscripts postrotate /usr/local/apache2/bin/apachectl restart > /dev/null 2>/dev/null || true endscript } ------ /etc/logrotate.d/tomcat-catalinaout ------ /opt/tomcat11/logs/catalina.out { daily rotate 10 missingok notifempty copytruncate compress delaycompress } ------ オプションの参考サイト https://qiita.com/shotets/items/e13e1d1739eaea7b1ff9 ------ # 設定ファイルの構文チェックと動作確認(実際にはローテーションしない) logrotate -d /etc/logrotate.conf # 特定の設定ファイルのみをテスト logrotate -d /etc/logrotate.d/apache2 logrotate -d /etc/logrotate.d/tomcat # 実際にローテーションを実行(条件に関係なく) cd /usr/local/apache2/logs sudo logrotate -v -f /etc/logrotate.d/apache2 sudo logrotate -v -f /etc/logrotate.d/tomcat ------ ◆Tomcatのログにlogrotateを適用する 【1】まず、conf/logging.propertiesの各FileHandlerに 1catalina.org.apache.juli.AsyncFileHandler.rotatable = false (2も同様) を追記して、catalina***.log、localhost***.logなどのファイル名にYYYY-MM-DDがつくのを止める。 https://coconala.com/blogs/2780692/125666/ またmanager.log、host-manager.logは使わないのでコメントにしてもいいかもしれない。 【2】localhost_access***.logのYYYY-MM-DDのローテーションも止める。 これは conf/server.xmlで変更する(3行目) ------ ------ https://qiita.com/kome12y3/items/68ea9b1d1f20d8b48f5b 【3】setenv.shのCATALINA_OUTをコメントにし、rotatelogsのローテーションを止める。 【4】Tomcatを停止、ログを掃除、Tomcatを起動する 【5】/etc/logrotate.d/tomcatを作成 /opt/tomcat11/logs/catalina.out /opt/tomcat11/logs/catalina.log /opt/tomcat11/logs/localhost.log/ /opt/tomcat11/logs/localhost_access.txt { copytruncate daily rotate 14 compress missingok create 0644 tomcat11 tomcat su tomcat11 tomcat } https://www.rough-and-cheap.jp/general/understanding-logrotate/ の通り、createとsuでファイルの所有者と実行ユーザーを定義する。 しないとエラーになることがあるそう。 なお、1つのファイルに複数のエントリが書けるので、tomcat11-19の設定を全て tomcatという1つのファイルに書くこともできそう。 【6】cron登録はrootでcrontabを書かなくても書きで設定できるらしい。 /etc/cron.daily/logrotate ------ ---------------------------------------- ApacheもTomcatもローテーションされない… ---------------------------------------- 理由を調べる… journalctl -u logrotate ------ Jul 28 00:00:05 gceinst1 logrotate[2205287]: error: failed to rename /usr/local/apache2/logs/access_log to /usr/local/apache2/logs/access_log-20250728: Read-only file system Jul 28 00:00:05 gceinst1 logrotate[2205287]: error: error opening /opt/tomcat11/logs/catalina.out: Permission denied Jul 28 00:00:05 gceinst1 logrotate[2205287]: error: error opening /opt/tomcat11/logs/catalina.log: Permission denied Jul 28 00:00:05 gceinst1 logrotate[2205287]: error: error opening /opt/tomcat11/logs/localhost.log: Permission denied Jul 28 00:00:05 gceinst1 logrotate[2205287]: error: error opening /opt/tomcat11/logs/localhost_access_log.txt: Permission denied Jul 28 00:00:05 gceinst1 systemd[1]: logrotate.service: Main process exited, code=exited, status=1/FAILURE Jul 28 00:00:05 gceinst1 systemd[1]: logrotate.service: Failed with result 'exit-code'. Jul 28 00:00:05 gceinst1 systemd[1]: Failed to start Rotate log files. ------ logrotate.timerを実行しているユーザーは? sudo cat /usr/lib/systemd/system/logrotate.service root ls -ld /opt/tomcat11/logs d--------- のように x 権限がなければ、root でもファイルにアクセスできません。 SELinuxか? sudo ausearch -m avc ------ time->Mon Jul 28 00:00:05 2025 type=PROCTITLE msg=audit(1753628405.077:158597): proctitle=2F7573722F7362696E2F6C6F67726F74617465002F6574632F6C6F67726F746174652E636F6E66 type=SYSCALL msg=audit(1753628405.077:158597): arch=c000003e syscall=257 success=no exit=-13 a0=ffffff9c a1=557fa5758c00 a2=20000 a3=0 items=0 ppid=1 pid=2205287 auid=4294967295 uid=0 gid=0 euid=1005 suid=0 fsuid=1005 egid=1009 sgid=0 fsgid=1009 tty=(none) ses=4294967295 comm="logrotate" exe="/usr/sbin/logrotate" subj=system_u:system_r:logrotate_t:s0 key=(null) type=AVC msg=audit(1753628405.077:158597): avc: denied { read } for pid=2205287 comm="logrotate" name="localhost_access_log.txt" dev="sda2" ino=17460314 scontext=system_u:system_r:logrotate_t:s0 tcontext=unconfined_u:object_r:user_home_t:s0 tclass=file permissive=0 ------ ls -lZ catalina.log 等が user_home_t になっている。 ⇒ var_log_tに変える。 sudo semanage fcontext -a -t var_log_t "/opt/tomcat11/logs(/.*)?" sudo restorecon -Rv /opt/tomcat11/logs ls -lZ 実際には usr_t に変わった。なぜvar_log_tに変更できないのだろう? sudo semanage fcontext -a -t var_log_t "/opt/apache-tomcat-9.0.107/logs(/.*)?" sudo semanage fcontext -a -t var_log_t /opt/apache-tomcat-9.0.107/logs sudo restorecon -Rv /opt/apache-tomcat-9.0.107/logs ls -lZ これだとvar_log_tに変わった。シンボリックリンクtomcat11ではなく、正しく apache-tomcat-9.0.107 を指定する必要があるらしい。 Apacheの方は参考サイト https://www7390uo.sakura.ne.jp/wordpress/archives/1375 と全く同じ現象。 sudo cp -i /usr/lib/systemd/system/logrotate.service /etc/systemd/system/. sudo nano /etc/systemd/system/logrotate.service [Service] (snip) ProtectSystem=full ReadWritePaths=/usr/local/apache2/logs sudo systemctl daemon-reload sudo systemctl restart logrotate.service ------