Linuxサーバ運用マニュアル

ログをチェックしよう!

サーバでは,さまざまなことがログとして出力されます。それらのログは,非常に重要で有益な情報を与えてくれるものですが,複数の場所に出力されていたり,形式がまちまちだったり,量が膨大だったりして,必要な情報を引き出すにはコツが必要になります。

ここでは,代表的なログの種類と,そのログをチェックするための基本方法について説明します。

syslog

syslogは,Linuxのメインログです。syslogd(シスログ・デーモン)が,さまざまなメッセージをログとして出力しています。以下に,syslogの概念図を示します。

シスログ概念図

図のように,syslogdへのメッセージ出力元は数多くあり,ログの出力量は膨大です。通常,それらのログは/etc/syslog.confによって,出力元,エラーレベルで分類され,複数のファイルに以下のフォーマットで出力されます。

ログ出力日時 ホスト名 出力プログラム名 [プロセス番号] メッセージ

なお,同じファイルに出力したとしても,出力元が違えばメッセージの形式に差がでてくるので注意が必要です。

syslogdへの出力元

syslogdは,以下のものからメッセージを受け取り,ログを出力します。

出力元その内容
kernカーネルのメッセージ
authlogin,su,getty等のメッセージ
daemonftpd,popd,named等のデーモンのメッセージ
mailsendmailのメッセージ
userユーザのプロセスのメッセージ

エラーレベル

メッセージには,これらのエラーレベルがあります。 上にあるほど重要なレベルです。

レベル内容
emergすべてのユーザへ通知
alertシステム・データベースが壊れているというような,直ちに修正されるべき状態
critハードウェアのデバイス・エラーのような危急の状態の警告
errその他のエラー
warning警告メッセージ
noticeエラー状態ではない状態
info情報メッセージ
debugプログラムをデバッグする時に有益な情報
noneメッセージを送らない

syslogdの設定方法

syslogdは/etc/syslog.confによって設定します。

セミコロンで区切られた優先度指定のリストで以下のような形式で指定します。

出力元.エラーレベル[;出力元.エラーレベル]
syslog.confの例
*.warn;mail.none      /var/log/syslog
*.info;mail.none      /var/log/messages
mail.debug            /var/log/maillog

この例は,エラーレベルと監視対象を組み合わせて分類しています。

メールのログはdebugレベルで/var/log/maillogに出力し,その他の監視対象のログは,warnレベルで/var/log/syslogに,infoレベルでmessagesに出力するという設定です。

その他のログ

Linuxサーバでは,syslog以外にも,さまざまなログが出力されます。さまざまなサーバ・アプリケーションなどが独自にログを出力しているからです。それぞれのアプリケーションにログの出力に関する設定があるはずなので,環境に合わせて設定してログをチェックする必要があります。ここでは,代表的なものとして,delegateとapacheのログについて,少し解説しておきます。

delegateログ

プロキシであるdelegateのログのことです。delegateの起動オプションに,ログについての指定があります。(第3話参照) 起動時に設定した形式で,指定した場所にログが出力されており,主に,アクセス元やアクセス先を出力しています。

delegateログ設定
LOGDIR=ディレクトリ名
LOGFILE=ファイル名
PROTOLOG=ファイル名

上記のような形式で,ログデータ格納ディレクトリ,ログファイル名,プロトコルログファイル名などを設定します。

delegateはポート番号ごとに動作し,それぞれが指定されたファイルにログを出力します。delegateが多数動作している場合,ログの量や重要度はそれぞれ違ってきますので,どういうふうにログを残すのかを,きちんと決定する必要があります。

apacheログ

WWWサーバapacheが出力するログです。アクセス・ログ,エラー・ログの2つが出力されます。アクセス・ログがアクセス全体のログ,エラーログがエラーになったアクセスのログとなります。アクセス時間,アクセス元,アクセス先ファイル,などが出力されています。

これらのログの出力先は,apacheの設定ファイル,httpd.confの中で指定します。apacheをインストールした際は,ログの出力先を確認しておくべきでしょう。

ログの管理

サーバが出力しているログは,基本的にどんどん追加更新されていくので,そのファイル容量はどんどん大きくなっていきます。特にapacheのアクセス・ログなどは,ファイル1つのリクエストにつき1行のログを出力するので,その増加量はかなりのものです。これをそのままにしておくと,ログファイルが大きくなりすぎて,必要なデータをみつけることが困難になります。また,ハードディスク容量を圧迫するので,システム領域のパーティションに余裕がない場合,ディスク容量の不足から障害が発生することもありえます。

そのようなことがないように,ログファイルは一定時間ごとに切り分けて保存し,古いものはサーバから削除していく必要があります。

また,悪意ある侵入者などが,証拠隠滅のためにログに手を加える可能性もあるため。ログは外部媒体などにも保存しておくべきです。

それらのことを考えて,

