序章

Logrotateは、ログファイルの自動ローテーションと圧縮を管理するシステムユーティリティです。 ログファイルがローテーション、圧縮、および定期的に整理されていない場合、最終的にはシステムで使用可能なすべてのディスク領域を消費する可能性があります。

LogrotateはデフォルトでUbuntu16.04にインストールされ、デフォルトのシステムログプロセッサであるrsyslogを含むすべてのインストール済みパッケージのログローテーションのニーズを処理するように設定されています。

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

前提条件

このチュートリアルでは、 Ubuntu 16.04 を使用したサーバーの初期設定で説明されているように、root以外のsudoが有効なユーザーがいるUbuntu16.04サーバーがあることを前提としています。

Logrotateは他の多くのLinuxディストリビューションでも利用できますが、デフォルトの構成はまったく異なる場合があります。 LogrotateのバージョンがUbuntu16.04と類似している限り、このチュートリアルの他のセクションは引き続き適用されます。 手順1に従って、Logrotateのバージョンを確認します。

sudo対応ユーザーとしてサーバーにログインして開始します。

Logrotateバージョンの確認

Ubuntu以外のサーバーを使用している場合は、最初にバージョン情報を要求してLogrotateがインストールされていることを確認してください。

  1. logrotate --version
Output
logrotate 3.8.7

Logrotateがインストールされていない場合、エラーが発生します。 Linuxディストリビューションのパッケージマネージャーを使用してソフトウェアをインストールしてください。

Logrotateがインストールされているが、バージョン番号が大幅に異なる場合は、このチュートリアルで説明されている構成の一部に問題がある可能性があります。 manページを読んで、Logrotateの特定のバージョンのドキュメントを参照してください。

  1. man logrotate

次に、UbuntuでのLogrotateのデフォルトの構成構造を見ていきます。

Logrotate構成の調査

Logrotateの構成情報は、通常、Ubuntuの2つの場所にあります。

  • /etc/logrotate.conf:このファイルにはいくつかのデフォルト設定が含まれており、システムパッケージが所有していないいくつかのログのローテーションを設定します。 また、includeステートメントを使用して、/etc/logrotate.dディレクトリ内の任意のファイルから構成をプルします。
  • /etc/logrotate.d/:これは、ログローテーションの支援が必要なインストール済みパッケージがLogrotate構成を配置する場所です。 標準インストールでは、aptdpkgrsyslogなどの基本的なシステムツール用のファイルがすでにここにあるはずです。

デフォルトでは、logrotate.confは、 rootユーザーとsyslogグループ(su root syslog)、4つのログファイルが保持され(rotate 4)、現在のログファイルがローテーションされた後に新しい空のログファイルが作成されます(create)。

/etc/logrotate.dにあるパッケージのLogrotate構成ファイルを見てみましょう。 cat aptパッケージユーティリティのファイル:

  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/ディレクトリにあるterm.loghistory.logの2つの異なるログファイルの構成ブロックが含まれています。 どちらも同じオプションがあります。 これらの構成ブロックで設定されていないオプションは、デフォルト値または/etc/logrotate.confで設定されたオプションを継承します。 aptログに設定されるオプションは次のとおりです。

  • rotate 12:12個の古いログファイルを保持します。
  • monthly:月に1回ローテーションします。
  • compress:回転したファイルを圧縮します。 これはデフォルトでgzipを使用し、ファイルは.gzで終わります。 圧縮コマンドは、compresscmdオプションを使用して変更できます。
  • missingok:ログファイルが欠落している場合にエラーメッセージを書き込まないでください。
  • notifempty:ログファイルが空の場合はローテーションしないでください。

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

次に、架空のサービスのログを処理するための構成ファイルを設定します。

構成例の設定

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

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

いくつかのセットアップ例を使用して、これら2つのオプションを見ていきましょう。

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

access.logerror.log/var/log/example-app/に配置する架空のWebサーバーのログローテーションを構成します。 www-dataユーザーおよびグループとして実行されます。

/etc/logrotate.d/に構成を追加するには、まずそこで新しいファイルを開きます。

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

これらのログを処理できる設定ファイルの例を次に示します。

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

