Ubuntu 22.04でLogrotateを使用してログファイルを管理する方法

紹介

Logrotateは、ログファイルの自動ローテーションと圧縮を管理するシステムユーティリティです。ログファイルがローテーションされず、圧縮されず、定期的に削除されない場合、最終的にはシステム上の利用可能なディスク容量をすべて消費してしまう可能性があります。

Logrotateは、Ubuntu 22.04にデフォルトでインストールされており、rsyslog(デフォルトのシステムログプロセッサ)を含むすべてのインストールされたパッケージのログローテーションのニーズを処理するように設定されています。

この記事では、デフォルトのLogrotate構成を探索し、架空のカスタムアプリケーションのログローテーションを構成します。

前提条件

このチュートリアルでは、Ubuntu 22.04サーバーがあり、非ルートのsudo権限を持つユーザーが存在することを前提としています。これについての詳細は、Ubuntu 22.04での初期サーバー設定を参照してください。

Logrotateは他の多くのLinuxディストリビューションでも利用可能ですが、デフォルトの構成はかなり異なる場合があります。LogrotateのバージョンがUbuntu 22.04と類似している限り、このチュートリアルの他のセクションは適用されます。Logrotateのバージョンを特定するには、ステップ1に従ってください。

開始するには、sudo権限を持つユーザーとしてサーバーにログインしてください。

ステップ1 — Logrotateのバージョンを確認する

LogrotateはデフォルトでUbuntuにインストールされています。ただし、インストールする必要がある場合は、次のコマンドを実行してパッケージリストを更新し、パッケージを取得します:

  1. sudo apt update
  2. sudo apt install logrotate

非Ubuntuサーバーを使用している場合は、まずLogrotateがインストールされていることを確認してください。バージョン情報を取得するには次のようにします:

  1. logrotate --version
Output
logrotate 3.19.0 Default mail command: /usr/bin/mail Default compress command: /bin/gzip Default uncompress command: /bin/gunzip Default compress extension: .gz Default state file path: /var/lib/logrotate/status ACL support: yes SELinux support: yes

Logrotateがインストールされているがバージョン番号が大幅に異なる場合、このチュートリアルで探索されるいくつかの設定オプションに問題がある可能性があります。Logrotateの特定のバージョンのドキュメントについては、そのマニュアル(man)ページを読んでください:

  1. man logrotate

また、Logrotateのドキュメントのオンラインバージョンも参照できます。次に、UbuntuでのLogrotateのデフォルト構成を見ていきます。

ステップ2 — Logrotateの構成を調査する

Logrotateの構成情報は、一般的にUbuntuでは2つの場所にあります:

  • /etc/logrotate.conf:このファイルにはいくつかのデフォルトの設定が含まれており、システムパッケージによって所有されていないいくつかのログのローテーションがセットアップされています。また、/etc/logrotate.dディレクトリ内の任意のファイルから構成を引き込むためのincludeステートメントが使用されています。
  • /etc/logrotate.d/:これはログのローテーションのサポートが必要なインストールされたパッケージがそのLogrotate構成を配置する場所です。標準のインストールでは、aptdpkgrsyslogなどのコアシステムツールのファイルがすでにここに存在するはずです。

デフォルトでは、logrotate.confは、rootユーザーとsyslogグループが所有するログファイルの週次ログローテーションを設定し、4つのログファイルを同時に保持します(rotate 4)、および現在のログファイルがローテーションされた後に新しい空のログファイルが作成されます(create)。

では、/etc/logrotate.d内のパッケージのLogrotate構成ファイルを見てみましょう。 aptパッケージユーティリティのファイルをcatしてください:

  1. cat /etc/logrotate.d/apt
Output
/var/log/apt/term.log { rotate 12 monthly compress missingok notifempty } /var/log/apt/history.log { rotate 12 monthly compress missingok notifempty }

このファイルには、/var/log/apt/ディレクトリ内の2つの異なるログファイル(term.logおよびhistory.log)の構成ブロックが含まれています。両方のログには同じオプションが設定されています。これらの構成ブロックで設定されていないオプションは、デフォルト値または/etc/logrotate.confで設定されている値を継承します。ログローテートファイルで設定されている任意の設定は、/etc/logrotate.confで構成されているログローテートのデフォルト値を上書きします。 aptログに設定されたオプションは次のとおりです:

  • rotate 12:古いログファイルを12個保持します。これはデフォルトのrotate 4を上書きします。
  • monthly:1か月に1度回転します。これはデフォルトのweeklyを上書きします。
  • compress:回転したファイルを圧縮します。デフォルトではgzipを使用し、ファイルの拡張子は.gzになります。圧縮コマンドはcompresscmdオプションを使用して変更できます。
  • missingok:ログファイルが見つからない場合、エラーメッセージを書き込みません。
  • notifempty:ログファイルが空の場合、回転しません。

