คุณมีสคริปต์ awk และ grep ที่มีประโยชน์สำหรับการแยกวิเคราะห์บันทึก apache หรือไม่? [ปิด]


69

ฉันสามารถใช้เครื่องมือวิเคราะห์บันทึก แต่บ่อยครั้งที่ฉันต้องแยกบันทึกการใช้เว็บล่าสุดเพื่อดูว่าเกิดอะไรขึ้นในขณะนี้

บางครั้งฉันก็ทำสิ่งต่าง ๆ เพื่อหา 10 อันดับบนสุดที่ร้องขอไฟล์บางไฟล์

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

คุณมีอะไรในกล่องเครื่องมือของคุณ?


1
จริง ๆ แล้วฉันมี regex ที่สวยงามขนาดใหญ่ที่ฉันเขียนด้วยมือเพื่อแยกวิเคราะห์ apache ที่กำหนดเองทั้งหมดของฉันลงไปที่แต่ละฟิลด์เพื่อส่งไปยังฐานข้อมูล ฉันกำลังเตะตัวเองว่าฉันไม่มีอีกต่อไปแล้ว มันเป็นหนึ่งซับ; ให้ตัวแปรหนึ่งตัวสำหรับแต่ละองค์ประกอบการบันทึก - จากนั้นฉันก็แทรกเข้าไปใน MySQL ถ้าฉันพบมันฉันจะโพสต์ไว้ที่นี่
Kyle Hodgson

คำตอบ:


54

คุณสามารถทำอะไรกับไฟล์ล็อก apache ด้วย awk เพียงอย่างเดียว ไฟล์บันทึกของ Apache นั้นถูกคั่นด้วยช่องว่างโดยทั่วไปและคุณสามารถทำเป็นคำพูดที่ไม่มีอยู่และเข้าถึงข้อมูลใด ๆ ที่คุณสนใจด้วยหมายเลขคอลัมน์ ครั้งเดียวที่มีการแยกย่อยนี้คือถ้าคุณมีรูปแบบการบันทึกรวมกันและสนใจตัวแทนผู้ใช้ ณ จุดที่คุณต้องใช้เครื่องหมายคำพูด (") เป็นตัวคั่นและเรียกใช้คำสั่ง awk แยกต่อไปนี้จะแสดง IP ของ ผู้ใช้ทุกคนที่ร้องขอหน้าดัชนีเรียงตามจำนวนครั้ง:

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 เอง:

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

สิ่งหลังจะมีประโยชน์หากคุณตัดสินใจที่จะขยายสคริปต์ awk เพื่อพิมพ์ข้อมูลอื่น มันเป็นเรื่องของสิ่งที่คุณต้องการค้นหา สิ่งเหล่านี้ควรเป็นจุดเริ่มต้นสำหรับทุกสิ่งที่คุณสนใจ


มันดูเหมือนจะเป็นเรื่องแปลกที่จะเห็นท่อยาว cat / grep / awk ที่บ้าคลั่งอยู่เสมอ เมื่อคุณอยู่ใน awk นั่นก็เพียงพอแล้ว สามประโยคแรกของโพสต์ต้นฉบับสามารถเขียนได้เล็กน้อยเป็น "awk '/ request_to_file_foo / {print $ 1}' foo.log" awk สามารถใช้ไฟล์เป็นอินพุตและสามารถใช้ regex เพื่อทราบว่าบรรทัดใดที่ควรสนใจ
Zac Thompson

สง่างามและเรียบง่าย ดี.
Olivier Dulac

ระวังพื้นที่ดูเหมือนจะได้รับอนุญาตให้อยู่ใน "AUTHUSER ฟิลด์" (ที่ 3) ที่แบ่งทุกอย่างและผมเองคิดว่ามันควรจะเป็นสิ่งต้องห้ามที่จะช่วยให้เราทำเช่นนี้ ;-)
Mandark

23

สิ่งหนึ่งที่ฉันไม่เคยเห็นใครทำด้วยเหตุผลที่ฉันไม่สามารถจินตนาการได้คือการเปลี่ยนรูปแบบไฟล์บันทึกของ Apache เป็นเวอร์ชันที่แยกวิเคราะห์ได้ง่ายขึ้นด้วยข้อมูลที่สำคัญกับคุณ

