前書き
Logrotateは、ログファイルの自動ローテーションと圧縮を管理するシステムユーティリティです。 ログファイルがローテーション、圧縮、および定期的なプルーニングされていない場合、最終的にシステム上の使用可能なすべてのディスクスペースを消費する可能性があります。
LogrotateはデフォルトでUbuntu16.04にインストールされ、デフォルトのシステムログプロセッサであるrsyslog
を含む、インストールされているすべてのパッケージのログローテーションのニーズを処理するように設定されています。
この記事では、デフォルトのLogrotate構成を調べ、架空のカスタムアプリケーションのログローテーションを構成します。
前提条件
このチュートリアルでは、Initial Server Setup with Ubuntu 16.04で説明されているように、root以外のsudo対応ユーザーがいるUbuntu16.04サーバーがあることを前提としています。
Logrotateは他の多くのLinuxディストリビューションでも利用できますが、デフォルトの構成はかなり異なる場合があります。 LogrotateのバージョンがUbuntu 16.04に類似している限り、このチュートリアルの他のセクションは引き続き適用されます。 手順1に従って、Logrotateのバージョンを確認します。
開始するには、sudo対応ユーザーとしてサーバーにログインします。
Logrotateバージョンの確認
Ubuntu以外のサーバーを使用している場合は、まずバージョン情報を要求してLogrotateがインストールされていることを確認してください。
logrotate --version
Outputlogrotate 3.8.7
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
は毎週のログローテーション(weekly
)を構成し、ログファイルはrootユーザーとsyslogグループ(su root syslog
)が所有します。 4つのログファイルが保持され(rotate 4
)、現在のログファイルがローテーションされた後に新しい空のログファイルが作成されます(create
)。
/etc/logrotate.d
にあるパッケージのLogrotate構成ファイルを見てみましょう。 cat
は、apt
パッケージユーティリティのファイルです。
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つのオプションがあります。
-
新しいLogrotate構成ファイルを作成し、
/etc/logrotate.d/
に配置します。 これは、他のすべての標準Logrotateジョブとともにrootユーザーとして毎日実行されます。 -
新しい構成ファイルを作成し、UbuntuのデフォルトのLogrotateセットアップの外部で実行します。 これは、Logrotateをroot以外のユーザーとして実行する必要がある場合、またはログを毎日より頻繁にローテーションする場合にのみ本当に必要です(
/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/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
は、ログが圧縮される前に実行されることに注意してください。 圧縮には時間がかかる可能性があり、ソフトウェアはすぐに新しいログファイルに切り替える必要があります。 afterログを実行する必要があるタスクは圧縮されているため、代わりにlastaction
ブロックを使用してください。
After customizing the config to fit your needsを/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/sammy/logrotate.conf
次に、次の構成を貼り付けます。
/home/sammy/logrotate.conf
/home/sammy/logs/*.log {
hourly
missingok
rotate 24
compress
create
}
ファイルを保存して閉じます。 これらのオプションはすべて前の手順で確認しましたが、要約すると、この構成ではファイルが1時間ごとにローテーションされ、24の古いログが圧縮および保持され、ローテーションされたログを置き換える新しいログファイルが作成されます。
アプリケーションに合わせて構成をカスタマイズする必要がありますが、これは良いスタートです。
動作することをテストするために、ログファイルを作成しましょう。
cd ~
mkdir logs
touch logs/access.log
空白のログファイルが適切な場所にあるので、logrotate
コマンドを実行してみましょう。
ログはsammyによって所有されているため、sudo
を使用する必要はありません。 ただし、doはstateファイルを指定する必要があります。 このファイルは、logrotate
が最後に実行したときに見たものと実行したものを記録するため、次に実行したときに何をすべきかがわかります。 これは、Ubuntu Logrotateセットアップ(/var/lib/logrotate/status
にあります)を使用するときに処理されますが、今は手動で行う必要があります。
この例では、Logrotateで状態ファイルをホームディレクトリに配置します。 アクセスしやすく便利な場所ならどこにでも行くことができます。
logrotate /home/sammy/logrotate.conf --state /home/sammy/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
を/usr/sbin/logrotate
のフルパスに拡張しましたが、基本的に以前に実行したのと同じlogrotate
コマンドを実行します。 cronジョブを作成するときは、できるだけ明示的にすることをお勧めします。
ファイルを保存して終了します。 これによりcrontabがインストールされ、指定されたスケジュールでタスクが実行されます。
約1時間後にログディレクトリに再度アクセスすると、ローテーションおよび圧縮されたログファイルaccess.log.1.gz
(または、--force
フラグを指定してLogrotateを実行した場合は.2.gz
)が見つかります。
結論
このチュートリアルでは、Logrotateバージョンを検証し、デフォルトのUbuntu Logrotate構成を調査し、2種類のカスタム構成をセットアップしました。 Logrotateで使用できるコマンドラインと構成オプションの詳細については、ターミナルでman logrotate
を実行してマニュアルページを読むことができます。