क्या आपके पास अपाचे लॉग को पार्स करने के लिए कोई उपयोगी awk और grep स्क्रिप्ट है? [बन्द है]


69

मैं लॉग एनालाइज़र का उपयोग कर सकता हूं, लेकिन अक्सर मुझे यह देखने के लिए हाल के वेब लॉग को पार्स करने की आवश्यकता है कि इस समय क्या हो रहा है।

मैं कभी-कभी शीर्ष 10 ips का पता लगाने के लिए चीजें करता हूं जो एक निश्चित फ़ाइल का अनुरोध करता है

cat foo.log | grep request_to_file_foo | awk '{print $1}' |  sort -n | uniq -c | sort -rn | head

आपके टूलबॉक्स में क्या है?


1
मेरे पास वास्तव में यह बड़ा सुंदर रेक्स था जिसे मैंने अपने सभी अपाचे कस्टम लॉग को डेटाबेस में प्रस्तुत करने के लिए व्यक्तिगत क्षेत्रों में पार्स करने के लिए हाथ से लिखा था। मैं अपने आप को लात मार रहा हूं कि मेरे पास अब नहीं है। यह एक लाइनर था; आपको प्रत्येक लॉग एलिमेंट के लिए एक वैरिएबल दिया गया - फिर मैं MySQL में इंसर्ट कर रहा था। अगर मुझे लगता है कि मैं इसे यहाँ पोस्ट करूँगा।
काइल हॉजसन

जवाबों:


54

तुम अकेले के साथ Apache लॉग फ़ाइलों के साथ बहुत ज्यादा कुछ भी कर सकते हैं। अपाचे लॉग फाइलें मूल रूप से व्हाट्सएप से अलग हो गई हैं, और आप कॉलम नंबर द्वारा रुचि रखने वाले उद्धरणों को मौजूद नहीं होने का दिखावा कर सकते हैं। यह केवल तभी टूटता है जब आपके पास संयुक्त लॉग प्रारूप होता है और उपयोगकर्ता एजेंटों में रुचि रखते हैं, जिस बिंदु पर आपको विभाजक के रूप में उद्धरण (") का उपयोग करना होगा और एक अलग awk कमांड चलाना होगा। निम्नलिखित आपको आईपी दिखाएगा। प्रत्येक उपयोगकर्ता जो हिट की संख्या के आधार पर अनुक्रमित पेज का अनुरोध करता है:

awk -F'[ "]+' '$7 == "/" { ipcount[$1]++ }
    END { for (i in ipcount) {
        printf "%15s - %d\n", i, ipcount[i] } }' logfile.log

$ 7 अनुरोधित url है। आप शुरुआत में जो भी शर्तें चाहें जोड़ सकते हैं। जो भी जानकारी आप चाहते हैं, उसके साथ '$ 7 == "/" बदलें।

यदि आप $ 1 को (ipcount [$ 1] ++) प्रतिस्थापित करते हैं, तो आप परिणामों को अन्य मानदंडों द्वारा समूहित कर सकते हैं। $ 7 का उपयोग करके दिखाया जाएगा कि कौन से पृष्ठ एक्सेस किए गए हैं और कितनी बार। बेशक तब आप शुरुआत में ही हालत बदलना चाहेंगे। निम्नलिखित दर्शाएगा कि किसी विशिष्ट IP के उपयोगकर्ता द्वारा कौन से पृष्ठ एक्सेस किए गए थे:

awk -F'[ "]+' '$1 == "1.2.3.4" { pagecount[$7]++ }
    END { for (i in pagecount) {
        printf "%15s - %d\n", i, pagecount[i] } }' logfile.log

आप क्रम में परिणाम प्राप्त करने के लिए सॉर्ट के माध्यम से आउटपुट को पाइप कर सकते हैं, या तो शेल कमांड के हिस्से के रूप में, या खुद ही awk script में भी:

awk -F'[ "]+' '$7 == "/" { ipcount[$1]++ }
    END { for (i in ipcount) {
        printf "%15s - %d\n", i, ipcount[i] | sort } }' logfile.log

यदि आप अन्य जानकारी का प्रिंट करने के लिए awk स्क्रिप्ट का विस्तार करने का निर्णय लेते हैं, तो उत्तरार्द्ध उपयोगी होगा। यह सब एक बात है जिसे आप जानना चाहते हैं। आपको जो कुछ भी रुचि है उसके लिए एक प्रारंभिक बिंदु के रूप में काम करना चाहिए।


यह हमेशा पागल लंबी बिल्ली / grep / awk पाइपलाइनों को देखने के लिए अजीब लगता है। एक बार जब आप जाग रहे हों, तो आमतौर पर यह पर्याप्त होता है। मूल पोस्ट के पहले तीन खंडों को तुच्छ रूप से "awk '/ request_to_file_foo / {प्रिंट $ 1}' foo.log" के रूप में लिखा जा सकता है। awk एक फाइल को इनपुट के रूप में ले सकता है, और यह जानने के लिए कि किस लाइन की देखभाल करने के लिए regex का उपयोग कर सकते हैं।
Zac थॉम्पसन

सुरुचिपूर्ण और सरल। अच्छा।
ओलिवियर दुलक

खबरदार, "ऑक्टेस्सर" (3 डी) क्षेत्र में रिक्त स्थान की अनुमति दी गई है, जो सब कुछ तोड़ देता है, और मुझे व्यक्तिगत रूप से लगता है कि इसे निषिद्ध किया जाना चाहिए, हमें ऐसा करने की अनुमति देने के लिए ;-)
मंदार

