ログから答えを取り出す
目標
ログファイル1つを使って、質問をコマンドに置き換える訓練をします。/opt/lab/data/app.log は IP 날짜 메서드 경로 상태코드 [ERROR](IP、日付、メソッド、パス、ステータスコード、[ERROR])の形式で、480行です。
なぜ重要なのか
障害の状況で必要なのは、ログビューアではなく、質問をパイプラインに置き換える力です。「何がいちばん多いか」という質問には、ほぼいつも sort | uniq -c | sort -rn | head という1つの慣用句で答えられます。uniq -c が隣り合った重複だけを数えるため前の sort が必須であること、パイプでつながれたコマンドがそれぞれ別のプロセスで同時に流れるため、巨大なファイルもメモリに載せずに処理できること。この2点が、この慣用句が速い理由です。
ステップ
ERRORを含む行の数を、数字だけで/root/error_count.txtに書いてください。- 最も多く現れた IP をひとつ、
/root/top_ip.txtに書いてください。 - ステータスコードが
500の行だけをそのまま/root/five_hundreds.txtに保存してください。 - 現れる一意のパス(4番目のフィールド)の一覧を、1行に1つずつ
/root/paths.txtに保存してください。 - ステータスコードごとの件数を
코드 개수(コード、件数)の形式で、コードの昇順に3行、/root/status_counts.txtに保存してください。 - リクエスト数の上位3つのパスを
경로 개수(パス、件数)の形式で、件数の降順に3行、/root/top3_paths.txtに保存してください。 - 200 以外の応答の割合を小数点以下1桁まで、% 記号なしで
/root/error_rate.txtに書いてください。 /root/report.txtに次の3行を、この順序で作ってください。total=<전체 줄 수>(全体の行数)errors=<200 이 아닌 줄 수>(200 以外の行数)top_path=<가장 많이 요청된 경로>(最も多くリクエストされたパス)
参考
awk '{print $4}' 파일で、4番目のフィールドだけを取り出せます。- 割合は
awk '{t++; if ($5 != 200) e++} END {printf "%.1f\n", e*100/t}'のように、END ブロックで計算します。 - よくあるミス1:
uniq -cの前にsortを入れ忘れると、隣り合ったものだけを数えて結果がおかしくなります。 - よくあるミス2: 3番で
grep 500を使うと、IP やほかのフィールドに 500 が含まれる行まで引っかかります。フィールドを指定してください。
ERROR の行を数える
ERROR を含む行の数を、数字だけで /root/error_count.txt に書いてください。
選ぶツールと数えるツールをパイプでつないでください。grep には件数だけを数えるオプションもあります。
最も多くリクエストした IP
最も多く現れた IP をひとつ、/root/top_ip.txt に書いてください。
1番目のフィールドを取り出し、sort | uniq -c | sort -rn の順につないでください。uniq -c は隣り合った重複だけを数えます。
500 の応答だけを取り出す
ステータスコードが 500 の行だけをそのまま /root/five_hundreds.txt に保存してください。
ステータスコードは5番目のフィールドです。文字列で grep すると、ほかのフィールドに含まれる 500 まで引っかかることがあります。
一意のパスの一覧
現れる一意のパス(4番目のフィールド)の一覧を、1行に1つずつ /root/paths.txt に保存してください。
パスは4番目のフィールドです。重複を除くオプションが、sort にすでにあります。
ステータスコードごとの集計
ステータスコードごとの件数を 코드 개수(コード、件数)の形式で、コードの昇順に3行、/root/status_counts.txt に保存してください。
「コード 件数」の形式で、コードの昇順の3行です。awk の連想配列と END ブロックを使うか、sort|uniq -c を組み合わせてください。
リクエストの多いパス TOP 3
リクエスト数の上位3つのパスを 경로 개수(パス、件数)の形式で、件数の降順に3行、/root/top3_paths.txt に保存してください。
「パス 件数」の形式です。uniq -c の出力は「件数 値」の順なので、最後に順序を入れ替える必要があります。
エラー率を計算する
200 以外の応答の割合を小数点以下1桁まで、% 記号なしで /root/error_rate.txt に書いてください。
全体の行数と、200 以外の行数の両方が必要です。awk の END ブロックで一度に計算すれば、ファイルを2回読まなくて済みます。
要約レポートを作る
/root/report.txt に次の3行を、この順序で作ってください。
total=<전체 줄 수>(全体の行数)errors=<200 이 아닌 줄 수>(200 以外の行数)top_path=<가장 많이 요청된 경로>(最も多くリクエストされたパス)
前のステップで求めた値をまとめて、3行にしてください。形式と順序が正確でなければなりません。