logrotate

The logrotate utility is designed to simplify the administration of log files on a system which generates a lot of log files. Logrotate allows for the automatic rotation compression, removal and mailing of log files.

logrotate ↗️は、サーバのログ管理に重宝する道具です。 macOS 上で Dovecot のログの切り替えのために使ってみました。

Installation

MacPorts を使うなら:

# port install logrotate

Configuration

設定が必要です。

全体設定

まず設定ファイルで /opt/local/etc/logrotate.d が include されることを確認します。

# /opt/local/etc/logrotate.conf
# -----------------------------
# 詳細は `man logrotate` で確認ください。
# 毎週ログを切り替えします。
weekly
# 4周回分(上記と合わせると、すなわち4週間分)だけ保存します。
rotate 4
# 切り替え後は新しい空のログファイルを作成します。
create
# 切り替え済みのログファイルの末尾に日付を記します。
dateext
# ログを圧縮します。
compress
# 個々の設定スクリプトは下記のディレクトリに追加して下さい。
include /opt/local/etc/logrotate.d

サーバごとの個別設定

個別のアプリケーションに対しては logrotate.d ディレクトリ下に設定を書きます。 個別設定は全体設定に、後に現れる設定は先に現れる設定にそれぞれ優先します。

Dovecot の例(公式文書そのまま ↗️):

# /opt/local/etc/logrotate.d/dovecot
# ----------------------------------
/opt/local/var/log/dovecot.log {    # 対象とするログファイル。
    weekly
    rotate 4
    missingok           # ログファイルが存在しない場合をエラーとしては扱わない。
    notifempty          # ログが空の場合は切り替えを行わない。
    compress
    delaycompress       # ログの圧縮を次回の切り替え時まで遅延する。
    sharedscripts       # 複数のログ切り替えの際も、スクリプトを一度のみ走らせる。
    postrotate          # 切り替え後(post rotate)に実行されるスクリプト。
        # 内容。/bin/sh により実行される。インデントは任意。
        # MacPorts 由来のコマンドは、PATH の関係上絶対パスで書くことをおすすめ。
        #
        # > マスタープロセスへ SIGUSR1 を送り、ログファイルを再読み込みさせる。
        # > -- doveadm-log(1) より
        /opt/local/bin/doveadm log reopen
    endscript           # スクリプト終了。
}

サービスの有効化

MacPorts でインストールされた logrotate には launchd 用の構成ファイルが存在します。 したがって、次のように logrotate サービスを有効化すれば、自動で起動して定期的に実行されます。

# port load logrotate

なお、提供されるファイルは次のようなものです。

<!-- /opt/local/etc/LaunchDaemons/org.macports.logrotate/org.macports.logrotate.plist -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Disabled</key>
    <true/>
    <key>Label</key>
    <string>org.macports.logrotate</string>
    <key>ProgramArguments</key>
    <array>
        <string>/opt/local/sbin/logrotate</string>
        <string>/opt/local/etc/logrotate.conf</string>
    </array>
    <key>StartCalendarInterval</key>
    <dict>
        <key>Hour</key>
        <integer>5</integer>
        <key>Minute</key>
        <integer>30</integer>
    </dict>
</dict>
</plist>