ตัวอย่างเช่นเราไม่เคยใช้การรับรองความถูกต้องพื้นฐานของ HTTP ดังนั้นเราจึงไม่จำเป็นต้องบันทึกฟิลด์เหล่านั้น ผมรู้สึกสนใจในวิธียาวแต่ละคำขอใช้เวลาในการให้บริการดังนั้นเราจะเพิ่มว่าใน. สำหรับโครงการหนึ่งที่เรายังต้องการที่จะรู้ว่า (บน balancer โหลดของเรา) ถ้าเซิร์ฟเวอร์ใด ๆ ที่จะให้บริการการร้องขอช้ากว่าคนอื่น ๆ เพื่อให้เราเข้าสู่ระบบชื่อ ของเซิร์ฟเวอร์ที่เรากำลังจะกลับไป

นี่คือข้อความที่ตัดตอนมาจากการกำหนดค่า apache ของเซิร์ฟเวอร์เดียว:

# 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) ซึ่งหมายความว่าหากฉันต้องการทำการวิเคราะห์ใน Python อาจแสดงสถานะที่ไม่ใช่ 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

ง่ายต่อการอ่านและทำความเข้าใจและราคาที่คำนวณได้น้อยกว่า (ไม่มี regex) ซึ่งบนบันทึก 9 GB ทำให้เกิดความแตกต่างอย่างมากในระยะเวลาที่ใช้ เมื่อสิ่งนี้เรียบร้อยจริง ๆ ก็คือถ้าคุณต้องการทำสิ่งเดียวกันกับตัวแทนผู้ใช้ หากบันทึกของคุณมีการคั่นด้วยช่องว่างคุณต้องทำการจับคู่นิพจน์ปกติหรือค้นหาสตริงด้วยมือ ด้วยรูปแบบนี้มันง่าย:

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

ตรงกับข้างบน ในความเป็นจริงการสรุปใด ๆ ที่คุณต้องการจะเหมือนกันทุกประการ

ทำไมบนโลกนี้ฉันจะใช้ CPU ของระบบเป็น awk และ grep เมื่อตัดจะทำสิ่งที่ฉันต้องการได้อย่างรวดเร็ว


2
ตัวอย่างของคุณสำหรับรูปแบบใหม่เป็นจริงยังคง overcomplicated - IP นับกลายเป็นตัวแทนของผู้ใช้cut -f 3 log | uniq -c | sort -n cut -f 8 log | uniq -c | sort -n
Creshal

คุณพูดถูกที่ง่ายกว่า ฉันได้อัปเดตตัวอย่างเพื่อแสดงว่า
Dan Udey

"cat file | grep string" ไร้ประโยชน์แล้วทำไมไม่ "grep string file"?
c4f4t0r

2
ฉันไม่มีข้อแก้ตัวและได้อัปเดตตัวอย่างตามนั้น
Dan Udey

15

ลืมเรื่อง awk และ grep ตรวจสอบasql เหตุใดจึงต้องเขียนสคริปต์ที่อ่านไม่ได้เมื่อคุณสามารถใช้ sql เช่นไวยากรณ์สำหรับการสืบค้น logfile เช่น.

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;

น่าสนใจ แต่คุณอาจพบปัญหาหากบันทึกของคุณมีขนาดใหญ่เป็นพิเศษฉันคิดว่า มันรับมือกับรูปแบบบันทึกที่กำหนดเองได้ดีแค่ไหน?
Vagnerr

ฉันกำลังทดลองใช้ในขณะนี้ความเร็วในการโหลดช้ามาก (อย่างน้อยในเวอร์ชัน 0.9) กำลังโหลดบันทึก 200Mb ใช้เวลานานกว่าห้านาที ..
เท่ากับ

ฉันต้องบอกว่าหลังจากใช้เวลาโหลด (ใช้เวลาประมาณ 15 นาที) synstax ของโปรแกรมนี้ยอดเยี่ยมคุณสามารถเรียงลำดับนับและจัดกลุ่มได้ ดีจริงๆ.
เท่ากับ