23

एक चीज़ जो मैंने कभी किसी और को नहीं देखी, उन कारणों से, जिनकी मैं कल्पना नहीं कर सकता, अपाचे लॉग फ़ाइल प्रारूप को अधिक आसानी से पार्स करने योग्य संस्करण को उस जानकारी के साथ बदलना है जो वास्तव में आपके लिए मायने रखती है।

उदाहरण के लिए, हम कभी भी HTTP बेसिक नॉर्थ का उपयोग नहीं करते हैं, इसलिए हमें उन फ़ील्ड को लॉग इन करने की आवश्यकता नहीं है। मुझे इस बात में दिलचस्पी है कि प्रत्येक अनुरोध को कब तक पूरा करना है, इसलिए हम इसे जोड़ेंगे। एक परियोजना के लिए, हम यह भी जानना चाहते हैं कि (हमारे लोड बैलेंसर पर) यदि कोई सर्वर दूसरों की तुलना में धीमी गति से अनुरोध कर रहा है, तो हम उसका नाम लेते हैं जिस सर्वर पर हम वापस जा रहे हैं।

यहाँ एक सर्वर के अपाचे विन्यास का एक अंश दिया गया है:

# We don't want to log bots, they're our friends
BrowserMatch Pingdom.com robot

# Custom log format, for testing
#
#         date          proto   ipaddr  status  time    req     referer         user-agent
LogFormat "%{%F %T}t    %p      %a      %>s     %D      %r      %{Referer}i     %{User-agent}i" standard
CustomLog /var/log/apache2/access.log standard env=!robot

जो आप वास्तव में नहीं बता सकते हैं वह यह है कि प्रत्येक क्षेत्र के बीच एक शाब्दिक टैब वर्ण (\ t) है। इसका मतलब यह है कि अगर मैं पायथन में कुछ विश्लेषण करना चाहता हूं, तो संभवत: गैर-200 स्थिति दिखाएगा, मैं यह कर सकता हूं:

for line in file("access.log"):
  line = line.split("\t")
  if line[3] != "200":
    print line

या अगर मैं करना चाहता था 'कौन छवियों को गर्म कर रहा है?' यह होगा

if line[6] in ("","-") and "/images" in line[5]:

एक्सेस लॉग में IP काउंट के लिए, पिछला उदाहरण:

grep -o "[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}" logfile | sort -n | uniq -c | sort -n

कुछ इस तरह हो जाता है:

cut -f 3 log | uniq -c | sort -n

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

cut -f 8 log | uniq -c | sort -n

बिल्कुल ऊपर के समान। वास्तव में, कोई भी सारांश जो आप करना चाहते हैं वह अनिवार्य रूप से बिल्कुल एक जैसा है।

