Nginxは過去10分間のログを印刷します。ここで、nginxのタイムスタンプ形式は「time_iso8601」です。

Nginxは過去10分間のログを印刷します。ここで、nginxのタイムスタンプ形式は「time_iso8601」です。

目的:サーバーは現在時刻から過去10分間のnginx api_access.logを出力します。

私が試す方法:

nginx api_access.logのタイムスタンプを現在の時刻と比較してから、過去10分間のログを印刷してみました。

使用されたコマンド:

awk -F'["+]' -v d1="$(date --date '-10 min' '+%FT%T')" -v d2="$(date '+%FT%T')" '
  $4 > d1 && $4 <d2 || $4 ~ d2' api_access.log

Nginx api_access.log:

{"@timestamp":"2020-06-15T12:36:38+00:00","msec":1592224598.704,"remote_addr":xxx xxxx}
{"@timestamp":"2020-06-15T12:51:41+00:00","msec":1592225501.530,"remote_addr":xxx xxxx}

失敗する:

現在時刻を2020-06-15T12:36:38+00:00形式と比較できず、api_access.logから過去10分のログを印刷できません。

助けてください...

答え1

GNUを使用してawk日付をタイムスタンプに変換します。

awk -v d1="$(date -d '-10 min' '+%s')" -v d2="$(date '+%s')" -F'[-":,T+]' '
  { ts=mktime($5" "$6" "$7" "$8" "$9" "$10) }
  ts >= d1 && ts <= d2
  ts > d2{ exit 0 }
' api_access.log

現在の日付のタイムスタンプより大きいタイムスタンプが見つかると、最後の行はすぐにスクリプトを終了します。

関連情報