Apache HTTPD มีวิธีการที่คุณสามารถส่งบันทึกไปยังฐานข้อมูลได้อย่างมีประสิทธิภาพ ใช่การเขียนอาจใช้เวลานาน แต่พร็อกซีเธรดอาจทำสิ่งที่ถูกต้องตรงกลาง อย่างไรก็ตามจะทำให้การสืบค้นบันทึกใน SQL เช่นไวยากรณ์เร็วขึ้นมาก ไม่เกี่ยวข้องกับการโหลด - เซิร์ฟเวอร์ฐานข้อมูลนั้นต่อเนื่อง "เปิด"
nearora

6

นี่คือสคริปต์เพื่อค้นหา URL อันดับสูงสุดผู้อ้างอิงอันดับต้น ๆ และผู้ใช้อันดับต้น ๆ จากรายการบันทึก N ล่าสุด

#!/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 (เพื่อดูการเชื่อมต่อที่ใช้งานอยู่):

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

การสร้างรายการคำถามทั่วไปจะเป็นดัชนีที่ดีสำหรับคำตอบของคำถามนี้ คำถามทั่วไปของฉันคือ:

  • ทำไม Hitrate ถึงเปลี่ยนไป?
  • ทำไมเวลาตอบสนองโดยรวมจึงสูงขึ้น '

ฉันสังเกตเห็นการเปลี่ยนแปลงดังกล่าวโดยการตรวจสอบหน้าสถานะเซิร์ฟเวอร์ (ผ่าน mod_status) สำหรับ Hitrate และเวลาตอบสนองโดยประมาณสำหรับคำขอที่มีการใช้งานและเสร็จสมบูรณ์เมื่อเร็ว ๆ นี้ (รู้ดีว่าฉันพลาดข้อมูลจำนวนมาก

ฉันใช้คำสั่ง LogFormat ต่อไปนี้ (% T มีประโยชน์จริง ๆ )

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

ฉันกำลังหาสาเหตุและสิ่งที่เกิดขึ้นก่อน ... ปกติเกี่ยวกับชุดย่อยของรูปแบบเฉพาะในบันทึกของฉันดังนั้นฉันจำเป็นต้องรู้ดังต่อไปนี้สำหรับรูปแบบที่กำหนด / การแสดงออกปกติ:

  • hitcounts ต่อช่วงเวลา (นาทีหรือชั่วโมง) สำหรับรูปแบบที่กำหนด (ที่อยู่ IP หรือสตริง cgi หรือพารามิเตอร์ ฯลฯ )
  • ฮิสโทแกรมของเวลาตอบสนองโดยประมาณ (ใช้พารามิเตอร์% T)

ฉันมักใช้ Perl เพราะในที่สุดมันก็ซับซ้อนพอที่จะคุ้มค่า


ตัวอย่างที่ไม่ใช่ perl จะเป็น hitrate ที่รวดเร็วต่อนาทีสำหรับรหัสสถานะที่ไม่ใช่ 200:

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

ใช่ฉันกำลังโกงด้วย grep นั้นสันนิษฐานว่า quote-space-200-space ตรงกับรหัสสถานะ http เท่านั้น .... สามารถใช้ awk หรือ perl เพื่อแยกฟิลด์ได้โปรดจำไว้ว่าอาจไม่ถูกต้อง


ตัวอย่างที่ซับซ้อนมากขึ้นใน perl อาจจะเห็นภาพการเปลี่ยนแปลงใน hitrate สำหรับรูปแบบ

มีจำนวนมากที่จะเคี้ยวในสคริปต์ด้านล่างโดยเฉพาะอย่างยิ่งถ้าคุณไม่ชอบ perl

  • อ่าน stdin เพื่อให้คุณสามารถใช้บางส่วนของบันทึกของคุณใช้ tail (โดยเฉพาะกับ tail -f) โดยมีหรือไม่มี greps และตัวกรองอื่น ๆ ...
  • กลโกงการสกัดการประทับเวลาด้วยแฮ็คของ regex และการใช้ Date :: Manip
  • คุณสามารถแก้ไขได้เพียงเล็กน้อยเพื่อดึงเวลาตอบกลับหรือข้อมูลอื่น ๆ

รหัสดังต่อไปนี้:

#!/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

นี่คือตัวอย่าง 'sed' ของฉันมันอ่านรูปแบบเริ่มต้นของ apache log และแปลงเป็นสิ่งที่สะดวกสำหรับการประมวลผลอัตโนมัติ บรรทัดทั้งหมดถูกกำหนดเป็นนิพจน์ทั่วไปตัวแปรจะถูกบันทึกและเขียนลงในเอาต์พุตด้วย '#' เป็นตัวคั่น

สัญกรณ์ที่เรียบง่ายของอินพุตคือ:% s% s% s [% s] "% s"% s "% s% s"% s ""% s "

ตัวอย่างบรรทัดอินพุต: xx.xx.xx.xx - - [29 / Mar / 2011: 12: 33: 02 +0200] "GET /index.html HTTP / 1.0" 200 9443 "-" "Mozilla / 4.0"

ตัวอย่างบรรทัดเอาต์พุต: xx.xx.xx.xx # - # - # 29 / Mar / 2011: 12: 33: 02 + 0200 # GET /index.html HTTP / 1.0 # 200 # 9443 # - # Mozilla / 4.0

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

รู้สึกถึงพลังของการแสดงออกปกติ :-)


