ログファイルは、システムアクティビティに関する情報を妥当な期間保持することを目的としていますが、システムログデーモンはログファイルのサイズを制御する手段を提供しません。したがって、チェックを外したままにすると、ログファイルが大きくなり、ログファイルが存在する使用可能なパーティションスペースがすべて消費される可能性があります。ログファイルがシステムを完全にいっぱいにするのを防ぐために、ログメッセージをローテーションできます。つまり、特定のしきい値に達すると、古いログファイルが閉じられ、新しいログファイルが開かれます。
ここでは、Ubuntu 18.04/20.04でlogrotateを使用してログファイルをローテーションする方法を説明します。
ログローテーションとは何ですか?
ログローテーションは、現在のログファイルを定期的にアーカイブして新しいログファイルを開始することにより、これらの問題を解決するプロセスです。現在のログファイルの名前を変更し、オプションで圧縮し、古いログファイルを削除し、ログシステムに新しいログファイルの使用を強制的に開始させます。通常、 cronを介して自動的に実行されます 効用。ログローテーションを使用すると、次のことができます
- 毎日、毎週、毎月などのスケジュールで新しいログファイルを開始します
- 古いログファイルを圧縮してディスク容量を節約する
- 古いアーカイブを整理して、特定の数の古いログのみを保持するようにします。
- 古いログファイルの名前を日付スタンプで変更して、古いログを探す場所がわかるようにします。
- 一連のログがローテーションされる前または後にコマンドを実行します。
ログローテーションは、現在のログファイルの名前を変更し、新しいログエントリ用に新しいログファイルを設定するプロセスとして見ることができます。ログファイルがローテーションされると、通常、古いログファイルはローテーション日が含まれるファイルにコピーされます。
1)logrotateの構成ファイル
Ubuntu 18.04では、logrotateの構成ファイルは/etc/logrotate.conf
です。 、/etc/logrotate.d
内のファイルと一緒に メインのlogrotate.conf fileは、ローテーションするデフォルト設定とシステムファイルを指定します。このファイルには、コメントで十分に説明されているいくつかのオプションが含まれています。
cat /etc/logrotate.conf
# see "man logrotate" for details
# rotate log files weekly
weekly
# use the syslog group by default, since this is the owning group
# of /var/log/syslog.
su root syslog
# keep 4 weeks worth of backlogs
rotate 4
# create new (empty) log files after rotating old ones
create
# uncomment this if you want your log files compressed
#compress
# packages drop log rotation information into this directory
include /etc/logrotate.d
# no packages own wtmp, or btmp -- we'll rotate them here
/var/log/wtmp {
missingok
monthly
create 0664 root utmp
rotate 1
}
/var/log/btmp {
missingok
monthly
create 0660 root utmp
rotate 1
}
# system-specific logs may be configured here
ログローテーションの主なオプション は:
- 毎週: ログファイルを週に1回ローテーションします
- su root syslog: 特定のユーザーを使用してログをアーカイブします(root) およびグループ(syslog) 権限の問題を防ぐため
- ローテーション4: ファイルの4つの古いバージョンが保存されていることを確認します。特定のログを削除する前に4回ローテーションするため、4週間のログがオンラインに保たれます。
- 作成: 古いファイルは新しい名前で保存され、新しいファイルが作成されます
- 圧縮: compressにより、logrotateはログファイルを圧縮してスペースを節約します。これはデフォルトでgzipを使用して行われますが、別のプログラムを指定することもできます
- 含める: この重要なオプションにより、ディレクトリ
/etc/logrotate.d
のコンテンツが確実になります。 含まれています。このディレクトリには、個々のログファイルの処理方法を指定するファイルがあります。
/etc/logrotate.d
の各ファイル 追加の設定を追加したり、特定のファイルのデフォルト設定を上書きしたりするために使用されます。このフォルダーには、ログローテーションが必要なインストール済みパッケージのlogrotate構成も含まれています
# ls -l /etc/logrotate.d
total 40
-rw-r--r-- 1 root root 120 Nov 2 2017 alternatives
-rw-r--r-- 1 root root 442 Oct 23 2017 apache2
-rw-r--r-- 1 root root 126 Nov 20 16:39 apport
-rw-r--r-- 1 root root 173 Apr 20 10:08 apt
-rw-r--r-- 1 root root 112 Nov 2 2017 dpkg
-rw-r--r-- 1 root root 146 Apr 17 17:35 lxd
-rw-r--r-- 1 root root 845 Jan 12 10:57 mysql-server
-rw-r--r-- 1 root root 501 Jan 14 16:19 rsyslog
-rw-r--r-- 1 root root 178 Aug 15 2017 ufw
-rw-r--r-- 1 root root 235 Apr 17 14:53 unattended-upgrades
たとえば、ApacheWebサーバーのlogrotate構成を確認できます
# cat /etc/logrotate.d/apache2
/var/log/apache2/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
create 640 root adm
sharedscripts
postrotate
if invoke-rc.d apache2 status > /dev/null 2>&1; then \
invoke-rc.d apache2 reload > /dev/null 2>&1; \
fi;
endscript
prerotate
if [ -d /etc/logrotate.d/httpd-prerotate ]; then \
run-parts /etc/logrotate.d/httpd-prerotate; \
fi; \
endscript
}
Logrotateには、上記の追加オプションがいくつか含まれています。
- 毎日: 基準日にログをローテーションします
- ミッシングコック: ログが欠落している場合でもエラーを発生させないでください
- delaycompress: 回転するまでファイルを圧縮しないでください。これは、デーモンがログファイルをすぐに閉じない場合の破損を防ぐためです。
- 空に通知: 空のときにログファイルをローテーションしないでください
- 640ルートアドミンを作成します: これにより、権限、所有者、グループが設定された新しいログファイルが作成されます
- 共有スクリプト: ワイルドカードが複数のファイルと一致する場合は、すべてのファイルに対して任意のスクリプトを1回実行します
- 後回転/エンドスクリプト: endscriptまで実行する必要のあるコマンドまたはスクリプトを指定します キーワード、ログがローテーションされた後。
- prerotate / endscript: postrotate / endscript として 、ログローテーションを開始する前に実行する必要があるコマンドまたはスクリプトを指定します。
マニュアルを使用すると、追加オプションに関する情報を入手できます
man logrotate
2)logrotateを使用してログローテーションを構成する
logrotateコマンドは通常、ログファイルの名前を周期的に変更(またはローテーション)します。ログファイルの名前が変更され、数値または日付の拡張子が含まれるようになり、システム情報を受け入れるために新しいログファイルが作成されます。 logrotateが古いログファイルのコピーを2つだけ保持するように構成されている場合、2回のログローテーションの後、最も古いログファイルが自動的に削除されます。
通常、logrotateコマンドはデフォルトでUbuntu 18.04にインストールされており、以下のようにバージョンを確認できます
# logrotate --version
logrotate 3.11.0
デフォルトでは、logrotateは、シェルスクリプト/etc/cron.daily/logrotate
を実行することで毎日実行されます。 他のcronファイルにはlogrotateファイルが含まれていないことがわかります
cat /etc/cron.daily/logrotate
#!/bin/sh
# Clean non existent log file entries from status file
cd /var/lib/logrotate
test -e status || touch status
head -1 status > status.clean
sed 's/"//g' status | while read logfile date
do
[ -e "$logfile" ] && echo "\"$logfile\" $date"
done >> status.clean
mv status.clean status
test -x /usr/sbin/logrotate || exit 0
/usr/sbin/logrotate /etc/logrotate.conf
-d
を使用して実行した場合、アプリケーションのlogrotate構成がどのように機能するかを確認できます。 コマンドのパラメータ
# logrotate -d /etc/logrotate.d/mysql-server
reading config file /etc/logrotate.d/mysql-server
Reading state from file: /var/lib/logrotate/status
Allocating hash table for state file, size 64 entries
Handling 1 logs
rotating pattern: /var/log/mysql.log /var/log/mysql/*log after 1 days (7 rotations)
empty log files are rotated, old logs are removed
considering log /var/log/mysql.log
error: skipping "/var/log/mysql.log" because parent directory has insecure permissions (It's world writable or writable by group which is not "root") Set "su" directive in config file to tell logrotate which user/group should be used for rotation.
Creating new state
considering log /var/log/mysql/error.log
Creating new state
Now: 2018-05-22 06:02
Last rotated at 2018-05-22 06:00
log does not need rotating (log has been already rotated)
ログローテーションは、rootユーザーおよび非rootユーザーとして設定できます。
a)インストールされたサーバーパッケージのログローテーションを設定する
rootユーザーとしてのLogrotate構成ファイルは、/etc/logrotate.d
に作成されます。 毎日フォルダ。たとえば、監視ツールスーパーバイザーのログローテーションを構成します。まず、ログを保存する構成ファイルを示すログローテーションファイルを作成します
# vim /etc/logrotate.d/supervisor
/var/log/supervisor/superviz.log {
daily
create 0640 root root
missingok
dateext
rotate 3
size=1M
notifempty
sharedscripts
mail [email protected]
}
いくつかのオプションを説明しましょう:
- dateext: 古いバージョンのログファイルの拡張子として日付を使用します
- サイズ: ここで指定されたサイズより大きくなるファイルをログに記録します
- メール: logrotateに、その内容を上書きする前に指定されたアドレスに電子メールで送信するように指示します。メールサーバーが機能している必要があります
これで、フォルダーを含むメイン構成を指すデバッグモードでlogrotateを呼び出すことにより、構成をテストできます。コマンドはいくつかの情報を表示しますが、構成に関する情報のみを並べ替えます
# logrotate /etc/logrotate.conf --debug
reading config file /etc/logrotate.conf
including /etc/logrotate.d
reading config file alternatives
reading config file apache2
reading config file apport
reading config file apt
reading config file dpkg
reading config file lxd
reading config file mysql-server
reading config file rsyslog
reading config file supervisor
reading config file ufw
reading config file unattended-upgrades
Reading state from file: /var/lib/logrotate/status
...
...
rotating pattern: /var/log/supervisor/supervisord.log 1048576 bytes (3 rotations)
empty log files are not rotated, old logs mailed to [email protected]
switching euid to 0 and egid to 106
considering log /var/log/supervisor/supervisord.log
Creating new state
Now: 2018-05-22 08:16
Last rotated at 2018-05-22 08:00
log does not need rotating (log size is below the 'size' threshold)
switching euid to 0 and egid to 0
....
....
構成をローテーションする必要がないことがわかります。これは、条件サイズがまだ確認されていないためです。このコマンドがエラーなしで実行されると、構成が適切に見えることを意味します。
b)カスタムアプリケーションのログローテーションを設定する
ログを生成し、root以外のユーザーとして実行するカスタムアプリケーションのログローテーションを構成できます。デフォルトでは、logrotateは毎日実行されるため、アプリケーションを1時間ごとに実行する必要がある場合は、デフォルトのフォルダーの外にlogrotate構成を作成します。
不一致のログローテーションを設定して例を見てみましょう。メインのlogrotate構成ファイルとログファイル用のフォルダーを含む個人用フォルダーを作成します。このアプリケーションはログローテーションを理解していないため、logrotateはコピーと切り捨ての実装を使用してこれを処理します
$ vim apps/logrotate.conf
/home/alain/apps/logs/discord.log {
hourly
copytruncate
missingok
dateext
rotate 10
compress
}
新しいオプションを使用しましたcopytruncate これにより、古いファイルを移動して新しいファイルを作成する代わりに、コピーを作成した後に古いログファイルが切り捨てられます。これは、ログファイルを閉じるように指示できないサービスに役立ちます。
構成をテストすることはできますが、状態ファイルを指定する必要があります。このファイルは、logrotateが最後に実行したときに見たものと実行したものを記録し、次に実行するときに何をすべきかを認識します。非rootユーザーとしてコマンドを実行していることに注意してください
$ logrotate /home/alain/apps/logrotate.conf --state /home/alain/apps/logrotate-state --verbose
reading config file /home/alain/apps/logrotate.conf
Reading state from file: /home/alain/apps/logrotate-state
Allocating hash table for state file, size 64 entries
Handling 1 logs
rotating pattern: /home/alain/apps/logs/discord.log hourly (10 rotations)
empty log files are rotated, old logs are removed
considering log /home/alain/apps/logs/discord.log
Creating new state
Now: 2018-05-22 10:09
Last rotated at 2018-05-22 10:00
log does not need rotating (log has been already rotated)
数時間後に同じコマンドを試してみると、切り捨てや圧縮の情報など、出力にいくつかの追加情報が表示されます
logrotate /home/alain/apps/logrotate.conf --state /home/alain/apps/logrotate-state --verbose
reading config file /home/alain/apps/logrotate.conf
Reading state from file: /home/alain/apps/logrotate-state
Allocating hash table for state file, size 64 entries
Creating new state
Handling 1 logs
rotating pattern: /home/alain/apps/logs/discord.log hourly (10 rotations)
empty log files are rotated, old logs mailed to [email protected]
considering log /home/alain/apps/logs/discord.log
Now: 2018-05-22 22:52
Last rotated at 2018-05-22 10:23
log needs rotating
rotating log /home/alain/apps/logs/discord.log, log->rotateCount is 10
dateext suffix '-2018052222'
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
copying /home/alain/apps/logs/discord.log to /home/alain/apps/logs/discord.log-2018052222
truncating /home/alain/apps/logs/discord.log
compressing log with: /bin/gzip
logrotate構成は、ログファイルと一致するファイルグロブと、それに続く中括弧で囲まれた一連の命令によって定義されることを保持する必要があります。ログファイルの名前に添付されたスタンザにオプションが指定されていない場合は、/etc/logrotate.conf
の最上位オプション 優先されます。ローテーションされたログファイルはどこにも保存されません。それらはなくなったばかりなので、対策を講じることを検討する必要があります。
また読む:
- Ubuntu18.04でcronログを確認する方法
- lnav-Linuxターミナルからログファイルを表示および分析するためのツール
- Systemdjournalctlコマンドを使用してログを管理する方法