पृथ्वी पर क्यों मैं अपने सिस्टम के सीपीयू को awk और grep पर खर्च करूँगा जब कटौती वास्तव में वही होगी जो मुझे तीव्रता के आदेश चाहिए?


2
नए प्रारूप के लिए आपके उदाहरण वास्तव में अभी भी ओवर-कंप्लिकेटेड हैं - आईपी मायने रखता है cut -f 3 log | uniq -c | sort -n, उपयोगकर्ता एजेंट cut -f 8 log | uniq -c | sort -n
Creshal

आप सही कह रहे हैं, यह सरल है। मैंने उस उदाहरण को दर्शाने के लिए अपडेट किया है।
दान उदित

"बिल्ली फ़ाइल | grep स्ट्रिंग" बेकार है, "grep स्ट्रिंग फ़ाइल" क्यों नहीं?
c4f4t0r

2
मेरे पास कोई बहाना नहीं है, और उदाहरण के अनुसार अपडेट किया है।
दान उदेय

15

जाग और भटकाव के बारे में भूल जाओ। की जाँच करें asql । जब आप लॉगफ़ाइल को क्वेरी करने के लिए सिंटैक्स जैसे sql का उपयोग कर सकते हैं तो अपठनीय स्क्रिप्ट क्यों लिखें। उदाहरण के लिए।

asql v0.6 - type 'help' for help.
asql> load /home/skx/hg/engaging/logs/access.log
Loading: /home/skx/hg/engaging/logs/access.log
sasql> select COUNT(id) FROM logs
46
asql> alias hits SELECT COUNT(id) FROM logs
ALIAS hits SELECT COUNT(id) FROM logs
asql> alias ips SELECT DISTINCT(source) FROM logs;
ALIAS ips SELECT DISTINCT(source) FROM logs;
asql> hits
46
asql> alias
ALIAS hits SELECT COUNT(id) FROM logs
ALIAS ips SELECT DISTINCT(source) FROM logs;

दिलचस्प है, लेकिन आप समस्याओं में भाग सकते हैं यदि आपके लॉग विशेष रूप से बड़े हैं तो मुझे लगता है। साथ ही यह कस्टम लॉग फॉर्मेट का कितना अच्छा सामना करता है?
वाग्नेर

मैं इस समय कोशिश कर रहा हूं, लोड समय इतना धीमा है (कम से कम संस्करण 0.9 में)। लोड हो रहा है 200Mb लॉग यह पाँच मिनट से अधिक समय ले रहा है ..
aseques

मुझे कहना होगा कि लोड समय के बाद (इसमें लगभग 15 मिनट लगते हैं) इस प्रोग्राम का सिंटेक्स बहुत अच्छा है, आप इसके द्वारा सॉर्ट, काउंट और ग्रुप कर सकते हैं। बहुत अच्छे।
असमानता

Apache HTTPD में एक विधि है जिसके साथ आप प्रभावी रूप से डेटाबेस में लॉग भेज सकते हैं। हां, लिखते हैं कि लंबे समय तक हो सकता है, लेकिन एक लड़ी पिरोया प्रॉक्सी बीच में ही सही सही काम कर सकता है। किसी भी तरह, यह SQL में वाक्यविन्यास की तरह बहुत तेजी से क्वेरी लॉग कर देगा। कोई लोडिंग भी शामिल नहीं है - डेटाबेस सर्वर सदा "चालू" है।
nearora

6

यहाँ हाल ही में एन लॉग प्रविष्टियों से शीर्ष यूआरएल, शीर्ष रेफरल और शीर्ष useragents खोजने के लिए एक स्क्रिप्ट है

#!/bin/bash
# Usage
# ls-httpd type count
# Eg: 
# ls-httpd url 1000
# will find top URLs in the last 1000 access log entries
# ls-httpd ip 1000
# will find top IPs in the last 1000 access log entries
# ls-httpd agent 1000
# will find top user agents in the last 1000 access log entries

type=$1
length=$2

if [ "$3" == "" ]; then
  log_file="/var/log/httpd/example.com-access_log"
else
  log_file="$3"
fi

if [ "$type" = "ip" ]; then
  tail -n $length $log_file | grep -o "[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}" | sort -n | uniq -c | sort -n
