2011-10-09 2 views
27

내 서버의 CPU 사용량이 비정상적으로 많아서 Apache가 너무 많은 메모리를 사용하고있는 것을 볼 수 있습니다. 나는 하나의 IP 주소로 DOS를하고 있다고 느끼고 있습니다. 아마 그를 찾을 수있게 도와 줄 수 있습니까? 은 "평균"사용자로, 상위 5 IP를 서버에 약 200 배 많은 요청이날짜 범위를 기준으로 로그 파일 항목 필터링

cat access.log | awk '{print $1}' |sort |uniq -c |sort -n |tail 

:

나는 10 대 "활성"IP를 찾기 위해, 다음 줄을 사용했습니다 . 그러나, 나는이 방문자가 단지 아주 빈번한 방문자인지 또는 서버를 공격 하는지를 알 수 없다.

위의 검색을 시간 간격으로 지정하는 방법이 있습니까 (예 : 지난 2 시간 또는 오늘 10-12시 사이?

건배!

2011 10월 23일 업데이트 - 명령은 내가 필요 :

마지막 X 시간 [여기에 두 시간]에서 항목을 가져

awk -vDate=`date -d'now-2 hours' +[%d/%b/%Y:%H:%M:%S` ' { if ($4 > Date) print Date FS $4}' access.log 

가져 오기 여기에 마지막 X 시간 [이 내 가장 활발한 IP를 시간]

awk -vDate=`date -d'now-2 hours' +[%d/%b/%Y:%H:%M:%S` ' { if ($4 > Date) print $1}' access.log | sort |uniq -c |sort -n | tail 

는 상대적으로 시간 범위

를 내 항목을 가져 오기
awk -vDate=`date -d'now-4 hours' +[%d/%b/%Y:%H:%M:%S` -vDate2=`date -d'now-2 hours' +[%d/%b/%Y:%H:%M:%S` ' { if ($4 > Date && $4 < Date2) print Date FS Date2 FS $4}' access.log 

받기 절대 시간 범위 내에서 항목

awk -vDate=`date -d '13:20' +[%d/%b/%Y:%H:%M:%S` -vDate2=`date -d'13:30' +[%d/%b/%Y:%H:%M:%S` ' { if ($4 > Date && $4 < Date2) print $0}' access.log 

가져 오기 절대 시간 범위 내에서 가장 활동적인 IP를

awk -vDate=`date -d '13:20' +[%d/%b/%Y:%H:%M:%S` -vDate2=`date -d'13:30' +[%d/%b/%Y:%H:%M:%S` ' { if ($4 > Date && $4 < Date2) print $1}' access.log | sort |uniq -c |sort -n | tail 
+1

나는 게으르다. 나는 로그를 엑셀로 복사하고 피봇 테이블을 생성합니다 ... – Ben

+0

@Ben "이제 두 가지 문제가 있습니다." – tripleee

답변

29

예,이 작업을 수행하는 여러 가지 방법이 있습니다. 여기 내가 어떻게 이것에 대해 갈 것 인가입니다. 처음에는 cat 출력물을 파이프 할 필요가 없습니다. 로그 파일을 awk으로 열면됩니다.

awk -vDate=`date -d'now-2 hours' +[%d/%b/%Y:%H:%M:%S` '$4 > Date {print Date, $0}' access_log 

로그 내 보이는 가정 날짜 필드 4에 저장되고 괄호보다 (그들은 구성 할 수있어). 내가 위에서 한 일은 지난 2 시간 안에 모든 것을 찾아내는 것입니다. Note the -d'now-2 hours' 또는 글자 그대로 2 시간을 마이너스로 변환했습니다. 다음과 같이 보입니다. [10/Oct/2011:08:55:23

2 시간 전에 형식화 된 값을 저장하고 필드 4와 비교하면됩니다. 조건부 표현식은 직선적이어야합니다. 그런 다음 출력 필드 구분 기호 (이 경우 OFS - 또는 공백) 다음에 전체 줄 $ 0이 오는 날짜를 인쇄합니다. 당신이 범위는 두 개의 날짜 변수를 지정하고 적절하게 표현을 구축 사용하고 싶다면 당신은

awk -vDate=`date -d'now-2 hours' +[%d/%b/%Y:%H:%M:%S` '$4 > Date {print $1}' | sort |uniq -c |sort -n | tail 

이전 식을 사용하고 다만 $ 1 (IP 주소)를 인쇄 할 수 있습니다. 당신이 당신의 표현의 힘 전 2-4hrs 사이에 뭔가를 찾을 수 있습니까 원한다면

그래서 나는 당신이 도움이 될 수 떠들썩한 파티의 날짜에 대한 대답 질문은 다음이

awk -vDate=`date -d'now-4 hours' +[%d/%b/%Y:%H:%M:%S` -vDate2=`date -d'now-2 hours' +[%d/%b/%Y:%H:%M:%S` '$4 > Date && $4 < Date2 {print Date, Date2, $4} access_log' 

같이 보입니다.이 같이 Print date for the monday of the current week (in bash)

+0

고마워요! 훌륭한 설명과 훌륭한 예. 나는 나의 구체적인 필요에 맞게 코드를 정교하게 만들고 나중에 필요할 때 자신과 다른 사람들을 위해 나중에 참조 할 수 있도록 원래의 질문에 추가했습니다. – sqren

+0

도움이 될 수있어 기쁩니다. – matchew

+0

마지막으로 한 가지. 여러 로그 파일을 검색하려면 어떻게합니까? find와 xargs를 시도했지만 여전히 운이 없다 : find -name 'access.log'| awk -vDate ='date -d '13 : 20 '+ [% d/% b/% Y : % H : % M : % S' -vDate2 ='date -d'13 : 40'+ [% d/% b/% Y : % H : % M : % S' '{if ($ 4> Date && $ 4 sqren

1

일반적인 작업

입니다 그리고 이것은 extract last 10 minutes from logfile보다 정확히 동일하지 않기 때문에이 로그 파일의 끝 개까지의 시간에 대한 무리는 어디. 09h18 및 09h24 사이에 인쇄 로그를

./timelapsinlog.pl -s=09:18 -e=09:24 /path/to/logfile 

:

#!/usr/bin/perl -ws 
# This script parse logfiles for a specific period of time 

sub usage { 
    printf "Usage: %s -s=<start time> [-e=<end time>] <logfile>\n"; 
    die $_[0] if $_[0]; 
    exit 0; 
} 

use Date::Parse; 

usage "No start time submited" unless $s; 
my $startim=str2time($s) or die; 

my $endtim=str2time($e) if $e; 
$endtim=time() unless $e; 

usage "Logfile not submited" unless $ARGV[0]; 
open my $in, "<" . $ARGV[0] or usage "Can't open '$ARGV[0]' for reading"; 
$_=<$in>; 
exit unless $_; # empty file 
# Determining regular expression, depending on log format 
my $logre=qr{^(\S{3}\s+\d{1,2}\s+(\d{2}:){2}\d+)}; 
$logre=qr{^[^\[]*\[(\d+/\S+/(\d+:){3}\d+\s\+\d+)\]} unless /$logre/; 

while (<$in>) { 
    /$logre/ && do { 
     my $ltim=str2time($1); 
     print if $endtim >= $ltim && $ltim >= $startim; 
    }; 
}; 

이 같이 사용될 수있다 : 내가 그들을 필요로했기 때문에

는, 나는 (빠르게)이 썼다. 지금 개까지 january 23th, 9h18'12"에서 인쇄

./timelapsinlog.pl -s='2017/01/23 09:18:12' /path/to/logfile 

. 펄 코드를 줄이기 위해

, 나는 명령 행에서 변수의 자동 assignement을 허용 -s 스위치를 사용했습니다 : -s=09:18 변수 $s 느릅 나무가 09:18 포함됩니다 웁니다. 공손한 등반 기호 =을 놓치지 마세요.

의 Nota :이 두 개의 서로 다른 로그 표준에 대한 정규식 두 diffent 종류를 누르고 있습니다. 당신이 다른 날짜/시간 형식 구문 분석이 필요한 경우 중 하나를 자신의 정규식을 게시하거나 누군가가 awk: invalid -v option으로 발생하는 경우 로그 파일

^(\S{3}\s+\d{1,2}\s+(\d{2}:){2}\d+)   # ^Jan 1 01:23:45 
^[^\[]*\[(\d+/\S+/(\d+:){3}\d+\s\+\d+)\] # ^... [01/Jan/2017:01:23:45 +0000] 
+0

아주 좋은 답장, 나는 루프에 이것을 추가했고, 나는 서버에서 일어난 일을 쉽게 조사 할 수있다. – user322049

1

에서 포맷 된 날짜의 샘플을 게시, 여기에서 가장 활성화 된 IP를 얻을 수있는 스크립트입니다 미리 정의 된 시간 범위 :

cat <FILE_NAME> | awk '$4 >= "[04/Jul/2017:07:00:00" && $4 < "[04/Jul/2017:08:00:00"' | awk '{print $1}' | sort -n | uniq -c | sort -nr | head -20 
관련 문제