시간이 지남에 따라 로그 파일을 추적하는 방법은 무엇입니까?

시간이 지남에 따라 로그 파일을 추적하는 방법은 무엇입니까?

내 로그 파일(log.txt)이 다음과 같다고 가정해 보겠습니다.

2014-01-01 22:30:30 something happened....
2014-01-01 22:30:31 something happened....
2014-01-01 22:30:41 something happened....

이 파일을 추적하여 지난 시간의 로그를 표시하고 추적을 계속하고 싶습니다.

tail <some magic to specify last 1 hour> -f log.txt

그러면 출력은 다음과 같습니다.

2014-01-01 21:30:41 something happened....
...
2014-01-01 22:30:30 something happened....
2014-01-01 22:30:31 something happened....
2014-01-01 22:30:41 something happened....

이를 수행하는 도구가 있습니까?

답변1

oneliner에서 grep과 tail의 조합을 사용할 수 있습니다.

grep "2014-01-01 21:" log.txt; tail -f log.txt

해당 시간부터 시작하여 계속해서 모든 내용을 인쇄합니다.

또는 awk를 사용하여 특정 시간의 시작부터 파일 끝까지 모든 내용을 인쇄하고 그 이후에도 계속 추적할 수 있습니다. 이렇게 하면 필요한 경우 지난 몇 시간을 추적할 수 있습니다.

awk '/2014-01-01 21:/' log.txt; tail -f log.txt

답변2

onehourago=$(date --date='1 hours ago' +"%b%e %H:%M:%S") 
echo $onehourago | cat /var/log/auth.log - | sort | sed "1,/$onehourago/d"

sed 명령이 없는 중간 출력:

Aug  7 00:00:03 thinkpux CRON[25475]: pam_unix(cron:session): session closed for user stefan
Aug  7 00:17:01 thinkpux CRON[25504]: pam_unix(cron:session): session closed for user root
Aug  7 00:17:01 thinkpux CRON[25504]: pam_unix(cron:session): session opened for user root by (uid=0)
Aug 7 00:19:33
Aug  7 01:00:02 thinkpux CRON[25652]: pam_unix(cron:session): session opened for user stefan by (uid=0)
Aug  7 01:00:03 thinkpux CRON[25652]: pam_unix(cron:session): session closed for user stefan
Aug  7 01:17:01 thinkpux CRON[25885]: pam_unix(cron:session): session closed for user root
Aug  7 01:17:01 thinkpux CRON[25885]: pam_unix(cron:session): session opened for user root by (uid=0)

산출:

Aug  7 01:00:02 thinkpux CRON[25652]: pam_unix(cron:session): session opened for user stefan by (uid=0)
Aug  7 01:00:03 thinkpux CRON[25652]: pam_unix(cron:session): session closed for user stefan
Aug  7 01:17:01 thinkpux CRON[25885]: pam_unix(cron:session): session closed for user root
Aug  7 01:17:01 thinkpux CRON[25885]: pam_unix(cron:session): session opened for user root by (uid=0)

참고: 먼저 +"%b %e %H:%M:%S"로 날짜를 구성했습니다(%b와 %e 사이의 공백에 유의하세요. 그러나 echo는 두 공백을 하나로 압축합니다. sed를 통해 검색하는 것은 다음과 같습니다. 두 개의 공백이 있고 표현식이 없으므로 월의 날짜가 두 자리인지 한 자리인지 구별하는 것은 복잡하지만 정렬은 추가/누락된 공백에 무관한 것으로 보이며 압축을 방지하기 위한 bash 스위치가 있을 수 있습니다. ? 하지만 날짜 형식이 다르기 때문에 영향을 받지는 않지만 어떻게든 이 접근 방식을 테스트해야 하며 학습자도 같은 함정에 빠질 수 있습니다.

따라서 일반적인 아이디어는 1시간 전의 날짜/시간을 가져오고 로그 파일에서와 같이 형식을 지정하고 로그 파일에 순수 날짜를 추가하고 혼합물을 정렬한 다음 sed를 사용하여 순수 날짜 이전의 항목을 제거하는 것입니다. 콘텐츠.

기억하고 입력하는 것은 재미없지만 스크립트 및/또는 함수에 넣을 수 있습니다.

답변3

tail -f다음의 조합을 사용할 수 있습니다 perl.

# Tail with timestamp
tail -f log.txt | perl -pe '$_ = localtime.": $_"'

그러면 터미널에 다음과 같은 출력이 제공됩니다.

타임스탬프 후행 #1 타임스탬프 #2로 후행

다음과 같이 이 표준 출력을 파일에 저장할 수도 있습니다.

tail -f log.txt | perl -pe '$_ = localtime.": $_"' >> timestamped_log.txt

이것이 해결책을 제공하기를 바랍니다.

답변4

  • grepor의 문제 awk는 항상 전체 파일을 읽고 각 줄을 확인해야 한다는 것입니다.
  • 문제 tail는 얼마나 많은 행이 필요한지 모른다는 것입니다.

그러니 시험해보고 tac사용해 awk보세요 tail -f.-n0

tac file \
  | awk -F'[- :]' -v datefilter="$(date -d -1hour +%s)" 'mktime($1 OFS $2 OFS $3 OFS $4 OFS $5 OFS $6) < datefilter {exit} 1' \
  | tac
tail -f -n0

(두 명령 사이에 새로운 줄이 있으면 그 줄을 잃을 수도 있습니다.)

관련 정보