ログ全体を開かずに時間帯を絞り込む
数GBを超えるテキストログをエディタで開こうとすると、メモリを大量に消費してサーバーの操作が重くなることがあります。障害調査では「この時間帯に何が起きたか」さえわかれば十分なケースがほとんどです。ファイル全体を扱うのではなく、必要な時間帯の行だけを先に切り出してから調べると、操作が軽くなり見落としも減ります。
この記事では、タイムスタンプ付きのテキストログから特定の時刻範囲の行だけを抽出する手順を説明します。対象は各行の先頭付近に日時が含まれる形式のログファイルです。
まずタイムスタンプの形式を確認する
抽出方法はタイムスタンプの形式によって変わります。作業を始める前に、先頭数行を表示して形式を確かめてください。
head -5 /path/to/application.log
よく見かける形式は次の2種類です。
- ISO 8601 形式:
2024-10-26 10:23:45のように年月日が数字で並ぶ - syslog 形式:
Oct 26 10:23:45のように月が英字略称になる
ISO 8601 形式は文字列の辞書順と時刻の昇順が一致するため、後述の awk による比較がそのまま使えます。以降の手順は ISO 8601 形式を前提に説明します。syslog 形式の場合は、月の略称を数値に変換するひと手間が必要です。
grep で特定の時間帯を絞り込む
切り出したい範囲が「ある時・分単位」に収まるなら、grep で十分対応できます。たとえば 10:00〜10:59 の行をまとめて抽出するには次のようにします。
grep "^2024-10-26 10:" /path/to/application.log
行頭を ^ で固定しておくと、ログ本文中に同じ文字列が含まれていても誤一致を防げます。結果はリダイレクトでファイルに保存しておくと、その後の調査に使い回せます。
grep "^2024-10-26 10:" /path/to/application.log > /tmp/extracted.log
10時台と11時台をまとめて取り出したい場合は、-E オプションで正規表現を使います。
grep -E "^2024-10-26 1[01]:" /path/to/application.log > /tmp/extracted.log
grep は「時・分」の単位まで絞れますが、「10:15:00 から 10:45:00 まで」のように秒単位で境界を指定したいときは次の awk を使う方法が適しています。
awk で開始時刻・終了時刻を指定して切り出す
ISO 8601 形式のタイムスタンプは辞書順比較で時刻の大小が判定できます。awk の文字列比較を使うと、開始と終了を秒単位で指定して抽出できます。
awk '$0 >= "2024-10-26 10:15:00" && $0 <= "2024-10-26 10:45:00"' /path/to/application.log
$0 は行全体を指します。行の先頭がタイムスタンプになっている形式であれば、このまま時刻範囲で絞り込めます。
ログが大量で処理に時間がかかる場合は、終了時刻を過ぎた時点でファイルの読み込みを打ち切ると速くなります。
awk '$0 > "2024-10-26 10:45:00" {exit} $0 >= "2024-10-26 10:15:00"' /path/to/application.log
結果をファイルに保存するにはリダイレクトを追加します。
awk '$0 >= "2024-10-26 10:15:00" && $0 <= "2024-10-26 10:45:00"' /path/to/application.log > /tmp/extracted.log
抽出結果を確認する
切り出したファイルの先頭と末尾を確認すると、意図した範囲で抽出できているかを確かめられます。
head -3 /tmp/extracted.log
tail -3 /tmp/extracted.log
行数も合わせて確認しておくと、件数の見当が付きます。
wc -l /tmp/extracted.log
行数が 0 だった場合は、次のつまずきポイントを確認してください。
よくあるつまずき
日付と時刻の区切りが「T」になっている
ISO 8601 の厳密な形式は 2024-10-26T10:15:00 のように日付と時刻を T でつなぎます。ファイルによってはこの形式が使われているため、比較文字列の側も "2024-10-26T10:15:00" の形式に合わせてください。
行頭にタイムスタンプが来ない形式になっている
フレームワークによっては、ログレベルやスレッド名がタイムスタンプより前に出力されることがあります。その場合、$0 全体との比較は意図どおりに動きません。head でフィールドの位置を確認し、タイムスタンプが何列目にあるかを特定してから、$2 や $3 など対象フィールドを指定して比較するよう書き換えてください。
日付をまたぐ範囲を指定したい
23:50:00 から翌 00:10:00 のように日付をまたぐ場合でも、ISO 8601 形式であれば日付ごと文字列比較の対象になるため問題なく動作します。"2024-10-26 23:50:00" から "2024-10-27 00:10:00" のように、日付部分も含めて正確に記述してください。
タイムゾーン情報が付いていて一致しない
2024-10-26 10:15:00+09:00 のようにタイムゾーンオフセットが付いている場合、パターンがずれて grep や awk の比較が機能しません。head で実際の形式を確認し、比較文字列やパターンをその形式に揃えてください。それでも難しい場合は、sed でオフセット部分を除去してから処理する方法もあります。
「コマンドは打てる。次は"現場で通用する型"を最短で身につけたい」——そんなあなたへ。
ネットの断片的なTipsをコピペするだけでは、体系的な運用スキルはなかなか積み上がりません。リナックスマスター.JPの無料メルマガ「リナマガ」では、現場で実際に使うLinuxサーバー運用の考え方を、順を追って実務目線でお届けしています。いま登録された方には、安全なサーバー構築の「型」をまとめた『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼント中です。
>> 図解60P『Linux入門マニュアル』を無料で受け取る
(メルマガ登録は10秒・いつでも解除OK)
※ 「独学の時間がもったいない」「プロから現場の技術を最短で学びたい」という本気の方には、2日で実務レベルが身につく初心者向けハンズオンセミナーもご用意しています。