สิ่งนี้ทำให้การประมวลผลด้วย AWK เป็นเรื่องง่าย กำลังมองหาวิธีที่รวดเร็วในการตั้งค่าผู้กระทำผิดทั่วไปและสิ่งนี้ตอกย้ำมัน
Citricguy

ฉันรู้สึกถึงพลังของ regex และแค่ต้องการปรับแต่งตามความต้องการของตัวเองซึ่งจะตัด "HTML / 1.1" ออกและแยกโพรโทคอล (ในทางที่ไม่ได้มาตรฐาน) ลงในฟิลด์ของตัวเอง เพลิดเพลินไปกับ: `` `cat access.log | sed 's /^(.*) (. *) (. *) [(. *)] \ "([[: alpha:]] \ +) (. *) HTTP \ / 1 \ .1 \" ( . *) (. *) \ "(. *) \" \ "(. *) \" $ / \ 1 # \ 2 # \ 3 # \ 4 # \ 4 # \ 5 # \ 6 # \ 7 # \ 8 # \ 9 # \ 10 / g '`` `
Josh Rumbut

2

ฉันใช้ awk บ่อยครั้งมากโดยการตัดหรือวางไฟล์ ทุกคืนฉันจะส่งรายงานเว็บให้กับแต่ละเซิร์ฟเวอร์ ขึ้นอยู่กับไฟล์บันทึกของคุณและ LogFormat ของคุณคุณจะต้องแก้ไข liners หนึ่งอันเพื่อให้เหมาะกับคุณ ..

นี่คือตัวอย่างง่ายๆ:

หากฉันต้องการจัดทำบันทึกในเซิร์ฟเวอร์ของฉันด้วยรหัสสถานะเพียง 404/500 ฉันจะทำสิ่งนี้:

# $6 is the status code in my log file

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

<snip>

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

</ snip>


2

ใครกำลังเชื่อมโยงภาพของคุณ:

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

1

สิ่งที่ฉันมักจะทำส่วนใหญ่คือการอ่านส่วนของบันทึกตามเวลาดังนั้นฉันจึงเขียนสคริปต์ต่อไปนี้โดยใช้ sed เพื่อดึงช่วงเวลาที่ฉันสนใจมันทำงานได้กับไฟล์บันทึกทุกไฟล์ที่ฉันมา ข้ามและสามารถจัดการบันทึกที่เก็บถาวรเช่นกัน

#! / bin / ทุบตี
# สคริปต์นี้ควรส่งคืนชุดของบรรทัดระหว่าง 2 ค่าโดยมีวัตถุประสงค์หลักเพื่อค้นหาไฟล์บันทึกระหว่าง 2 ครั้ง
การใช้งาน #Script: logship.sh "start" "stop" ไฟล์