elif [ "$type" = "agent" ]; then
  tail -n $length $log_file | awk -F\" '{print $6}'| sort -n | uniq -c | sort -n
elif [ "$type" = "url" ]; then
  tail -n $length $log_file | awk -F\" '{print $2}'| sort -n | uniq -c | sort -n
fi

स्रोत


4

एक्सेस लॉग में IP काउंट के लिए:

cat log | grep -o "[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}" | sort -n | uniq -c | sort -n

यह थोड़ा बदसूरत है, लेकिन यह काम करता है। मैं नेटस्टैट के साथ निम्नलिखित का भी उपयोग करता हूं (सक्रिय कनेक्शन देखने के लिए):

netstat -an | awk '{print $5}' | grep -o "[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}" | egrep -v "(`for i in \`ip addr | grep inet |grep eth0 | cut -d/ -f1 | awk '{print $2}'\`;do echo -n "$i|"| sed 's/\./\\\./g;';done`127\.|0\.0\.0)" | sort -n | uniq -c | sort -n

वे मेरे पसंदीदा "वन लाइनर्स" में से कुछ हैं :)


3

इस प्रश्न के उत्तर के लिए सामान्य प्रश्नों की सूची बनाना एक बड़ा सूचकांक होगा। मेरे सामान्य प्रश्न हैं:

  • हिटेट क्यों बदला?
  • समग्र प्रतिक्रिया समय क्यों बढ़ रहा है? '।

मैं सक्रिय और हाल ही में पूर्ण किए गए अनुरोधों के बारे में सर्वर-स्टेटस पेज (mod_status के माध्यम से) की निगरानी करके और हाल ही में पूर्ण किए गए अनुरोधों (पूर्ण-अच्छी तरह से जानता हूं कि मुझे डेटा का एक बड़ा ढेर याद आ रहा है, लेकिन नमूने काफी अच्छे हैं) की निगरानी करके इस तरह के बदलाव दिखाई देते हैं।

मैं निम्नलिखित LogFormat निर्देशन का उपयोग करता हूं (% T वास्तव में उपयोगी है)

LogFormat "%h %l %u %t \"%r\" %>s %b 
    \"%{Referer}i\" \"%{User-Agent}i\" %T" custom

मैं कारण-प्रभाव की तलाश कर रहा हूं और पहले क्या हुआ था ... आमतौर पर मेरे लॉग में पैटर्न के विशिष्ट सबसेट के बारे में, इसलिए मुझे किसी भी दिए गए पैटर्न / नियमित अभिव्यक्ति के लिए निम्नलिखित जानने की आवश्यकता है:

  • किसी दिए गए पैटर्न के लिए अंतराल (मिनट या घंटे) (आईपी पते या cgi स्ट्रिंग या पैरामीटर, आदि)
  • अनुमानित प्रतिक्रिया समय के हिस्टोग्राम (% T पैरामीटर का उपयोग करके)

मैं आम तौर पर पर्ल का उपयोग करता हूं, क्योंकि आखिरकार यह काफी जटिल हो जाता है।


एक गैर-पर्ल उदाहरण गैर-200 स्थिति कोड के लिए प्रति मिनट एक क्विक हिट्रेट होगा:

tail -9000 access_log | grep -v '" 200 ' | cut -d: -f2,3 | uniq -c

हां, मैं उस grep के साथ धोखा कर रहा हूं, एक उद्धरण-स्पेस -200-स्पेस मैचों को केवल http स्टेटस कोड के रूप में माना जाता है .... जो क्षेत्र को अलग करने के लिए awk या perl का उपयोग कर सकता है बस ध्यान रखें कि यह गलत हो सकता है।


पर्ल में एक अधिक जटिल उदाहरण एक पैटर्न के लिए हिट्रेट में बदलाव की कल्पना करना हो सकता है।

