前書き

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

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

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

前提条件

このチュートリアルでは、https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-16-04で説明されているように、ルート以外のsudo対応ユーザーを使用するUbuntu 16.04サーバーがあることを前提としています。 [Ubuntu 16.04での初期サーバー設定]。

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

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

Logrotateバージョンの確認

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

logrotate --version
Outputlogrotate

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

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

man logrotate

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

Logrotate構成の調査

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

  • + / etc / logrotate.conf +:このファイルにはいくつかのデフォルト設定が含まれ、システムパッケージが所有していないいくつかのログのローテーションを設定します。 また、 `+ include `ステートメントを使用して、 ` / etc / logrotate.d +`ディレクトリ内の任意のファイルから設定を取得します。

  • + / etc / logrotate.d / +:これは、ログローテーションのヘルプが必要なインストール済みパッケージがLogrotate設定を配置する場所です。 標準インストールでは、 + apt ++ dpkg +、 `+ rsyslog +`などの基本的なシステムツール用のファイルがすでにここにあるはずです。

デフォルトでは、 + logrotate.conf +`は、* root ユーザーと syslog *グループ( `+ su root syslog +)が所有するログファイルを使用して、4つのログファイルで毎週のログローテーション( + weekly +)を設定します保持され( + rotate 4 +)、現在のログファイルがローテーションされた後に新しい空のログファイルが作成されます( + create +)。

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

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 `で設定された値を継承します。 ` 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セットアップの外部で実行します。 これは、非* root *ユーザーとしてLogrotateを実行する必要がある場合、または毎日よりも頻繁にログをローテーションする場合( `+ / etc / logrotate.d / `の ` hourly +`構成)にのみ本当に必要です。システムのLogrotateセットアップは1日に1回しか実行されないため、効果的ではありません。

これら2つのオプションについて、いくつかの設定例を見ていきましょう。

設定を `+ / etc / logrotate.d / +`に追加する

`+ access.log `と ` error.log `を ` / var / log / example-app / `に格納する架空のWebサーバーのログローテーションを設定します。 ` www-data`ユーザーおよびグループとして実行されます。

`+ / etc / logrotate.d / +`に設定を追加するには、まず新しいファイルを開きます:

sudo nano /etc/logrotate.d/

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

/etc/logrotate.d/example-app

/var/log//*.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 `が実行されることに注意してください。 圧縮には時間がかかる可能性があり、ソフトウェアはすぐに新しいログファイルに切り替える必要があります。 _after_ログを実行する必要があるタスクが圧縮されている場合は、代わりに ` lastaction +`ブロックを使用してください。

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

sudo logrotate /etc/logrotate.conf --debug

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

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

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

独立したLogrotate構成の作成

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

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

nano /home//logrotate.conf

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

/home/sammy/logrotate.conf

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

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

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

動作することをテストするために、ログファイルを作成しましょう。

cd ~
mkdir logs
touch logs/access.log

正しい場所に空のログファイルがあるので、 `+ logrotate +`コマンドを実行しましょう。

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

この例では、Logrotateで状態ファイルをホームディレクトリに配置します。 アクセスしやすく便利な場所ならどこにでも行くことができます。

logrotate /home//logrotate.conf --state /home//logrotate-state --verbose
Outputreading 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が実行に関するいくつかの情報を記録していることがわかります。

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

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

Logrotateを使用してログファイルを強制的にローテーションする場合は、 `+-force +`フラグを使用します。

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

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

最後に、1時間ごとにLogrotateを実行するcronジョブをセットアップする必要があります。 ユーザーのcrontabを開きます。

crontab -e

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

crontab14 * * * * /usr/sbin/logrotate /home/sammy/logrotate.conf --state /home/sammy/logrotate-state

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

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

約1時間でログディレクトリに再度アクセスすると、回転され圧縮されたログファイル「+ access.log.1.gz 」(または、「-force 」でLogrotateを実行した場合は「 .2.gz +」国旗)。

結論

このチュートリアルでは、Logrotateバージョンを検証し、デフォルトのUbuntu Logrotate構成を調査し、2種類のカスタム構成をセットアップしました。 Logrotateで使用できるコマンドラインと設定オプションの詳細については、ターミナルで「+ man logrotate +」を実行してマニュアルページを読むことができます。