RHEL9のlogrotate

Red Hat Enterprise Linux 9（CentOS 9）のlogrotateは、cronではなくsystemd-timerで起動している。


```
# cat /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
```
|オプション|説明|
|:--|:--|
|Description|Unitの説明文|
|Documentation|ドキュメントのURI|
|ConditionACPower||
|Type||
|ExecStart||
|Nice||
|IOSchedulingClass||
|IOSchedulingPriority||
|LockPersonality||
|MemoryDenyWriteExecute||
|PrivateDevices||
|PrivateTmp||
|ProtectClock||
|ProtectControlGroups||
|ProtectHostname||
|ProtectKernelLogs||
|ProtectKernelModules||
|ProtectKernelTunables||
|ProtectSystem||
|RestrictNamespaces||
|RestrictRealtime||




```
# cat /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
```
|オプション|説明|
|:--|:--|
|Description|Unitの説明文|
|Documentation|ドキュメントのURI|
|OnCalendar|実行するタイミング|
|AccuracySec|実行タイミングの精度。OnCalendarの設定時刻からこの時間以内に実行される。小さくすればするほどCPU負荷が高くなる。|
|Persistent|"true"に設定すると、指定したタイミングで実行されなかった場合に、システム再起動後に時間外でも実行する|
|WantedBy|enable設定時に前提とするUnit。このUnitの.wantsディレクトリにリンクを作成する。|



systemd-timerで起動しているサービス
```
# systemctl list-timers
NEXT                        LEFT          LAST                        PASSED    UNIT                         ACTIVATES
Fri 2024-09-27 20:12:24 JST 43min left    Fri 2024-09-27 19:05:49 JST 23min ago dnf-makecache.timer          dnf-makecache.service
Sat 2024-09-28 00:00:00 JST 4h 30min left Fri 2024-09-27 00:00:01 JST 19h ago   logrotate.timer              logrotate.service
Sat 2024-09-28 00:00:00 JST 4h 30min left Fri 2024-09-27 00:00:01 JST 19h ago   mlocate-updatedb.timer       mlocate-updatedb.service
Sat 2024-09-28 12:01:16 JST 16h left      Fri 2024-09-27 12:01:16 JST 7h ago    systemd-tmpfiles-clean.timer systemd-tmpfiles-clean.service

4 timers listed.
Pass --all to see loaded but inactive timers, too.
```




logrotate.serviceがsystemd-timerで動いているのは分かった。
で、weekly,monthly,yearlyっていつやねん
↓
```
$ man logrotate
・・・
Frequency
       hourly Log  files  are  rotated  every  hour.   Note that usually logrotate is configured to be run by cron daily.  You have to change this configuration and run logrotate hourly to be able to  really  rotate logs hourly.

       daily  Log files are rotated every day.

       weekly [weekday]
              Log  files  are  rotated  once each weekday, or if the date is advanced by at least 7 days since the last rotation (while ignoring the exact time).  The weekday interpretation  is  following:  0  means Sunday, 1 means Monday, ..., 6 means Saturday; the special value 7 means each 7 days, irrespectively of weekday.  Defaults to 0 if the weekday argument is omitted.

       monthly
              Log files are rotated the first time logrotate is run in a month (this is normally on the first  day of the month).

       yearly Log files are rotated if the current year is not the same as the last rotation.

       size size
              Log  files are rotated only if they grow bigger than size bytes.  If size is followed by k, the size is assumed to be in kilobytes.  If the M is used, the size is in megabytes, and if G  is  used,  the size is in gigabytes. So size 100, size 100k, size 100M and size 100G are all valid.  This option is mutually exclusive with the time interval options, and it causes log files to be rotated without regard  for  the  last  rotation time, if specified after the time criteria (the last specified option takes the precedence).
```
|オプション|説明|
|:--|:--|
|hourly|1時間ごとにローテーション。通常logrotateはcronによって1日に1回実行されるように設定されているので、logrotateを1時間ごとに実行するように設定変更する必要がある。|
|daily|毎日ローテーション。|
|weekly|指定した曜日に1回、または日付が前回から少なくとも7日進んだ場合 (正確な時間は無視) にローテーション。"0"は日曜日、"1"は月曜日、...、"6"は土曜日、"7"は曜日に関係なく7日ごと。引数が省略した場合は日曜日。|
|monthly|ログ ファイルは、月に最初に logrotate が実行されたときにローテーションされます (通常は月の最初の日)。|
|yearly|現在の年が前回のローテーションと同じでない場合にのみローテーション。|
|size|指定サイズよりも大きくなった場合にのみローテーション。このオプションは時間間隔オプションと相互に排他的であり、時間基準の後に指定されている場合、ログ ファイルは前回のローテーション時間に関係なくローテーション (最後に指定されたオプションが優先される)。|