これらの設定ファイルは、デフォルトのcreate動作も継承します。これにより、ログの回転後に新しいログを作成するようにLogrotateに指示されます。これはnocreateで上書きできますが、それによりほとんどの他の機能が無効になります。

利用可能な設定オプションはさらに多数あります。すべてのオプションについては、コマンドラインでman logrotateと入力してLogrotateのマニュアルページを表示することで読むことができます。

次に、架空のサービスyour-appのログを処理する設定ファイルを設定します。

ステップ3 — 例設定のセットアップ

事前パッケージ化されたシステムサービスの外部のアプリケーションのログファイルをlogrotateで管理するには、2つのオプションがあります。

  1. /etc/logrotate.d/に新しいLogrotate設定ファイルを作成して配置します。これは、rootユーザーとして、他のすべての標準Logrotateジョブと共に毎日実行されます。
  2. UbuntuのデフォルトのLogrotateセットアップの外で新しい構成ファイルを作成して実行します。これは、Logrotateをrootユーザー以外のユーザーとして実行する必要がある場合、またはログを毎日より頻繁に回転させたい場合に本当に必要です(/etc/logrotate.d/でのhourly設定は効果がありません。システムのLogrotateセットアップは1日に1回しか実行されません)。

これらの2つのオプションをいくつかの例を使って説明しましょう。

/etc/logrotate.d/への構成の追加

架空のウェブサーバーのログ回転を設定します。このウェブサーバーは、/var/log/your-app/access.logerror.logを配置し、www-dataユーザーとグループで実行されています。

/etc/logrotate.d/your-appログファイルの構成を追加するには、まず好みのエディターで/etc/logrotate.dディレクトリに新しいファイルを開きます:

  1. sudo nano /etc/logrotate.d/your-app

次の行を新しい構成ファイルに追加します:

