2011-10-09 18 views
27

पर आधारित लॉग फ़ाइल प्रविष्टियां मेरे सर्वर में असामान्य रूप से उच्च CPU उपयोग है, और मैं देख सकता हूं कि अपाचे बहुत अधिक मेमोरी का उपयोग कर रहा है। मुझे एहसास है, मुझे एक आईपी द्वारा डॉस किया जा रहा है - शायद आप उसे ढूंढने में मेरी मदद कर सकते हैं?दिनांक सीमा

मैं 10 सबसे "सक्रिय" आईपी पता लगाने के लिए निम्न पंक्ति का उपयोग किया है,:

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

शीर्ष 5 आईपी सर्वर के लिए के रूप में कई अनुरोधों के बारे में 200 गुना है, "औसत" उपयोगकर्ता के रूप में । हालांकि, मुझे पता नहीं चल सकता है कि क्या ये 5 बहुत ही आगंतुक हैं, या वे सर्वर पर हमला कर रहे हैं।

उपरोक्त खोज को समय अंतराल में निर्दिष्ट करने के लिए कोई तरीका है, उदाहरण के लिए। पिछले दो घंटे या आज 10-12 के बीच?

चीयर्स!

अपडेट किया गया 23 OCT 2011 - आदेशों मैं की जरूरत:

पिछले एक्स घंटे [यहाँ दो घंटे] के भीतर प्रविष्टियों जाओ

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

प्राप्त पिछले एक्स घंटे [यहाँ दो के भीतर सबसे अधिक सक्रिय आईपी घंटे]

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 

प्राप्त पूर्ण समय के दौरान सबसे अधिक सक्रिय आईपी

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

मैं आलसी हूं; मैं लॉग को Excel में कॉपी करता हूं और एक पिवट टेबल बना देता हूं ... – Ben

+0

@बेन "अब आपके पास दो समस्याएं हैं।" – tripleee

उत्तर

29

हाँ, वहाँ यह करने के लिए कई तरीके हैं। यहां बताया गया है कि मैं इसके बारे में कैसे जाऊंगा। स्टार्टर्स के लिए, बिल्ली के आउटपुट को पाइप करने की कोई ज़रूरत नहीं है, बस 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

तो क्या मैं कर रहा हूँ पहले दो घंटे की प्रारूपित मान भंडारण और क्षेत्र चार के खिलाफ तुलना कर रहा है। सशर्त अभिव्यक्ति सीधे आगे होनी चाहिए। मैं उस तारीख को प्रिंट कर रहा हूं, उसके बाद आउटपुट फील्ड सेपरेटर (ओएफएस - या इस मामले में स्थान) के बाद पूरी लाइन $ 0 के बाद। आप अपने पिछले अभिव्यक्ति इस्तेमाल कर सकते हैं और सिर्फ $ 1 (आईपी पते) प्रिंट

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

आप एक अवधि दो समय चर निर्दिष्ट करें और उचित रूप से आपकी अभिव्यक्ति का निर्माण का उपयोग करना चाहता है।

इसलिए यदि आप पहले अपने अभिव्यक्ति हो सकता है 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

एक आखिरी बात। मैं एकाधिक लॉग फ़ाइलों के माध्यम से कैसे खोज करूं? मैं खोजने और xargs के साथ प्रयास कर रहा हूं लेकिन अभी भी कोई भाग्य नहीं है: ढूंढें -नाम 'access.log' | awk -vDate = 'date -d '13: 20 '+ [% d /% b /% वाई:% एच:% एम:% एस' -vDate2 =' date -d'13: 40' + [% d/% बी /% वाई:% एच:% एम:% एस' '{अगर ($ 4> दिनांक और $ 4 <दिनांक 2) प्रिंट $ 1}' xargs | सॉर्ट | uniq -c | sort -n | पूंछ – sqren

1

इस के रूप में एक आम कार्य

है और क्योंकि यह extract last 10 minutes from 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; 
    }; 
}; 

इस तरह इस्तेमाल किया जा सकता:

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

मुद्रण लॉग के लिए 09h18 और 09h24 के बीच

और क्योंकि मैं उन्हें जरूरत है, मैं (जल्दी से) यह लिखा।

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

तक अब से january 23th, 9h18'12" मुद्रण के लिए।

आदेश पर्ल कोड को कम करने में, मैं -s स्विच का उपयोग किया है कमांडलाइन से चर के ऑटो assignement की अनुमति के लिए: -s=09:18 से स्थापित हो जाएगा एक चर $s जो 09:18 शामिल होंगे। बराबर चिह्न = और कोई रिक्त स्थान याद करने की देखभाल न करें!

नोटा: यह दो अलग अलग लॉग मानक के लिए regex के दो diffent तरह पकड़ो। आप अलग अलग तिथि/समय प्रारूप पार्स की आवश्यकता है, या तो अपने स्वयं regex पोस्ट करने या अपने लॉगफ़ाइल

^(\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

से स्वरूपित तारीख का एक नमूना पोस्ट कोई awk: invalid -v option साथ सामना करना पड़ता है, तो यहां एक में सबसे अधिक सक्रिय आईपी प्राप्त करने के लिए एक स्क्रिप्ट है पूर्वनिर्धारित समय सीमा:

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 
संबंधित मुद्दे