■logrotateの設定について
AlamLinuxをMinimalでインストールしたからなのか、理由がよくわからないのですが、logrotate自体はインストールされているものの/var/log配下のcronやmessageなどのファイルが肥大化しつづけていました。これは追加でrsyslog-logrotateをインストールする必要がありました。
# dnf install rsyslog-logrotate |
これにより/etc/logrotate.confが生成され、デフォルトは週ローテイトで4世代まで保存されます。
週単位でローテイトする場合、ログによっては肥大化が大きく、細かくわけたい場合もあります。そういった場合は毎日ローテイトするということももちろん可能です。以下は毎日30世代分保存する例です。
# vi /etc/logrotate.conf <省略> # rotate log files weekly #weekly daily # keep 4 weeks worth of backlogs #rotate 4 rotate 30 <省略> |
事前テストをする際にはlogrotateに-dvオプションをつけてエラーがないか確認します。
# logrotate -dv /etc/logrotate.conf <省略> |
今すぐ実行するには-fオプションをつけます。
# logrotate -f /etc/logrotate.conf <省略> |
このlogrotateについて動作のトリガーになっているのは軽く調べたらほとんどのサイトでcronまたはanacronということが書かれているのですが、本サーバで調べてもcronからキックされている様子がなく、不思議に思って調査するとsystemd-timerから起動されていることがわかりました。
systemdとはCentOS7から標準導入されるようになったシステム運用の仕組みで、この元で動くタイマーがsystemd-timerです。できることはcronと同じなのですがsystemdを使って管理するところが大きく異なります。まず、logrotateのtimerサービスを確認してみます。
# systemctl list-timers NEXT LEFT LAST PASSED UNIT ACTIVATES > Thu 2024-04-11 14:30:00 JST 43s left Thu 2024-04-11 14:20:00 JST 9min ago sysstat-collect.timer sysstat-co> Thu 2024-04-11 15:28:34 JST 59min left Thu 2024-04-11 13:46:37 JST 42min ago dnf-makecache.timer dnf-makeca> Thu 2024-04-11 19:02:30 JST 4h 33min left Wed 2024-04-10 19:02:30 JST 19h ago systemd-tmpfiles-clean.timer systemd-tm> Fri 2024-04-12 00:00:00 JST 9h left Thu 2024-04-11 00:00:00 JST 14h ago logrotate.timer logrotate.> Fri 2024-04-12 00:00:00 JST 9h left Thu 2024-04-11 00:00:00 JST 14h ago mlocate-updatedb.timer mlocate-up> Fri 2024-04-12 00:00:00 JST 9h left Thu 2024-04-11 00:00:00 JST 14h ago unbound-anchor.timer unbound-an> Fri 2024-04-12 00:07:00 JST 9h left Thu 2024-04-11 00:07:19 JST 14h ago sysstat-summary.timer sysstat-su> 7 timers listed. <以下、参考> # systemctl disable lorotate.timer # systemctl enable lorotate.timer # systemctl stop lorotate.timer # systemctl start lorotate.timer # systemctl status logrotate.timer ● logrotate.timer - Daily rotation of log files Loaded: loaded (/usr/lib/systemd/system/logrotate.timer; enabled; preset: enabled) Active: active (waiting) since Thu 2024-02-29 18:36:24 JST; 1 month 11 days ago Until: Thu 2024-02-29 18:36:24 JST; 1 month 11 days ago Trigger: Fri 2024-04-12 00:00:00 JST; 9h left Triggers: ● logrotate.service Docs: man:logrotate(8) man:logrotate.conf(5) Notice: journal has been rotated since unit was started, output may be incomplete. |
logrotateが深夜0時にタイマーされていることがおわかり頂けます。
logrotateに関して大きく関係するファイルは以下の2つです。
・/usr/lib/systemd/system/logrotate.service
・/usr/lib/systemd/system/logrotate.timer
timerの方では時間指定を行っております。dailyとなっているので日時で起動します。また、同時に他のプロセスも起動した場合に備えてAccuracySecの分、ランダムに時間を変更できるよう指定しています。
# more /usr/lib/systemd/system/logrotate.timer [Unit] Description=Daily rotation of log files Documentation=man:logrotate(8) man:logrotate.conf(5) [Timer] OnCalendar=daily AccuracySec=1h Persistent=true [Install] WantedBy=timers.target |
logrotate.serviceが実際の実行ファイルです。上で編集したlogrotate.confを指定して実行していることがわかります。
# more /usr/lib/systemd/system/logrotate.service [Unit] Description=Rotate log files Documentation=man:logrotate(8) man:logrotate.conf(5) RequiresMountsFor=/var/log ConditionACPower=true [Service] Type=oneshot ExecStart=/usr/sbin/logrotate /etc/logrotate.conf # performance options Nice=19 IOSchedulingClass=best-effort IOSchedulingPriority=7 # hardening options # details: https://www.freedesktop.org/software/systemd/man/systemd.exec.html # no ProtectHome for userdir logs # no PrivateNetwork for mail deliviery # no NoNewPrivileges for third party rotate scripts # no RestrictSUIDSGID for creating setgid directories LockPersonality=true MemoryDenyWriteExecute=true PrivateDevices=true PrivateTmp=true ProtectClock=true ProtectControlGroups=true ProtectHostname=true ProtectKernelLogs=true ProtectKernelModules=true ProtectKernelTunables=true ProtectSystem=full RestrictNamespaces=true RestrictRealtime=true |
基本的に中身を変えることはないと思うのですが、1時間おきとかに変更したい場合は以下のコマンドで設定を反映させる必要があります。
# systemctl daemon-reload |