ログを開いたはいいものの、何万行もあって目が滑る——サーバー作業をしていると、そんな場面によく出くわします。
そこで私が真っ先に叩くのが head・tail・less の3つです。
ファイルの先頭を見る、末尾を見る、あとはページ送りでじっくり追う。
役割はこれだけなのに、この3つを知っているかどうかで調査の速さがまるで変わってくるのです。
今回は、明日からそのまま打てる形で最小限の使い方をまとめました。
head と tail の基本形
head はファイルの先頭、tail は末尾を表示するコマンドです。
どちらも何も指定しなければ 10行だけ出す、という共通の初期値を持っています。
head app.log
tail app.log
行数を変えたいときに使うのが -n というオプション。
head -n 3 app.log
tail -n 50 app.log
手元の環境(GNU coreutils 8.32)で100行のファイルに tail -n 3 を通したところ、98〜100行目の3行だけが返ってきました。
まず tail で末尾を見て、様子がおかしければ head で先頭に戻る——調査はだいたいこの往復から始まるのです。
tail -f で増え続けるログを追う
稼働中のアプリのログは、眺めている間にも行が増えていきます。
そこで -f を付けると、追記された分をそのまま流し続けてくれるのです。
tail -f app.log
止めたいときは Ctrl+C を押すだけ。
ただし -f には落とし穴があって、ログローテーションでファイルが差し替わると追跡が止まってしまいます。
-f は既定でファイル記述子を追いかける仕様なので、リネームされても古い実体のほうを見続けてしまうためです。
ローテーションを挟むログでは、名前を追う -F(–follow=name –retry と同じ意味)のほうが安全でしょう。
tail -F /var/log/syslog
行の途中だけを切り出す
「50行目あたりが見たい」というときは、head と tail をパイプでつなぎます。
head -n 52 app.log | tail -n 3
これで50〜52行目の3行だけが取り出せるという寸法。
数え方は + と – でも指定できて、こちらを覚えておくと端の除外がラクになるのです。
tail -n +98 app.log # 98行目以降をすべて
head -n -97 app.log # 末尾97行を除いた残り
上の2つはどちらも手元で実行し、期待どおり3行が返ることを確認しました。
less で腰を据えて読む
流し見では追いつかないときに開くのが less です。
less app.log
開いたあとは、キー操作だけでファイルの中を動き回れます。
- スペースで次ページ、b で前ページ
- /文字列 で検索、n で次のヒット、N で前のヒット
- G でファイル末尾、g で先頭
- q で終了
-N を付けると行番号が出るので、あとで「何行目」と共有したいときに助かります。
less -N app.log
grep の結果が多すぎて画面が流れてしまうときも、そのまま less に渡すのが定番でしょう。
grep -n "error" app.log | less
grep 側の基本オプションは、こちらの記事に書きました。
つまずきやすいポイント
-n の書き方は head -3 のような略記でも動きますが、-n 3 と書いておくほうが移植性が高くて安心です。
tail -f を本番サーバーで開きっぱなしにすると、うっかり端末を占有してしまいがち。
用が済んだら Ctrl+C で抜ける癖をつけておきましょう。
圧縮済みのログ(.gz)は、環境によって less がそのまま中身を表示できないことがあります。
その場合は zless を使うか、zcat から less へ渡せば同じように読めるのです。
zless app.log.gz
zcat app.log.gz | tail -n 20
最後に
head・tail・less は、先頭・末尾・じっくりの3点セットとして覚えてしまうのが早道です。
まず tail で今を見て、範囲を絞りたければ head と組み合わせ、腰を据えたくなったら less に渡す。
この順番が手に馴染むと、巨大なログを開くときの気持ちがだいぶ軽くなってくるはずです。
細かい挙動を確かめたいときは、tail(1) の man ページと GNU Coreutils の head invocation が一次情報として頼りになります。
以上です。










コメントを残す