नीचे दी गई लिपि में चबाने के लिए बहुत कुछ है, खासकर यदि आप पर्ल के साथ अपरिचित हैं।

  • स्टड पढ़ता है ताकि आप अपने लॉग के कुछ हिस्सों का उपयोग कर सकते हैं, पूंछ का उपयोग कर सकते हैं (विशेष रूप से पूंछ-एफ के साथ), ग्रीप और अन्य फ़िल्टरिंग के साथ या बिना ...
  • एक regex की हैक और तारीख का उपयोग के साथ युगीन टाइमस्टैम्प निष्कर्षण धोखा देती है :: मणिप
  • आप प्रतिक्रिया समय या अन्य मनमाना डेटा निकालने के लिए इसे केवल थोड़ा संशोधित कर सकते हैं

कोड निम्नानुसार है:

#!/usr/bin/perl
# script to show changes in hitrates for any regex pattern
# results displayed with arbitrary intervals
# and ascii indication of frequency
# gaps are also displayed properly
use Date::Manip;
use POSIX qw(strftime);
$pattern=shift || ".";
$ival=shift || 60;
$tick=shift || 10;
$minb=undef;
while (<>){
    next unless /$pattern/;
    $stamp="$1 $2" if m[(../.../....):(..:..:..)];
    $epoch = UnixDate(ParseDate($stamp),"%s");
    $bucket= int($epoch/$ival)*$ival;
    $minb=$bucket if $bucket<$minb || !defined($minb);
    $maxb=$bucket if $bucket>$maxb;
    $count{$bucket}++;
}
# loop thru the min/max range to expose any gaps
for($t=$minb;$t<=$maxb;$t+=$ival){
    printf "%s %s %4d %s\n",
            $t,
            strftime("%m/%d/%Y %H:%M:%S",localtime($t)),
            $count{$t}+0,
            substr("x"x100,0,$count{$t}/$tick
    );
}

यदि आप मानक मेट्रिक्स को संसाधित करना चाहते हैं, तो चेकआउट करें

  • अपने सभी लॉग को एक साथ लाने के लिए 'मर्जलॉग' (यदि आपके पास लोड बैलेंसर के पीछे कई एपाचे हैं) और
  • webalizer (या awstats या अन्य सामान्य विश्लेषक)।

3

यहाँ मेरा 'सेड' उदाहरण है, यह अपाचे लॉग के डिफ़ॉल्ट प्रारूप को पढ़ता है और इसे स्वचालित प्रसंस्करण के लिए अधिक सुविधाजनक चीज़ में परिवर्तित करता है। पूरी लाइन को नियमित अभिव्यक्ति के रूप में परिभाषित किया गया है, चर को बचाया जाता है और विभाजक के रूप में '#' के साथ आउटपुट के लिए लिखा जाता है।

इनपुट का सरलीकृत अंकन है:% s% s% s [% s] "% s"% s "% s"% s ""% s "

उदाहरण इनपुट लाइन: xx.xx.xx.xx - - [29 / मार्च / 2011: 12: 33: 02 +0200] "GET /index.html HTTP / 1.0" 200 9443 "-" "मोज़िला / 4.0"

उदाहरण आउटपुट लाइन: xx.xx.xx.xx # - # - # 29 / Mar / 2011: 12: 33: 02 + 0200 # GET /index.html HTTP / 1.0 # 200 # 9443 # - # मोज़िला / 4.0

cat access.log | \ 
  sed 's/^\(.*\) \(.*\) \(.*\) \[\(.*\)\] \"\(.*\)\" \(.*\) \(.*\) \"\(.*\)\" \"\(.*\)\"$/\1#\2#\3#\4#\5#\6#\7#\8#\9/g'

नियमित अभिव्यक्ति की शक्ति महसूस करें :-)


इसने AWK के साथ प्रसंस्करण को एक हवा बना दिया। एक आम अपराधी को सेटअप करने के लिए एक त्वरित तरीके की तलाश कर रहा था और इसने इसे नस्ट किया।
सिट्रिकगुई

मैंने रेगेक्स पावर को महसूस किया है और बस अपने स्वयं के ट्वीक के साथ गुजरना चाहता था, जो "एचटीएमएल / 1.1" को काटता है और प्रोटोकॉल को अलग करता है (संभवतः गैर-मानक अनुपालन तरीके से) अपने स्वयं के क्षेत्र में। आनंद लें: `` `बिल्ली access.log | sed / s /((.*) (। *) (*। *] [(*।)] \ "([[: अल्फा:]] \ +) (। *) HTTP \ / 1 \ .1 \" ()। । *) (*। *) \ "(। *) \" \ "" (। *) \ "$ / \ 1 # \ _ # 2 # \ _ # 3 # \ _ # 4 # \ _ # 5 # \ _ # 7 # \ _ # 8 # \ _ 9 # \ 10 / जी '`` `
जोश Rumbut

