Ubuntu20.04でLogrotateを使用してログファイルを管理する方法
序章
Logrotateは、ログファイルの自動ローテーションと圧縮を管理するシステムユーティリティです。 ログファイルがローテーション、圧縮、および定期的に整理されていない場合、最終的にはシステムで使用可能なすべてのディスク領域を消費する可能性があります。
LogrotateはデフォルトでUbuntu20.04にインストールされ、デフォルトのシステムログプロセッサであるrsyslog
を含むすべてのインストール済みパッケージのログローテーションのニーズを処理するように設定されています。
この記事では、デフォルトのLogrotate構成について説明し、架空のカスタムアプリケーションのログローテーションを構成します。
前提条件
このチュートリアルでは、 Ubuntu 20.04 での初期サーバー設定で説明されているように、root以外のsudo対応ユーザーがいるUbuntu20.04サーバーがあることを前提としています。
Logrotateは他の多くのLinuxディストリビューションでも利用できますが、デフォルトの構成はまったく異なる場合があります。 LogrotateのバージョンがUbuntu20.04に類似している限り、このチュートリアルの他のセクションは引き続き適用されます。 手順1に従って、Logrotateのバージョンを確認します。
sudo対応ユーザーとしてサーバーにログインして開始します。
このページに埋め込まれているインタラクティブ端末を使用して、このチュートリアルでlogrotateを試すこともできます。 次のインタラクティブターミナルを起動します!ボタンをクリックして開始します。
ステップ1—Logrotateバージョンの確認
LogrotateはデフォルトでUbuntuにインストールされます。 ただし、インストールする必要がある場合は、次のコマンドを実行してパッケージリストを更新し、パッケージを取得します。
- sudo apt update
- sudo apt install logrotate
Ubuntu以外のサーバーを使用している場合は、最初にバージョン情報を要求してLogrotateがインストールされていることを確認してください。
- logrotate --version
Outputlogrotate 3.14.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がインストールされているが、バージョン番号が大幅に異なる場合は、このチュートリアルで説明されている構成オプションの一部に問題がある可能性があります。 マニュアル(man
)ページを読んで、Logrotateの特定のバージョンのドキュメントを参照してください。
- man logrotate
Logrotateドキュメントのオンラインバージョンを参照することもできます。 次に、UbuntuでのLogrotateのデフォルトの構成構造を見ていきます。
ステップ2—Logrotate構成の調査
Logrotateの構成情報は、通常、Ubuntuの2つの場所にあります。
/etc/logrotate.conf
:このファイルにはいくつかのデフォルト設定が含まれており、システムパッケージが所有していないいくつかのログのローテーションを設定します。 また、include
ステートメントを使用して、/etc/logrotate.d
ディレクトリ内の任意のファイルから構成をプルします。/etc/logrotate.d/
:これは、ログローテーションの支援が必要なインストール済みパッケージがLogrotate構成を配置する場所です。 標準インストールでは、apt
、dpkg
、rsyslog
などのコアシステムツール用のファイルがすでにここにあるはずです。
デフォルトでは、logrotate.conf
は、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/
ディレクトリにあるterm.log
とhistory.log
の2つの異なるログファイルの構成ブロックが含まれています。 どちらも同じオプションがあります。 これらの構成ブロックで設定されていないオプションは、デフォルト値または/etc/logrotate.conf
で設定されたオプションを継承します。 logrotateファイルの設定は、/etc/logrotate.conf
で構成されているlogrotateのデフォルト値を上書きします。 apt
ログに設定されるオプションは次のとおりです。
rotate 12
:12個の古いログファイルを保持します。 これは、rotate 4
のデフォルトをオーバーライドします。monthly
:月に1回ローテーションします。 これは、weekly
のデフォルトをオーバーライドします。compress
:回転したファイルを圧縮します。 これはデフォルトでgzip
を使用し、ファイルは.gz
で終わります。 圧縮コマンドは、compresscmd
オプションを使用して変更できます。missingok
:ログファイルが欠落している場合にエラーメッセージを書き込まないでください。notifempty
:ログファイルが空の場合はローテーションしないでください。
これらの構成ファイルは、デフォルトのcreate
の動作も継承します。これは、ローテーション後に新しいログを作成するようにLogrotateに指示します。 これはnocreate
でオーバーライドできますが、他のほとんどの機能が事実上無効になります。
利用可能な構成オプションは他にもたくさんあります。 コマンドラインでman logrotate
と入力して、Logrotateのマニュアルページを表示すると、それらすべてについて読むことができます。
次に、your-app
という架空のサービスのログを処理するための構成ファイルを設定します。
ステップ3—設定例の設定
事前にパッケージ化および事前構成されたシステムサービス以外のアプリケーションでlogrotateを使用してログファイルを管理するには、次の2つのオプションがあります。
- 新しいLogrotate構成ファイルを作成し、
/etc/logrotate.d/
に配置します。 これは、他のすべての標準Logrotateジョブとともに、rootユーザーとして毎日実行されます。 - 新しい構成ファイルを作成し、UbuntuのデフォルトのLogrotateセットアップの外で実行します。 これは、Logrotateを root 以外のユーザーとして実行する必要がある場合、またはログを毎日より頻繁にローテーションする場合(
[X180Xの hourly
構成)にのみ本当に必要です。 ]システムのLogrotateセットアップは1日1回しか実行されないため、効果がありません)。
いくつかのセットアップ例を使用して、これら2つのオプションを見ていきましょう。
/etc/logrotate.d/
への構成の追加
access.log
とerror.log
を/var/log/your-app/
に配置する架空のWebサーバーのログローテーションを構成します。 www-data
ユーザーおよびグループとして実行されます。
your-app
ログファイルの構成を/etc/logrotate.d/
に追加するには、最初にnano
またはお好みのエディターを使用して、/etc/logrotate.d
ディレクトリで新しいファイルを開きます。
- sudo nano /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
オプションがないと、logrotateがこのオプションなしでログファイルを処理するたびに、postrotate
で指定されたスクリプトが実行されます。postrotate
からendscript
:このブロックには、ログファイルがローテーションされた後に実行するスクリプトが含まれています。 この場合、サンプルアプリをリロードしています。 これは、アプリケーションを新しく作成されたログファイルに切り替えるために必要になる場合があります。postrotate
は、ログが圧縮される前に実行されることに注意してください。 圧縮には長い時間がかかる可能性があり、ソフトウェアはすぐに新しいログファイルに切り替える必要があります。 ログが圧縮された後にを実行する必要があるタスクの場合は、代わりにlastaction
ブロックを使用してください。
nano
を保存して終了するには、Ctrl+X
を押し、プロンプトが表示されたらY
、Enter
の順に押します。 ドライランを実行して、構成ファイルをテストできます。
- sudo logrotate /etc/logrotate.conf --debug
このコマンドは、logrotate
を呼び出し、それを標準構成ファイルにポイントして、デバッグモードをオンにします。
Logrotateが処理しているログファイルと、それらに対して何が行われたかについての情報が出力されます。 すべてがうまくいけば、完了です。 標準のLogrotateジョブは1日1回実行され、新しい構成が含まれます。
次に、Ubuntuのデフォルト構成をまったく使用しないセットアップを試してみます。
ステップ4—独立したLogrotate構成を作成する
この例では、ユーザーsammy
として実行されているアプリがあり、/home/sammy/logs/
に保存されるログを生成しています。 これらのログを1時間ごとにローテーションしたいので、Ubuntuが提供する/etc/logrotate.d
構造の外部でこれを設定する必要があります。
まず、ホームディレクトリに構成ファイルを作成します。 テキストエディタで開きます。
- nano /home/sammy/logrotate.conf
次に、次の構成で貼り付けます。
/home/sammy/logs/*.log {
hourly
missingok
rotate 24
compress
create
}
ファイルを保存して閉じます。 前の手順でこれらすべてのオプションに遭遇しましたが、要約しましょう。この構成では、ファイルが1時間ごとにローテーションされ、24個の古いログが圧縮および保持され、ローテーションされたログを置き換える新しいログファイルが作成されます。
アプリケーションに合わせて構成をカスタマイズする必要がありますが、これは良いスタートです。
構成が機能することをテストするために、ログファイルを作成しましょう。 cd ~
コマンドを使用して、最初にcd
をユーザーのホームディレクトリに移動します。 次に、mkdir
コマンドを使用してログ用のディレクトリを作成します。 最後に、touch
コマンドを使用して、logs
ディレクトリに空のファイルを作成します。 これらの手順を完了するには、次のコマンドを実行します。
- cd ~
- mkdir logs
- touch logs/access.log
正しい場所に空のログファイルができたので、logrotate
コマンドを実行してみましょう。
ログはsammy
によって所有されているため、sudo
を使用する必要はありません。 ただし、doはstateファイルを指定する必要があります。 このファイルは、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
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時間経過しているため、ローテーションしないでください。
cat
ユーティリティを使用して状態ファイルを調べると、Logrotateが実行に関するいくつかの情報を記録していることがわかります。
- cat /home/sammy/logrotate-state
Outputlogrotate state -- version 2
"/home/sammy/logs/access.log" 2021-12-3-19:0:0
Logrotateは、見たログと、最後にローテーションを検討した日時を記録しました。 この同じコマンドを1時間後に実行すると、ログは期待どおりにローテーションされます。
Logrotateにログファイルを強制的にローテーションさせたい場合は、--force
フラグを使用します。
- logrotate /home/sammy/logrotate.conf --state /home/sammy/logrotate-state --verbose --force
これは、postrotate
やその他のスクリプトをテストするときに役立ちます。
最後に、Logrotateを1時間ごとに実行するためのcronジョブを設定する必要があります。 ユーザーのcrontabを開きます。
- crontab -e
これにより、テキストファイルが開きます。 cronを初めて使用する場合は、デフォルトのテキストエディタを選択するように求められる場合があります。 好みがない場合は、新規ユーザーにはnano
をお勧めします。 cron構文を説明するコメントがファイルにすでに含まれている場合があります。 ファイルの最後にある新しい空白行にカーソルを移動し、以下を追加します。
crontab14 * * * * /usr/sbin/logrotate /home/sammy/logrotate.conf --state /home/sammy/logrotate-state
このタスクは、毎日、毎時14分に実行されます。 安全のためにlogrotate
を/usr/sbin/logrotate
のフルパスに拡張しましたが、以前に実行したのとほぼ同じlogrotate
コマンドを実行します。 cronジョブを作成するときは、フルパスを使用することをお勧めします。 cronの詳細については、他のチュートリアルを確認してください。
ファイルを保存して終了します。 これによりcrontabがインストールされ、タスクは指定されたスケジュールで実行されます。
約1時間後にログディレクトリに再度アクセスすると、ローテーションおよび圧縮されたログファイルaccess.log.1.gz
(または--force
フラグを指定してLogrotateを実行した場合は.2.gz
)が見つかります。
結論
このチュートリアルでは、Logrotateのバージョンを確認し、デフォルトのUbuntu Logrotate構成を調べ、2つの異なるタイプのカスタム構成をセットアップしました。 Logrotateで使用できるコマンドラインと構成オプションの詳細については、ターミナルでman logrotate
を実行するか、オンラインドキュメントにアクセスして、マニュアルページを参照してください。