RHEL系(CentOS)
---
利点
logrotate機能とは
自分で作成したバッチファイルのログ、syslogサーバとしてクライアントから
送信されてきたログを永久に保管すると容量が圧迫します。
そのログファイルを「毎時、日次、週次、月次」単位で分割したり
ファイルサイズ単位で分割したり
古いログを削除してローテーションしたり圧縮したり
して管理することができます。
まずは、すぐに設定する方法を解説します。
最初に準備しておくこと(2つ)
1.ログファイルの保管場所とローテーションしたいログファイルを決める
例
保管場所:/var/log/hosts/isleofhoso03
ログファイル名:/var/log/hosts/isleofhoso03/isleofhoso03_message.log
2.logrotateの設定をどうするか?
押さえておきたい設定を抜粋(よく利用するものだけを厳選、以下でほぼ網羅できます)
※赤色の設定がよく利用するものです。
設定 | 説明 |
rotate | ローテーション回数を指定(何世代分のログを残すかを決める) この数値で古いものがが削除されます 例 rotate 4 daily だった場合は5日前のデータが削除されます |
daily | ログを毎日ローテーションする ※weekly(毎週)・monthly(毎月)・yearly(毎年)に変更も可能 ※hourly(毎時)も可能 但し、logrotateのcronの設定変更が必要(関連記事でにて記載) |
ifempty | ログファイルが空でもローテーションできるようにする設定 |
create | ローテーション直後(postrotateの実行前)に新しいログファイルを作成する ファイルの属性とファイル所有者のユーザ名とグループ名を設定できます。 例 create 0600 root root 所有者に:「読み書き」権限を付与 所有者:rootユーザ グループ:rootグループ |
dateformat | ローテーションしたファイル名に日付のフォーマットを指定できます。 %Y(年),%m(月),%d(日),%H(時),%s (1970-01-01からの秒数)が使用できます。 ※「logrotate-3.8.6-19.el7.x86_64」確認済 例 ■daily設定の時 dateformat .%Y%m%d ■hourly設定の時 dateformat .%Y%m%d-%s <-こちらを利用 or dateformat .%Y%m%d-%H <-あまり利用しない |
missingok | ログファイルが存在しない場合、エラーとならずに処理を継続する |
sharedscripts | ログファイルをワイルドカードで指定した場合、スクリプトは一度だけ実行する 例 /var/log/hosts/message.log /var/log/hosts/mail.log と用途が違うログが複数存在している場合 -- /var/log/hosts/*.log { sharedscripts postrotate ~ endscript ~ -- を指定すると postrotateの場合は、message.logとmail.logのローテーション後に1回だけスクリプトを実行する (prerotateの場合は、ローテーション前に1回だけスクリプトを実行する) ーーーーーーーーーーーーーーー ■nosharedscriptsの場合 (sharedscriptsの指定がなければnosharedscriptsがデフォルト設定になります) ->1つのサービスに複数のログがあるとスクリプトをそれぞれ実行する 例のようにmessage.logとmail.logがあると message.logのローテーションでスクリプトを実行して mail.logのローテーションでスクリプトを実行し、同じスクリプトを計2回実行します ※ローテーションするファイル数に合わせてスクリプトが実行されます |
postrotate endscript | postrotateとendscriptの間で記載されたコマンドをログローテーション後に実行 ※コマンドは複数行記載することができます 例 ~ rotate 7 sharedscripts postrotate /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null || true echo test >> /tmp/test.log endscript } ーーーーーーーーーーーーーーー prerotate~endscript間で記載されたコマンドはログローテーション前に実行 |
maxsize minsize size | 単位としてk(キロバイト)、M(メガバイト)、G(ギガバイト)も利用可能 ※kは小文字 ■[maxsize]はsize指定以上もしくは、間隔指定(dailyなど)のどちらが該当で実行(or条件) 例えば size 10M と dailyを指定した場合 10Mを超えた場合にローテーションされます。 また、10M以下であってもdaily(1日)を経過していたらローテーションされます ■[minsize]はsize指定以上と間隔指定(dailyなど)のどちらとも該当で実行(and条件) 例えば size10Mとdailyを指定した場合 10Mを超えおり、かつ、daily(1日)を経過していた場合のみローテーションされます ■[size]はsize指定以上と間隔指定(dailyなど)があれば間隔指定は無効として実行(間隔指定無視) 例えば size 10M と dailyを指定した場合 10Mを超えた場合にローテーションされます。 daily(1日)は無効でlogrotateの実行時に10Mを超えた場合のみローテーションされます ※10M以下であれば、daily(1日)を経過してもローテーションされません |
copytruncate | ログファイルをコピーして、コピー元(更新中)のログファイルを空にします。 ※ログファイルがなくならないので、ログファイルをクローズせずにログを書き込み するようサービスで利用しているログファイルのローテーションに便利 --注意-- ファイルコピーとファイルを空にする一瞬の間にログが書き込まれるとログデータが 失われてしまう場合があります。 |
compress | ローテーションしたログを圧縮します |
logrotateの設定
事前準備にてローテーションしたいログファイルとローテーション設定の
内容をある程度まとめたら「/etc/logrotate.d/」配下にファイル(任意)を
作成してローテーション設定を記述します。
※今回は「isleofhoso03」というファイルに設定を記載します。
#vi /etc/logrotate.d/isleofhoso03
以下のように設定する
※設定の意味については上記に記載
rotate 31 #31世代分のファイルを残す daily #毎日ローテーションする ifempty #ログファイル空でもローテーションする create 0600 root root #rootのユーザ、rootグループで0600なので「-rw-------」 dateformat .%Y%m%d-%s #日付フォーマット設定(isleofhoso03_messages.log.20201010-1602320018) missingok #ログファイルがなくてもエラーとしない sharedscripts #スクリプトを一回でけ実行 postrotate #ローテーション後にpostrotate~endscriptまでのスクリプトを実行 /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true endscript ファイルを保存して設定が完了したら 以下のコマンドを実行して設定ファイルの正常性を確認します。 |
■正常性の確認
#logrotate -dv /etc/logrotate.conf
■ファイル作成での注意
ファイル(/etc/logrotate.d/isleofhoso03ファイル)の
パーミッションを間違えると設定ファイルを読み込まず
ログローテーションしないので注意してください。
例
#chmod 644 /etc/logrotate.d/isleofhoso03
としてパーミッションを設定しておく
ファイルのパーミッションは「0644」or[0444」にすること
パーミッションを間違えると以下のエラーが出力されログローテーションが
実行されません。
例
logrotate -dv /etc/logrotate.conf
で確認すると以下のエラーが表示されます。
error: Ignoring isleofhoso03 because of bad file mode - must be 0644 or 0444.
ファイル設定に間違いなければ、時間がくればローテーションされます。
※サービス再起動などはlogrotateでは必要ありません。
今すぐlogrotateを実行して確認(強制実行したい場合)
■ローテーション強制実行
# logrotate -f /etc/logrotate.conf
強制的にログローテーションが実行されます。
他のローテーションにも影響がある場合があるので注意が必要です
コメント