想定読者
ログローテートを知らない人。
ログローテートの概要を知っているが、どのように設定するかの詳細を知らない人。
システム構成
- OS:CentOS 6.7
- 言語:php5.6
- RDB:Mysql
ログローテートとは何か
Log: (実験・業務などの)記録
Rotate:回転する、循環する、自転する、交替する
→記録を循環させるソフトウエア。
ログローテートの目的
ログを定期的に削除することで、ログの肥大化を防ぐことです。
#ログローテートの種類
- アプリケーション側でのローテーション設定
- OS側のローテション
大まかに上記の2種類あります。
今回は、後者を解説していきます。
ログの種類
サーバで稼動している各種ソフトウエアは、各種ログを出力しています。
- Linuxシステムログ(syslog)
- ミドルウエアログ(access.log, mysqld.log 等)
- ソフトウエアログ(access.log, error.log 等)
ログ出力の注意点
MW全部のログを1つにまとめるのはやめましょう。
Elasticsearchなどでログ解析しようとしたとき、構文解析やデータ加工のための手間が必要なります。
ログローテションされないとどうなる?
→サーバのディスク領域を使いきり、ログが書き込めないことでサーバが機能停止する恐れがあります。
ログローテートするには
ログローテートソフトウエア「logrotate」 を使おう!
最近のLinuxではデフォルトで導入されている非常にメジャーなソフトウエア。
もし、ない場合はyumやaptなどのツールで導入しましょう。
設定してみよう
/etc/logrotate.d/
配下に、ソフトウエアや機能単位で設定ファイルを配置する形式がメジャーです。
ファイル名例
/etc/logrotate.d/apache
/etc/logrotate.d/nginx
/etc/logrotate.d/php-web
/etc/logrotate.d/php-api
apacheの記載例
cat /etc/logrotate.d/httpd
/var/log/httpd/*log {
missingok
notifempty
sharedscripts
delaycompress
postrotate
/sbin/service httpd reload > /dev/null 2>/dev/null || true
endscript
}
設定できる項目
項目名 | 内容詳細 |
---|---|
missingok | 指定のログファイルがなくても処理続行 |
notifempty | ログファイルが空ならスキップ |
delaycompress | ローテーション1世代目は圧縮しない |
daily or weekly or monthly or yearly | 指定した周期で実行 |
rotate [回数] | ローテーションする回数を指定 |
size [ファイルサイズ] | ログファイルが指定したファイルサイズ以上になったらローテーションする |
postrotate~endscript | 記述されたコマンドをログローテーション後に実行 |
compress | ローテーションしたログをgzipで圧縮 |
注意点
実行権限
logrotateは、root権限で実行することがあります。
そのため、postrotate等でファイル削除コマンドやscriptを実行する場合には必ず検証環境で動作確認してください。
不適切なスクリプトがroot権限で実行された場合、最悪システムファイルが破損し、サーバがダウンします
ログ保管
ローテーションの性質上、古いログファイルは削除されていきます。
長期的に保管して、分析したい要件がある場合は、保管方式や転送方式を検討、設計しましょう