2

मैं फ़ाइल का उपयोग करके या कैट करके बहुत से awk का उपयोग करता हूं। प्रत्येक रात मैं प्रत्येक सर्वर के लिए एक वेब रिपोर्ट प्रदान करता हूं। आपकी लॉग फ़ाइल और आपके लॉगफ़ॉर्मेट के आधार पर आपको आपके लिए काम करने के लिए कुछ एक लाइनर्स को संपादित करने की आवश्यकता होगी ..।

यहाँ एक सरल उदाहरण दिया गया है:

अगर मैं केवल 404/500 स्थिति कोड के लिए अपने सर्वर पर लॉग्स पूंछना चाहता हूं तो मैं यह करूंगा:

# $6 is the status code in my log file

tail -f ${APACHE_LOG} |  awk  '$8 ~ /(404|500)/ {print $6}'

<स्निप>

echo ""
#echo  "Hits by source IP:"
echo "======================================================================"

awk '{print $2}' "$1" | grep -ivE "(127.0.0.1|192.168.100.)" | sort | uniq -c | sort -rn | head -25

echo ""
echo ""
#echo "The 25 most popular pages:"
echo "======================================================================"

awk '{print $6}' "$1" | grep -ivE '(mod_status|favico|crossdomain|alive.txt)' | grep -ivE '(.gif|.jpg|.png)' | \
 sed 's/\/$//g' | sort | \
 uniq -c | sort -rn | head -25

echo ""    
echo ""
echo "The 25 most popular pages (no js or css):"
echo "======================================================================"

awk '{print $6}' "$1" | grep -ivE '(mod_status|favico|crossdomain|alive.txt)' | grep -ivE '(.gif|.jpg|.png|.js|.css)' | \
 sed 's/\/$//g' | sort | \
   uniq -c | sort -rn | head -25

   echo ""


#echo "The 25 most common referrer URLs:"
echo "======================================================================"

awk '{print $11}' "$1" | \
 grep -vE "(^"-"$|/www.$host|/$host)" | \
 sort | uniq -c | sort -rn | head -25

echo ""

#echo "Longest running requests"
echo "======================================================================"

awk  '{print $10,$6}' "$1" | grep -ivE '(.gif|.jpg|.png|.css|.js)'  | awk '{secs=0.000001*$1;req=$2;printf("%.2f minutes req time for %s\n", secs / 60,req )}' | sort -rn | head -50

exit 0

</ स्निप>


2

कौन आपकी छवियों को हॉट-लिंक कर रहा है:

awk -F\" '($2 ~ /\.(jpg|gif)/ && $4 !~ /^http:\/\/www\.mydomain\.com/){print $4}' access_log | sort | uniq -c | sort

1

जो चीज मैं ज्यादातर समय करता हूं, वह समय के आधार पर एक लॉग के अनुभागों को पढ़ रहा है, इसलिए मैंने निम्नलिखित स्क्रिप्ट को लिखा है कि मैं जिस अवधि में दिलचस्पी रखता हूं उसे खींचने के लिए sed का उपयोग कर रहा हूं, यह हर लॉग फ़ाइल पर काम करता है जो मैं आया हूं। भर में और साथ ही संग्रहीत लॉग को संभाल सकता है।

#! / Bin / bash
# इस स्क्रिप्ट को 2 मानों के बीच की रेखाओं का एक सेट वापस करना चाहिए, मुख्य उद्देश्य 2 बार के बीच एक लॉग फ़ाइल की खोज करना है
#Script उपयोग: logship.sh "start" "stop" फ़ाइल

# यदि फ़ाइल में दिनांक में कोई भी "/" शामिल है, तो निम्नलिखित 2 पंक्तियों में एस्केप कैरेक्टर जोड़ दिया जाता है ताकि उनके पात्रों के लिए खोज की जा सके
प्रारंभ = $ (प्रतिध्वनि "$ 1" | sed 's / \ // \\\ // g')
स्टॉप = $ (प्रतिध्वनि "$ 2" | sed 's / \ // \\\ // g')