このファイルの新しい構成ディレクティブの一部は次のとおりです。

  • create 0640 www-data www-data:これにより、ローテーション後に、指定された権限(0640)、所有者(www-data)、およびグループ(www-data)を使用して新しい空のログファイルが作成されます。 )。
  • sharedscripts:このフラグは、構成に追加されたスクリプトが、ローテーションされたファイルごとではなく、実行ごとに1回だけ実行されることを意味します。 この構成はexample-appディレクトリ内の2つのログファイルと一致するため、postrotateで指定されたスクリプトはこのオプションなしで2回実行されます。
  • postrotateからendscript:このブロックには、ログファイルがローテーションされた後に実行するスクリプトが含まれています。 この場合、サンプルアプリをリロードしています。 これは、アプリケーションを新しく作成されたログファイルに切り替えるために必要になる場合があります。 postrotateは、ログが圧縮される前に実行されることに注意してください。 圧縮には長い時間がかかる可能性があり、ソフトウェアはすぐに新しいログファイルに切り替える必要があります。 ログが圧縮された後にを実行する必要があるタスクの場合は、代わりにlastactionブロックを使用してください。

ニーズに合わせて構成をカスタマイズし/etc/logrotate.dに保存した後、ドライランを実行してテストできます。

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

これにより、logrotateが呼び出され、標準構成ファイルがポイントされ、デバッグモードがオンになります。

Logrotateが処理しているログファイルと、それらに対して何が行われたかについての情報が出力されます。 すべてがうまくいけば、完了です。 標準のLogrotateジョブは1日1回実行され、新しい構成が含まれます。

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

独立したログローテーション構成の作成

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

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

  1. nano /home/sammy/logrotate.conf

次に、次の構成で貼り付けます。

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

ファイルを保存して閉じます。 これらのオプションはすべて前の手順で確認しましたが、要約すると、この構成ではファイルが1時間ごとにローテーションされ、24個の古いログが圧縮および保持され、ローテーションされたログを置き換える新しいログファイルが作成されます。

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

それが機能することをテストするために、ログファイルを作成しましょう:

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

正しい場所に空のログファイルができたので、logrotateコマンドを実行してみましょう。

ログはsammyによって所有されているため、sudoを使用する必要はありません。 ただし、dostateファイルを指定する必要があります。 このファイルは、logrotateが最後に実行したときに見たものと実行したものを記録するため、次に実行するときに何をすべきかがわかります。 これは、Ubuntu Logrotateセットアップ(/var/lib/logrotate/statusにあります)を使用するときに処理されますが、今は手動で行う必要があります。

この例では、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がこのログファイルを見るのはこれが初めてです。これまでのところ、ファイルは0時間経過しているため、ローテーションしないでください。

状態ファイルを見ると、Logrotateが実行に関する情報を記録していることがわかります。

  1. cat /home/sammy/logrotate-state
Output
logrotate state -- version 2 "/home/sammy/logs/access.log" 2017-11-7-19:0:0

Logrotateは、見たログと、最後にローテーションを検討した日時を記録しました。 この同じコマンドを1時間後に実行すると、ログは期待どおりにローテーションされます。

Logrotateにログファイルを強制的にローテーションさせたい場合は、--forceフラグを使用します。

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

これは、postrotateやその他のスクリプトをテストするときに役立ちます。

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

  1. crontab -e

これにより、テキストファイルが開きます。 予想される基本的な構文を説明するコメントがファイルにすでに含まれている場合があります。 ファイルの最後にある新しい空白行にカーソルを移動し、以下を追加します。

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

このタスクは、毎日、毎時14分に実行されます。 安全のためにlogrotate/usr/sbin/logrotateのフルパスに拡張しましたが、基本的には以前に実行したのと同じlogrotateコマンドを実行します。 cronジョブを作成するときは、できるだけ明示的にすることをお勧めします。

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

約1時間後にログディレクトリに再度アクセスすると、ローテーションおよび圧縮されたログファイルaccess.log.1.gz(または--forceフラグを指定してLogrotateを実行した場合は.2.gz)が見つかります。

結論

このチュートリアルでは、Logrotateのバージョンを確認し、デフォルトのUbuntu Logrotate構成を調べ、2つの異なるタイプのカスタム構成をセットアップしました。 Logrotateで使用できるコマンドラインと構成オプションの詳細については、ターミナルでman logrotateを実行してマニュアルページを参照してください。