モーダルを閉じる工作HardwareHub ロゴ画像

工作HardwareHubは、ロボット工作や電子工作に関する情報やモノが行き交うコミュニティサイトです。さらに詳しく

利用規約プライバシーポリシー に同意したうえでログインしてください。

工作HardwareHub ロゴ画像 (Laptop端末利用時)
工作HardwareHub ロゴ画像 (Mobile端末利用時)

logrotate の基本事項

モーダルを閉じる

ステッカーを選択してください

モーダルを閉じる

お支払い内容をご確認ください

購入商品
」ステッカーの表示権
メッセージ
料金
(税込)
決済方法
GooglePayマーク
決済プラットフォーム
確認事項

利用規約をご確認のうえお支払いください

※カード情報はGoogleアカウント内に保存されます。本サイトやStripeには保存されません

※記事の執筆者は購入者のユーザー名を知ることができます

※購入後のキャンセルはできません

作成日作成日
2015/05/27
最終更新最終更新
2018/10/15
記事区分記事区分
一般公開

目次

    Javaが得意なエンジニア。美しいコードと効率的なデザインを追求しています。

    0
    ステッカーを贈るとは?

    Linux の標準機能として提供されている logrotate コマンドを利用すると、設定ファイルに記載された条件にしたがって特定のログファイルをリネームしたり古すぎるものを削除したりすることができます。これによってログファイルが肥大化してディスクの容量を圧迫することを回避できます。実用上 logrotate コマンド自体は直接的には実行しません。cron に設定されたシェルスクリプト内で間接的に利用します。

    設定ファイル

    初期状態は以下のようになっています。必要に応じて設定項目を調べて編集します。

    /etc/logrotate.conf

    # see "man logrotate" for details
    # rotate log files weekly
    weekly
    
    # keep 4 weeks worth of backlogs
    rotate 4
    
    # create new (empty) log files after rotating old ones
    create
    
    # use date as a suffix of the rotated file
    dateext
    
    # uncomment this if you want your log files compressed
    #compress
    
    # RPM packages drop log rotation information into this directory
    include /etc/logrotate.d
    
    # no packages own wtmp and btmp -- we'll rotate them here
    /var/log/wtmp {
        monthly
        create 0664 root utmp
            minsize 1M
        rotate 1
    }
    
    /var/log/btmp {
        missingok
        monthly
        create 0600 root utmp
        rotate 1
    }
    
    # system-specific logs may be also be configured here.
    

    補足 1

    /etc/logrotate.d には yum でインストールされた RPM パッケージが設置した設定ファイルが格納されています。例えば以下のようになっています。/var/log/messages がログローテートされるのは syslog の設定ファイルのためであることが分かりました。

    $ ls /etc/logrotate.d/
    dracut  mysqld  nginx  syslog  yum
    
    $ cat /etc/logrotate.d/syslog
    /var/log/cron
    /var/log/maillog
    /var/log/messages
    /var/log/secure
    /var/log/spooler
    {
        sharedscripts
        postrotate
            /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
        endscript
    }
    
    • /var/log/cron → cron 実行ログ
    • /var/log/maillog → メール送信ログなど
    • /var/log/messages → 雑多なログ
    • /var/log/secure → root 権限でのコマンド実行ログなど (sudo も含む、不具合時の犯人探しに利用するなど)

    補足 2

    /var/log/wtmp および /var/log/btmp は syslog などで管理されないため直接 /etc/logrotate.conf に設定が書かれています。それぞれ last および lastb コマンドで利用されるログインに関するログファイルです。

    ログイン履歴

    $ last
    username pts/0  123.123.123.123   Tue May 26 22:40   still logged in
    username pts/0  123.123.123.123   Tue May 26 21:26 - 21:27  (00:00)
    username pts/0  123.123.123.123   Tue May 26 20:39 - 20:39  (00:00)
    username pts/1  123.123.123.123   Tue May 26 01:22 - 01:28  (00:05)
    username pts/1  123.123.123.123   Tue May 26 00:28 - 01:14  (00:46)
    username pts/1  123.123.123.123   Tue May 26 00:21 - 00:22  (00:00)
    ...
    

    不正ログイン履歴 (実際にはログインできなかったもの)

    ubnt     ssh:notty  185.19.94.207    Tue May 26 09:25 - 09:25  (00:00)
    sales    ssh:notty  72.167.254.54    Tue May 26 09:10 - 09:10  (00:00)
    admin    ssh:notty  72.167.254.54    Tue May 26 09:10 - 09:10  (00:00)
    admin    ssh:notty  72.167.254.54    Tue May 26 09:10 - 09:10  (00:00)
    default  ssh:notty  72.167.254.54    Tue May 26 09:10 - 09:10  (00:00)
    cisco    ssh:notty  72.167.254.54    Tue May 26 09:10 - 09:10  (00:00)
    ...
    

    関連情報としてローテートはされませんが /var/log/lastlog を利用する lastlog コマンドもあります。

    $ lastlog
    ユーザ名         ポート   場所             最近のログイン
    root                                       **一度もログインしていません**
    nobody                                     **一度もログインしていません**
    postfix                                    **一度もログインしていません**
    nfsnobody                                  **一度もログインしていません**
    sshd                                       **一度もログインしていません**
    vagrant          pts/2    10.0.2.2         火  5月 26 22:40:44 +0900 2015
    mysql                                      **一度もログインしていません**
    memcached                                  **一度もログインしていません**
    ...
    

    定期実行のための cron について

    /etc/cron.daily/logrotate

    #!/bin/sh
    /usr/sbin/logrotate /etc/logrotate.conf >/dev/null 2>&1
    EXITVALUE=$?
    if [ $EXITVALUE != 0 ]; then
        /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
    fi
    exit 0
    

    各ログの過去のローテート情報は以下のファイルに記載されています。

    $ cat /var/lib/logrotate.status
    logrotate state -- version 2
    "/var/log/nginx/error.log" 2015-5-26
    "/var/log/yum.log" 2015-5-21
    "/var/log/dracut.log" 2015-5-21
    "/var/log/wtmp" 2015-5-21
    "/var/log/spooler" 2015-5-26
    "/var/log/btmp" 2015-5-21
    "/var/log/maillog" 2015-5-26
    "/var/log/secure" 2015-5-26
    "/var/log/nginx/access.log" 2015-5-21
    "/var/log/messages" 2015-5-26
    "/var/log/cron" 2015-5-26
    

    設定例

    /etc/logrotate.d/myapp

    /var/log/myapp/*.log {
        create 0644 ec2-user ec2-user
        daily
        rotate 30
        missingok
        notifempty
        compress
        sharedscripts
        postrotate
            /etc/init.d/myapp reload # restart する場合は renice しましょう
        endscript
    }
    

    手動実行

    検証 (dry run)

    sudo /usr/sbin/logrotate -fd /etc/logrotate.d/myapp
    

    実行

    sudo /usr/sbin/logrotate -f /etc/logrotate.d/myapp
    

    補足

    CentOS 等の場合 /etc/cron.daily/logrotate/etc/anacrontab の設定で実行されます。

    /etc/anacrontab

    # the jobs will be started during the following hours only
    START_HOURS_RANGE=3-22
    
    #period in days   delay in minutes   job-identifier   command
    1                 5                  cron.daily       nice run-parts /etc/cron.daily
    

    以下の例では早くて AM 3:00 頃に処理が実行されることが分かります。また nice コマンドで実行されるため postrotaterestart すると nice 値が 0 以外の値の優先度が低いプロセスになってしまうことも分かります。

    postrotate ではなく copytruncate を用いると上記問題を回避できます。ログを cp してからコピー元ファイルの内容を消去するため、アプリケーションは同じファイル (同じ i ノード番号) への書き込みを継続できます。

    /var/log/myapp/*.log {
        daily
        rotate 14
        missingok
        notifempty
        compress
        copytruncate
    }
    
    0
    詳細設定を開く/閉じる
    アカウント プロフィール画像 (本文下)

    Javaが得意なエンジニア。美しいコードと効率的なデザインを追求しています。

    記事の執筆者にステッカーを贈る

    有益な情報に対するお礼として、またはコメント欄における質問への返答に対するお礼として、 記事の読者は、執筆者に有料のステッカーを贈ることができます。

    さらに詳しく →
    ステッカーを贈る コンセプト画像

    Feedbacks

    Feedbacks コンセプト画像

      ログインするとコメントを投稿できます。

      関連記事

      • 使い所が難しいマイナーな運用コマンド
        コマンドのエイリアスを登録する (update-alternatives) mybin という名前のコマンドを登録 sudo update-alternatives --install /usr/local/bin/mybin mybin /usr/bin/echo 10 sudo update-alternatives --install /usr/local/bin/mybin mybin /...
        けんちゃんけんちゃん12/1/2022に更新
        いいねアイコン画像0
      • ipコマンドの基本的な使い方
        ネットワーク関連のコマンドはたくさんあります。しかしながら、その一部は ip コマンドに集約できます。 基本形 ("man ip" より抜粋) $ ip OBJECT COMMAND OBJECT: link, neigh, addr, route (等) COMMAND: show, add, delete (等) データリンク層のネットワークデバイス情報 (ifconfigコマンドの代用) M...
        こもれびさんこもれびさん3/8/2017に更新
        いいねアイコン画像0
      • プロセス関連のコマンド
        サムネイル画像-7b5901f600
        プロセスID関連 (ps, pgrep, pkill) 全プロセスを表示するためには $ ps ax とすればよく、その表示を見やすくするためには "u" と "w" を追加して $ ps auxw とすればよいです。表示件数自体は同じです。そのうち特定のコマンドのプロセスIDだけを表示したい場合は $ ps ax | grep 'my_script' | grep -v grep | awk '...
        kenken12/27/2021に更新
        いいねアイコン画像0
      • rpmとyumのチートシート
        サムネイル画像-f69c6665b8
        rpm (RedHat Package Manager または RPM Package Manager) はRedHat系のパッケージ管理ツールで、yum (Yellowdog Updater Modified) は内部的にrpmを実行するメタパッケージ管理ツールです。rpmには柔軟性がありyumには利便性があります。 rpmは "rpmパッケージファイル" があれば何でもインストールできますが、...
        まるたんまるたん3/2/2022に更新
        いいねアイコン画像0
      • メモリおよびディスクリソースを調査するために便利なコマンドおよび周辺知識
        メモリ使用量を表示 (free) 既定ではキロバイト単位で表示されます。オプション "-b", "-k", "-m", "-g" を付与して実行するとそれぞれバイト、キロ、メガ、ギガで表示されます。 $ free total used free shared buffers cached Mem: 510824 ...
        しおまめしおまめ9/30/2017に更新
        いいねアイコン画像0