など,ログの管理体制を決定する必要があります。

syslog_199905
error_199906.log

このように,ファイル名に年と月の情報を含める方法は,月ごとにログファイルを変える場合に有効です。これによって,ファイル管理が容易になり,目的の情報を探し出すことが簡単になります。

Delegateなどは,ログファイル名を指定する際,ファイル名に年や月の変数を使うことが可能になっています。そのような機能はなるべく活用しましょう。

grep(Grobal Regular Expression Printer)

ログをチェックするためには,ログの中から,任意の文字列を検索することが必要になってきます。Linuxには,非常に強力な検索コマンドが用意されています。それがgrepです。

検索にはいくつかの方法がありますが,大切なことは,ログの中から目的のメッセージを確実に探し出すことです。使いやすい方法を使ってください。

Linux> grep [オプション] regexp [files]

このような形式でgrepは用いられ。filesで指定されるファイルから,regexpに一致する文字列を含む行を出力します。

また,regexpをダブルクォーテーション(")で囲むことにより,スペースを含む文字列も検索できます。

オプションにはさまざまなものがありますが,ここで重要なものは -v です。

Linux> grep -v regexp [files]

filesで指定されるファイルから,正規表現regexpに「一致しない」文字列を含む行を出力します。また,-n を使えば,行番号付きで出力することもできます。

grepの使用例
Linux> grep -i refused syslog | less

syslogの中から,refused,という文字列を含む行をlessを使って表示します。

grepの検索結果は,標準出力に出力されるため,パイプ“|”でless(more)などと併用するのが一般的です。さらに,次々とパイプでつないでいく方法もあります。

パイプを利用した例
Linux> grep -i refused syslog | grep -v hasimoto | less

syslogの中から,refusedという文字列を含みhasimotoという文字列を含まない行を,lessを使って表示します。

この方法のメリットは,直前コマンドを呼び出してgrep を書き加えることで,比較的楽に絞り込みができること。そして,コマンドがわかりやすいことです。

正規表現

grepでは,特殊な文字(メタ文字)を使って,通常の文字列ではなく,特定のパターンを検索することができます。そのパターンのことを,正規表現(Regular Expression)といいます。

正規表現を用いれば,さらに複雑な条件で検索することが可能です。

grepの正規表現に用いるメタ文字
メタ文字内容
.改行文字以外の任意の1文字に一致。
*直前の任意の1文字の0回以上の繰り返しに一致
直前の文字は正規表現でもよい。
^行の先頭に一致
$行の末尾に一致
\直後のメタ文字を無効化
[ ]カッコ内の任意の文字に一致。
ハイフン(-)で範囲指定もできる。また,カッコ内の最初の文字に^を使用すると,意味が逆転する
\{n,m\}直前の文字の指定回数の繰り返しに一致
直前の文字には正規表現も利用できる。\{n,m\}と書いた場合,n回以上m回以下の繰り返しに一致する。
正規表現を利用した例
Linux> grep "May 19 10:3[3-6]" syslog | less

「May 19 10:33」「May 19 10:34」「May 19 10:35」「May 19 10:36」という文字列を含む行を,lessを使って表示します。つまり,5月19日の10:33から10:36までのログを抽出しています。

その他のコマンド

grep以外にも,ログのチェックに有効なコマンドを紹介します。

tail

ファイルの末尾部分を表示するコマンドです。lessなどと同様にgrepと組み合わせて使うのが一般的です。

Linux> tail [オプション] [files]

上記の形式で使い,デフォルトでは末尾10行を表示します。-nオプションを使えば,表示する行数を指定することができます。

重要なオプションは+n(nは数字)という形式です。これによって,先頭から数えてn番目以降を出力させることができます。grepの-nオプションを使って得た行番号の情報から,一定範囲のログを抽出するなど,いろいろな状況で有効です。

head

ファイルの先頭部分を表示するコマンドです。

Linux> head [オプション] [files]

上記の形式で使い,デフォルトでは先頭10行を表示します。-nオプションを使えば,表示する行数を指定することができます。

複数ログの検索

grepを使えば,1つのログのなかから特定の情報を得ることができます。しかし,ログは複数のマシンの複数の場所に別々に出力されています。

これらのログから情報を収集するには,時間をキーにして解析することが有効です。すなわち,複数のログファイルから,同じ時間に出力されたものを抽出し,比較検討することで,より有益な情報を得ることができるのです。

この際,複数のマシン間では,時間がずれていることがあるので,時間をキーにログを抽出する際には前後に少し余裕を持っておくのがいいでしょう。GMT(世界標準時)とJST(日本標準時)の違いについても考慮するべきです。


次回予告

前回と今回でリソースとログのチェック方法を解説しました。それを利用して実際の運用状態をチェックしていかなければなりません。

と,いうわけで次回は「サービスの状態をチェックしよう」です。

(ASHマルチメディア研究会/joe,はしもと)