/etc/logrotate.d/your-app
/var/log/your-app/*.log {
	daily
	missingok
	rotate 14
	compress
	notifempty
	create 0640 www-data www-data
	sharedscripts
	postrotate
		systemctl reload your-app
	endscript
}

このファイルの新しい構成ディレクティブのいくつかは次のとおりです:

  • create 0640 www-data www-data: これにより、指定されたパーミッション(0640)、所有者(www-data)、およびグループ(またwww-data)を持つ新しい空のログファイルが回転後に作成されます。
  • sharedscripts: このフラグは、構成に追加されたスクリプトが、各ログファイルが回転するたびにではなく、実行ごとに1回だけ実行されることを意味します。パス/var/log/your-app/*.logにワイルドカード*が含まれているため、この構成はyour-appディレクトリ内の任意の数のログファイルに一致します。 sharedscriptsオプションがない場合、postrotateで指定されたスクリプトはこのオプションのないログファイルが処理されるたびに実行されます。
  • postrotateからendscriptへ:このブロックには、ログファイルが回転した後に実行するスクリプトが含まれています。この例では、サンプルアプリをリロードしています。これは、新しく作成されたログファイルにアプリケーションを切り替える必要がある場合に必要なことがあります。 postrotateはログが圧縮される前に実行されます。圧縮には時間がかかる場合があり、ソフトウェアは新しいログファイルにすぐに切り替える必要があります。ログが圧縮された後に実行するタスクには、lastactionブロックを使用します。

nanoを保存して終了するには、Ctrl+Xを押し、プロンプトが表示されたら、Yを押してからEnterを押します。構成ファイルをテストするには、次のようにドライランを実行します:

  1. sudo logrotate /etc/logrotate.conf --debug

このコマンドはlogrotateを呼び出し、標準の構成ファイルを指定し、デバッグモードをオンにします。

Logrotateが処理しているログファイルと、それに対して行う処理に関する情報が出力されます。すべてが正常に見える場合、作業は完了です。標準のLogrotateジョブは1日に1回実行され、新しい構成が含まれます。

次に、Ubuntuのデフォルト構成を全く使用しないセットアップを試してみます。

ステップ4 — 独立したLogrotate構成の作成

この例では、私たちのユーザーsammyとしてアプリが実行され、/home/sammy/logs/に保存されているログが生成されます。これらのログを毎時でローテートしたいので、Ubuntuが提供する/etc/logrotate.d構造の外でこれを設定する必要があります。

まず、ホームディレクトリに構成ファイルを作成します。テキストエディターで開いてください:

  1. nano /home/sammy/logrotate.conf

次に、以下の構成を貼り付けます:

/home/sammy/logrotate.conf
/home/sammy/logs/*.log {
	hourly
	missingok
	rotate 24
	compress
	create
}

ファイルを保存して閉じます。これらのオプションは以前の手順ですべて遭遇していますが、要約します:この構成では、ファイルを毎時でローテートし、24個の古いログを圧縮して保持し、ローテートされたファイルを置き換える新しいログファイルを作成します。

アプリケーションに合わせて構成をカスタマイズする必要がありますが、これは良い出発点です。

設定が機能するかテストするために、ログファイルを作成しましょう。まず、cd ~コマンドを使用してユーザーのホームディレクトリに移動します。次に、mkdirコマンドを使用してログ用のディレクトリを作成します。最後に、touchコマンドを使用してlogsディレクトリに空のファイルを作成します。これらのステップを完了するために、次のコマンドを順番に実行します:

  1. cd ~
  2. mkdir logs
  3. touch logs/access.log

これで、適切な場所に空白のログファイルができましたので、logrotateコマンドを実行しましょう。

ログがsammyによって所有されているため、sudoを使用する必要はありません。ただし、状態ファイルを指定する必要があります。logrotateが前回実行されたときにlogrotateが見つけたものと実行したアクションを記録するためのファイルです。次に実行されるときに何をするかを知るために、この状態の追跡はデフォルトの/etc/logrotate.conf構成を使用するときに自動的に処理されます。/var/lib/logrotate/statusに状態ファイルが保存されます。デフォルトの構成を使用していないため、状態ファイルの場所を手動で構成する必要があります。

この例では、Logrotateに状態ファイルを直接ホームディレクトリに配置させます。アクセス可能で便利な場所ならどこにでも置くことができます。次のコマンドを実行して、作成した/home/sammy/logrotate.confを使用し、logrotateが遭遇した状態を記録します:

logrotate /home/sammy/logrotate.conf --state /home/sammy/logrotate-state --verbose
Output
reading config file /home/sammy/logrotate.conf Handling 1 logs rotating pattern: /home/sammy/logs/*.log hourly (24 rotations) empty log files are rotated, old logs are removed considering log /home/sammy/logs/access.log log does not need rotating

--verboseフラグは、Logrotateが実行している詳細な情報を出力します。この場合、何も回転させませんでした。これはLogrotateがこのログファイルに初めて遭遇し、ゼロ時間であるため、回転させる必要がないためです。

catユーティリティを使用して状態ファイルを調べると、Logrotateが実行に関するいくつかの情報を記録していることがわかります。

  1. cat /home/sammy/logrotate-state
Output
logrotate state -- version 2 "/home/sammy/logs/access.log" 2022-07-2-19:0:0

Logrotateは、見たログとそれを最後に回転させると考えた時間について記録しています。1時間後に同じコマンドを実行すると、ログが期待通りに回転します。

Logrotateにログファイルを回転させるよう強制したい場合は、--forceフラグを使用します。

  1. logrotate /home/sammy/logrotate.conf --state /home/sammy/logrotate-state --verbose --force

これは、postrotateやその他のスクリプトをテストする際に便利です。

最後に、Logrotateを毎時実行するcronジョブを設定する必要があります。ユーザーのcrontabを開きます。

  1. crontab -e

これにより、テキストファイルが開きます。cronを初めて使用する場合は、デフォルトのテキストエディタを選択するように求められる場合があります。好みがない場合は、新しいユーザーにはnanoを推奨します。ファイルにはすでにcron構文を説明するコメントがある場合があります。ファイルの末尾に新しい空白の行にカーソルを移動して、次のように追加します。

crontab
14 * * * * /usr/sbin/logrotate /home/sammy/logrotate.conf --state /home/sammy/logrotate-state

このタスクは、毎日毎時14分に実行されます。以前に実行したのとほぼ同じlogrotateコマンドが実行されますが、安全のためにlogrotateを完全なパス/usr/sbin/logrotateに展開しました。cronジョブを記述する際は、完全なパスを使用するのが良い習慣です。cronについて詳しくは、他の当社のチュートリアルを参照してください。

ファイルを保存して終了します。これにより、crontabがインストールされ、指定されたスケジュールでタスクが実行されます。

ログディレクトリを約1時間後に再訪問すると、回転して圧縮されたログファイル access.log.1.gz(または--forceフラグを使用してLogrotateを実行した場合は.2.gz)を見つけるはずです。

結論

このチュートリアルでは、Logrotateのバージョンを確認し、デフォルトのUbuntu Logrotate構成を探索し、2種類の異なるカスタム構成を設定しました。Logrotateのコマンドラインおよび構成オプションについて詳しくは、ターミナルでman logrotateを実行するか、オンラインドキュメントを参照してください。

Source:
https://www.digitalocean.com/community/tutorials/how-to-manage-logfiles-with-logrotate-on-ubuntu-22-04