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

현재 날짜의 타임스탬프보다 큰 타임스탬프가 발견되면 마지막 줄은 즉시 스크립트를 종료합니다.

관련 정보