# ถ้าไฟล์มี "/" ใด ๆ ในช่วงวันที่ 2 บรรทัดต่อไปนี้จะเพิ่มอักขระเลี่ยงเพื่อให้สามารถค้นหาได้สำหรับอักขระเหล่านั้น
start = $ (echo "$ 1" | sed 's / \ // \\\ // g')
stop = $ (echo "$ 2" | sed 's / \ // \\\ // g')

zipped = $ (echo "$ 3" | grep -c "gz $") #figure out หากไฟล์ถูกซิปหรือไม่

ถ้า ["$ zipped" == "1"]; จากนั้นถ้า # ไฟล์ถูกซิปแล้วให้ส่งผ่าน zcat ก่อน sed
        zcat $ 3 | sed -n "/ $ start /, / $ stop / p";
อื่น
        sed -n "/ $ start /, / $ stop / p" $ 3; # หากยังไม่ได้ซิปให้เรียกใช้ sed
Fi

1

แม้ว่าจะไม่ได้ติดขัดหรือแย่เกินไปมีสองสิ่งที่ฉันพบว่ามีประโยชน์ในการจัดการไฟล์ apache และ icecast log

AWStatsมีสคริปต์ที่มีประโยชน์มากที่เรียกว่าlogresolvemerge.plซึ่งจะรวมไฟล์บันทึกที่ถูกบีบอัดหรือไม่บีบอัด, ดึงแถบคู่และจัดเรียงตามเวลาประทับ นอกจากนี้ยังสามารถทำการค้นหา DNS และกำหนดค่าให้เรียกใช้มัลติเธรด มีประโยชน์อย่างยิ่งเมื่อใช้กับ awstats เนื่องจาก awstats ไม่สามารถเพิ่มบรรทัดบันทึกที่มีการประทับเวลาที่เก่ากว่าฐานข้อมูลปัจจุบันดังนั้นทุกอย่างจะต้องเพิ่มตามลำดับ แต่มันง่ายมากเพราะคุณเพิ่งโยนทุกอย่างที่ logresolvemerge.pl

sed และ awk ค่อนข้างแย่ในการจัดการเดทเพราะโดยทั่วไปถือว่าเป็นสตริง awk มีฟังก์ชั่นเวลาและวันที่ แต่มันไม่มาก ตัวอย่างเช่นการแยกช่วงของบรรทัดระหว่างสองการประทับเวลานั้นทำได้ยากหากการประทับเวลาที่แน่นอนเหล่านั้นไม่ได้เกิดขึ้นในไฟล์ (แม้ว่าค่าระหว่างพวกเขาจะทำ) - ตัวอย่างของคริสมีปัญหานี้อย่างแน่นอน เพื่อจัดการกับสิ่งนั้นฉันเขียนสคริปต์ PHPที่รายงานช่วงเวลาการบันทึกไฟล์และยังสามารถแยกช่วงโดยการประทับเวลาโดยใช้รูปแบบวันที่หรือเวลาที่คุณต้องการ (ไม่จำเป็นต้องตรงกับรูปแบบการประทับเวลาของไฟล์บันทึก)

เพื่อให้หัวข้อนี้อยู่ต่อไปนี้คือข้อผิดพลาดที่เป็นประโยชน์สองประการ: รับจำนวนไบต์ทั้งหมดที่ให้บริการจากบันทึก apache หรือ icecast:

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

รับจำนวนวินาทีทั้งหมดที่เชื่อมต่อจากบันทึก icecast:

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

+1 สำหรับบันทึก apache แบบข้อสรุปไบต์ด้วย awk
rymo

0

การกู้คืนเธรดเก่านี้หลังจากเลิกใช้ asql สำหรับไฟล์บันทึกขนาดใหญ่ค้นหาวิธีแก้ปัญหาที่เกิดขึ้นใน serverfault ฉันพบ wtop ที่นี่เป็นเครื่องมือ opensource ที่สามารถทำการตรวจสอบสดหรือบันทึกกระบวนการและรับสถิติ (ด้านบน) N) สถานที่ที่เป็นทางการอยู่ที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.