Debian(Linux)のログについて
「ログ」という言葉に食傷気味になっているIT管理者の方もいませんか。筆者もそのような人間の一人で、どうしてなんだろうと考えた結果ログについてよく知らないことに気づきました。だからすべてのログを読み解こうとして疲れてしまうのではないかと。
そこでログを見直すためにここではLinuxにおけるSyslogの知識を@IT:システム管理の基礎 syslogdの設定をマスターしようを参考に理解を深めたいと思います。
/var/log
ログは大きく2系統に分かれます。それはアプリケーションが独自にログを出力する場合と、アプリケーションがsyslogdを通じてログを出力する場合です。これらのログはたいてい/var/logディレクトリのどこかに入ります。(Debianだとdmesgで表示されるログは入らないようです)
Syslog
SyslogとはもともとログメッセージをIPネットワーク上で転送するための規格を表すものです。UDPの514ポートに割り当てられています。それらのログを送信したり、保存したりするアプリケーションにも「Syslog」という言葉が使われます。
Linux上ではSyslogデーモンがログを受け付けているので、Syslogを利用するアプリはそこにログを渡すことでログが管理されます。
Syslogには「ファシリティ」と「プライオリティ」という概念があります。
ファシリティは、何のログかに当たるもで「mail(メールに関するログ)」や「authpriv(認証に関するログ)」といった項目があるだけでなく「local0~local7」の範囲で、利用者が独自に振り分けることができます。複数に所属することもできます。
プライオリティは、重要度です。「emerg(緊急事態)」、「warning(警告)」「info(情報)」等があり、表示時に重要なものや特定の項目に限って絞り込むことが可能です。
Debianにおいては標準的に設定されるのはrsyslogです。このメイン設定ファイルは/etc/rsyslog.confで、詳細設定は/etc/rsyslog.d/ディレクトリに入っています。
rsyslog.confには、ログ作成のアクセス権の設定や、「ファシリティ.プライオリティ 保存先」で構成されるエントリーがあります。
logrotate
logは放っておくとどんどんたまり続けます。また一つのログファイルが大きくなりすぎると取り扱いに手間がかかるようになります。これを回避するためにlogrotateというアプリが存在します。これはSyslogとは完全に独立していて、Debianでは通常、日々のcronジョブでこのlogrotateが実行されます。
logrotateの処理によりファイルは分割され、古いものは削除されます。
なんのログをどれぐらいの単位で区切って、何日保存しておくかといった設定は/etc/logrotate.d/ディレクトリ内あります。管理対象のログ毎にファイルが分かれています。
筆者の環境にあるmysql-serverにおけるデフォルトの設定は次のようになっていました。
/etc/logrotate.d/mysql-server
# - I put everything in one block and added sharedscripts, so that mysql gets
# flush-logs'd only once.
# Else the binary logs would automatically increase by n times every day.
# - The error log is obsolete, messages go to syslog now.
/var/log/mysql/mysql.log /var/log/mysql/mysql-slow.log /var/log/mysql/mariadb-slow.log /var/log/mysql/error.log {
daily
rotate 7
missingok
create 640 mysql adm
compress
sharedscripts
postrotate
test -x /usr/bin/mysqladmin || exit 0
if [ -f `my_print_defaults --mysqld | grep -m 1 -oP "pid-file=\K.+$"` ]; then
# If this fails, check debian.conf!
mysqladmin --defaults-file=/etc/mysql/debian.cnf --local flush-error-log \
flush-engine-log flush-general-log flush-slow-log
fi
endscript
}
設定項目に対する説明は次の通りです。
- 対象ファイル{}
対象ファイルを記述しその設定を{}の中に記述します。ファイルが複数ある時はスペースで区切ります。
- daily
日毎のローテーションを指定しています。次の設定と合わせて7日分のログを残す設定となります。weeklyとすると週、monthlyとすると月毎のローテーションになります。保存の期間は好みで調整してください。
- rotate 7
7世代分のログを残す設定です。
- missingok
ログファイルがなくてもエラーにしない設定です。
- create 640 mysql adm
新しいログファイルを作成する際のモード(権限)、ユーザー、グループを設定しています。
- compress
古いログファイルをgzip形式で圧縮します。
- sharedscripts
postrotateで記述するスクリプトは通常ファイル毎に実行されますが、sharedscriptsを指定すると全体を通して1度の実行になります。
- postrotate~endscript
ローテーション処理後に実行するスクリプトを記載します。
他にも指定できるオプションは複数あります。一覧は「man logrotate」から確認できます。
ちなみに、手動による実行をしたい場合は、「logrotate -f 設定ファイル名」で強制的に処理を実行することができます。また、実際にローテーションせずに設定ファイルのテストだけしたい場合は「logrotate -d 設定ファイル名」を利用します。