ज़िपित = $ (प्रतिध्वनि "$ 3"। grep -c "gz $") # फ़ाइल बाहर ज़िपित है या नहीं

अगर ["$ ज़िपित" == "1"]; फिर # फ़ाइल को ज़िप किया जाता है, तो उसे sed से पहले zcat से गुज़ारें
        zcat $ 3 | sed -n "/ $ start /, / $ stop / p";
अन्य
        sed -n "/ $ start /, / $ stop / p" $ 3; # अगर यह ज़िप नहीं है तो बस सेड रन करें
फाई

1

जबकि sed या awk नहीं, दो चीजें हैं जो मैंने अपाचे और icecast लॉग फ़ाइलों को संभालने के लिए उपयोगी पाई हैं।

AWStats के पास एक बहुत ही उपयोगी स्क्रिप्ट है, जिसे logresolvemerge.pl कहा जाता है जो कई संपीड़ित या असम्बद्ध लॉग फ़ाइलों, स्ट्रिप डूप्स और टाइमस्टैम्प द्वारा सॉर्ट करेगा। यह DNS लुकअप भी कर सकता है और इसे मल्टीथ्रेडेड चलाने के लिए कॉन्फ़िगर किया जा सकता है। यह विशेष रूप से उपयोगी है जब वेस्टैट्स के साथ उपयोग करते हैं क्योंकि वेस्टैट्स वर्तमान डेटाबेस की तुलना में पुराने टाइमस्टैम्प के साथ लॉग लाइनों को जोड़ नहीं सकते हैं, इसलिए सभी को क्रम में जोड़ा जाना चाहिए, लेकिन यह बहुत आसान है क्योंकि आप बस logresolvemerge.pl पर सब कुछ चकते हैं और यह सभी अच्छी तरह से बाहर निकलता है।

sed और awk तारीखों को संभालने में बहुत बुरे हैं क्योंकि वे आम तौर पर उन्हें तार के रूप में मानते हैं। awk के पास कुछ समय और दिनांक कार्य हैं, लेकिन वे बहुत अधिक नहीं हैं। उदाहरण के लिए, दो टाइमस्टैम्प के बीच की रेखाओं की एक सीमा को निकालना कठिन होता है यदि उन सटीक टाइमस्टैम्प फ़ाइल में नहीं होते हैं (भले ही उनके बीच का मान हो) - क्रिस के उदाहरण में वास्तव में यह समस्या है। इससे निपटने के लिए, मैंने एक PHP स्क्रिप्ट लिखी है जो लॉग फ़ाइल टाइमस्टैम्प पर्वतमाला की रिपोर्ट करती है और टाइमस्टैम्प रेंज द्वारा एक चंक भी निकाल सकती है, आपको जो भी दिनांक या समय प्रारूप पसंद है, उसका उपयोग करके (यह लॉग फ़ाइल के टाइमस्टैम्प प्रारूप से मेल खाने की आवश्यकता नहीं है)।

इसे ऑन-टॉपिक रखने के लिए, यहाँ कुछ उपयोगी अज़ीकम हैं: अपाचे से प्राप्त बाइट्स की कुल संख्या प्राप्त करें या मैनिपेट करें:

cat access.log | awk '{ sum += $10 } END { print sum }'

एक icecast लॉग से जुड़े सेकंड की कुल संख्या प्राप्त करें:

cat access.log | awk '{ sum += $13 } END { print sum }'

+1 साधारण बाइट-
अप एप के लिए

0

इस पुराने धागे पुन: प्राप्त करना, बड़े लॉग फाइल के लिए asql पर देने के बाद, againg एक समाधान के लिए देखा है, यह भी serverfault में, मैं WTOP के बारे में पाया यहाँ यह एक खुला स्रोत उपकरण है, कि लाइव निगरानी या प्रक्रिया लॉग करने में सक्षम है और आंकड़े प्राप्त करें (ऊपर एन), बहुत लचीला और शक्तिशाली, आधिकारिक जगह यहां है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.