Linuxオペレーティングシステムと実行中のアプリケーションは、多くの場合、ファイルへのログを生成します。これらのファイルは、多くの場合、/var/log
に保存されます。 ディレクトリまたはアプリで指定されたその他のファイル。これらのログファイルがローテーション、圧縮、および定期的に整理されていない場合、最終的には使用可能なすべてのディスクスペースを消費し、サーバーがフリーズします。
このガイドでは、logrotateがどのように機能するかを見てから、カスタムアプリのlogrotationを構成する方法の例を見ていきます。
前提条件
このガイドに従うには、次のものが必要です。
- Ubuntu、Debian、Centos、Rhel、RockyLinuxなどの最新のLinuxディストリビューション
- サーバーまたはsudo権限を持つユーザーへのrootアクセス
次のコマンドでログローテーションのバージョンを確認してください:
logrotate --version
私のシステムからの出力:
# logrotate --version
logrotate 3.8.6
Logrotateがインストールされていない場合、エラーが発生します。 Linuxディストリビューションのパッケージマネージャーを使用してソフトウェアをインストールしてください。
ログローテーション構成
logrotate構成は、このファイル/etc/logrotate.conf
にあります。 。これは、デフォルト設定が配置されている場所です。また、どのシステムパッケージも所有していないログのローテーション構成もいくつかあります。
この構成ファイルの最も重要な行は、include /etc/logrotate.d
です。 。これにより、logrotateは、そのディレクトリに追加された構成もチェックするように指示されます。つまり、アプリケーションの場合、メインファイルにすべてを追加する必要はなく、個別の構成ファイルを作成して/etc/logrotate.d
に追加できます。 ディレクトリ。ログローテーションの支援が必要なインストールするほとんどのパッケージは、ログローテーション構成ファイルもそのディレクトリに配置します。
これは、メインの/etc/logrotate.conf
のコンテンツです。 ファイル:
weekly
rotate 4
create
dateext
compress
weekly
rootが所有するログファイルを使用して毎週のログローテーションを構成します ユーザーとsyslog グループrotate 4
4つのログファイルが保持されます(4週間分のバックログを保持します)create
現在のログファイルがローテーションされた後に作成される新しい空のログファイル-
dateex
ローテーションされたファイルのサフィックスとして日付を使用する compress
ローテーションされたファイルを圧縮する
/etc/logrotate.d
内の個々のファイルの場合 ディレクトリ、例として1つを見てみましょう:
cat /etc/logrotate.d/yum
出力:
/var/log/yum.log {
missingok
notifempty
maxsize 30k
yearly
create 0600 root root
}
これらの各構成は、/etc/logrotate.conf
のデフォルト構成を継承します。 ディレクトリ。
説明:
-
/var/log/yum.log
この最初の行は、構成ターゲットをどのファイルに保存するかを示しています -
missingok
ファイルが存在しない場合でも問題はなく、logrotateでエラーが発生したり、エラーがログに記録されたりすることはありません。 -
notifempty
ログファイルが空の場合はローテーションしないでください -
maxsize
サイズが30kを超える場合は、回転させます yearly
年に1回実行create 0600 root root
新しいローテーションされたファイルをroot
として作成します :root
権限あり0600
上記にリストされていない他のいくつかのオプション:
rotate 30
30個のファイルを保持し、それらが超過したときに最も古いファイルを整理しますmonthly
月に1回ローテーションcompress
ローテーションされたファイルを圧縮します。これはgzip
を使用します デフォルトでは、ファイルは.gz
で終わります。 。圧縮コマンドは、compresscmd
を使用して変更できます オプション。
カスタムアプリログファイルのログローテーション
カスタムアプリケーションでログを生成してファイルに書き込む場合、そのファイルのローテーションの実行方法を構成するのがタスクです。
- rootアクセスがある場合は、設定ファイルを
/etc/logrotate.d/
に配置するのが理想的です。 ディレクトリとそれは上記のように動作します - rootアクセスがない場合は、
logrotate
を実行するようにcronを構成する必要があります。 定義した構成を渡すコマンド - ログを毎日より頻繁にローテーションする場合(システムのLogrotateセットアップは1日1回しか実行されないため、1時間ごとなど)
/etc/logrotate.d/の構成
/var/log/our-app/app.log
へのアプリ生成ログがあるとします。 centos
として実行されます 。 logrotateconfogファイル/etc/logrotate/ourapp.conf
を作成しましょう いくつかの設定例:
sudo vim /etc/logrotate.d/ourapp.conf
構成:
/var/log/our-app/*.log {
daily
missingok
rotate 30
compress
notifempty
create 0640 centos centos
sharedscripts
postrotate
systemctl reload our-app
endscript
}
いくつかの新しい指令:
create 0640 centos centos
指定された権限でローテーション後に空のログファイルを作成します0640
指定されたユーザーとグループのcentos
sharedscripts
つまり、構成に追加されたスクリプトは、ローテーションされたファイルごとではなく、実行ごとに1回だけ実行されます。ディレクティブ/var/log/our-app/*.log
の場合postrotate
で指定されたスクリプトである複数のログファイルに一致します このオプションがないと2回実行されます-
postrotate
endscript
へ ブロックには、ログファイルがローテーションされた後に実行するスクリプトが含まれています。この場合、アプリをリロードします。これは、アプリケーションを新しく作成されたログファイルに切り替えるために必要になる場合があります。postrotate
に注意してください ログが圧縮される前に実行されます。圧縮には長い時間がかかる可能性があり、ソフトウェアはすぐに新しいログファイルに切り替える必要があります。 後に実行する必要があるタスクの場合 ログは圧縮されています。lastaction
を使用してください 代わりにブロックします。
上記の設定をテストするには、次のコマンドを使用します:
sudo logrotate /etc/logrotate.conf --debug
出力は、Logrotateが処理しているログファイルと、それらに対して何をしたかについてです。標準のLogrotateジョブは1日1回実行され、新しい構成が含まれます。
出力のサンプルデータ
...
rotating pattern: /var/log/our-app/*.log after 1 days (30 rotations)
empty log files are not rotated, old logs are removed
No logs found. Rotation not needed.
...
logrotate
の使用 カスタム構成のコマンド
システムへのrootアクセス権がなく、独自のカスタムファイルをログローテーションする場合は、このセクションでその方法を説明します。
アプリをour-app
としましょう ログファイルを生成し、ホームディレクトリ内のカスタムパスに保存しています。 ~/apps/our-app/logs/
。ログが頻繁に生成される場合は、ログをhourly
ローテーションする必要があります。 。しかし、logrotateは1時間ごとに機能しませんか?
まず、logrotate構成ファイルを作成しましょう。このパス~/apps/our-app/conf/lorotate.conf
のappconfディレクトリ内にファイルを配置します 次の構成で:
ファイルを編集します:
vim ~/apps/our-app/conf/lorotate.conf
次の構成の場合:
/home/centos/apps/our-app/logs/*.log {
rotate 30
hourly
compress
sharedscripts
delaycompress
missingok
notifempty
dateext
dateformat -%Y-%m-%d-%s
copytruncate
}
上記の設定は、ディレクトリ/home/centos/apps/our-app/logs/*.log
内のファイルをローテーションします 1時間ごとに、30個の古いログのみを圧縮して保持します。
-
copytruncate
ログファイルの内容を新しいファイルにコピーしてから、ログファイルを切り捨てます。 -
dateformat
ローテーションされたファイルの形式を指定します -
dateext
ローテーションされたファイルの日付拡張子を含めるようにlogrotateに指示します。
テストするには:
mkdir -p ~/apps/our-app/{logs,conf}
touch ~/apps/our-app/logs/app.log
ファイルが配置されたので、logrotate
を使用できます。 それを回転させます。 state
を指定するだけです。 ファイル。 state
ファイルには、logrotate
の内容が記録されます それが最後に実行されたときに見たので、それは何をすべきかを知っています。システムインストールの設定では、すでに/var/lib/logrotate/status
で処理されています。 ただし、この場合は指定する必要があります。
これにはホームディレクトリを使用できます:
logrotate ~/apps/our-app/config/logrotate.conf --state ~/logrotate-status --verbose
--verbose
Logrotateが行っていることに関する詳細情報を印刷します。
次のような出力が表示されます:
$ logrotate ~/apps/our-app/config/logrotate.conf --state ~/logrotate-status --verbose
reading config file /home/centos/apps/our-app/config/logrotate.conf
Allocating hash table for state file, size 15360 B
Handling 1 logs
rotating pattern: /home/centos/apps/our-app/logs/*.log hourly (30 rotations)
empty log files are not rotated, old logs are removed
considering log /home/centos/apps/our-app/logs/app.log
log does not need rotating (log has been already rotated)set default create context
ログローテーションステータスファイルにいくつかの情報が記録されました:
$ cat ~/logrotate-status
logrotate state -- version 2
"/home/centos/apps/our-app/logs/app.log" 2021-9-4-6:0:0
Logrotateは、見たログと、最後にローテーションを検討した日時を記録しました。この同じコマンドを1時間後に実行すると、ログは期待どおりにローテーションされます。
Logrotateにログファイルを強制的にローテーションさせたい場合は、--force
を使用します。 フラグ:
logrotate ~/apps/our-app/config/logrotate.conf --state ~/logrotate-status --verbose --force
これは、postrotate
をテストするときに役立ちます およびその他のスクリプト。
次に、上記のコマンドを自動的に実行します。これは、cronを使用して実現できます。 crontab
コマンドが便利です。
次のコマンドを使用できるようにcronを編集するには:
crontab -e
これにより、テキストファイルが開きます。予想される基本的な構文を説明するコメントがファイルにすでに含まれている場合があります。ファイルの最後にある新しい空白行にカーソルを移動し、以下を追加します。
3 * * * * /usr/sbin/logrotate ~/apps/our-app/config/logrotate.conf --state ~/logrotate-status
上記は、毎時3分ごとにlogrotateコマンドを実行します。フルパス/usr/sbin/logrotate
を使用します そのため、Commandnotfoundエラーは発生しません。
ファイルを保存して終了します。これによりcrontabがインストールされ、タスクは指定されたスケジュールで実行されます。
結論
このガイドではlogrotateについて説明しました。バージョンを確認し、デフォルトの構成を確認して、独自のカスタムセットアップをセットアップすることができました。 Logrotateで使用できるコマンドラインと構成オプションの詳細については、man logrotate
を実行してマニュアルページを読むことができます。 ターミナルで:
man logrotate