2010-02-08 22 views
6

मैं PHP में इस स्ट्रिंग को विभाजित करने की कोशिश कर रहा हूँ PHP में एक regex का उपयोग कर:कैसे अपाचे लॉग पार्स करने के लिए

11.11.11.11 - - [25/Jan/2000:14:00:01 +0100] "GET /1986.js HTTP/1.1" 200 932 "http://domain.com/index.html" "Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7 GTB6" 

कैसे आईपी, तिथि, HTTP विधि, डोमेन-नाम और ब्राउज़र में इस विभाजित कर सकते हैं?

+1

यह इस सवाल है, जो पूर्ण पार्स में चला जाता है की एक बदतर संस्करण है: http://stackoverflow.com/questions/ 7603017/parse-apache-log-in-php-use-preg-match – ftrotter

उत्तर

12

यह लॉग प्रारूप Apache’s combined log format लगता है। इस नियमित अभिव्यक्ति का प्रयास करें:

/^(\S+) \S+ \S+ \[([^\]]+)\] "([A-Z]+)[^"]*" \d+ \d+ "[^"]*" "([^"]*)"$/m 

मेल खाने वाले समूह इस प्रकार हैं:

  1. दूरदराज के आईपी पते
  2. अनुरोध तारीख
  3. अनुरोध HTTP विधि
  4. User-Agent मूल्य

लेकिन डोमेन सूचीबद्ध नहीं है कर रहे हैं। दूसरी उद्धृत स्ट्रिंग Referer मान है।

+0

मुझे उन्हें – streetparade

+1

@streetparade को विभाजित करने की भी आवश्यकता है: 'preg_match_all' का उपयोग करें और आपको सभी मिलान मिलते हैं:' preg_match_all ('...', $ str, $ match) ' – Gumbo

+0

अच्छी तरह से यह regex संकलित नहीं करता है ... एक गोल ब्रैकेट गायब है;) –

4

आपको नियमित अभिव्यक्ति ट्यूटोरियल देखना चाहिए। लेकिन यहां जवाब है:

if (preg_match('/^(\S+) \S+ \S+ \[(.*?)\] "(\S+).*?" \d+ \d+ "(.*?)" "(.*?)"/', $line, $m)) { 
    $ip = $m[1]; 
    $date = $m[2]; 
    $method = $m[3]; 
    $referer = $m[4]; 
    $browser = $m[5]; 
} 

ध्यान रखें, यह लॉग में डोमेन नाम नहीं है बल्कि HTTP रेफरर है।

4

यहां कुछ पर्ल है, PHP नहीं, लेकिन उपयोग करने के लिए regex समान है। यह रेगेक्स मैंने जो कुछ देखा है उसे पार्स करने के लिए काम करता है; ग्राहकों कुछ विचित्र अनुरोध भेज सकते हैं:

my ($ip, $date, $method, $url, $protocol, $alt_url, $code, $bytes, 
     $referrer, $ua) = (m/ 
    ^(\S+)\s     # IP 
    \S+\s+      # remote logname 
    (?:\S+\s+)+     # remote user 
    \[([^]]+)\]\s    # date 
    "(\S*)\s?     # method 
    (?:((?:[^"]*(?:\\")?)*)\s # URL 
    ([^"]*)"\s|     # protocol 
    ((?:[^"]*(?:\\")?)*)"\s) # or, possibly URL with no protocol 
    (\S+)\s      # status code 
    (\S+)\s      # bytes 
    "((?:[^"]*(?:\\")?)*)"\s # referrer 
    "(.*)"$      # user agent 
/x); 
die "Couldn't match $_" unless $ip; 
$alt_url ||= ''; 
$url ||= $alt_url; 
1
// # Parses the NCSA Combined Log Format lines: 
$pattern = '/^([^ ]+) ([^ ]+) ([^ ]+) (\[[^\]]+\]) "(.*) (.*) (.*)" ([0-9\-]+) ([0-9\-]+) "(.*)" "(.*)"$/'; 

उपयोग:

if (preg_match($pattern,$yourstuff,$matches)) { 

    //# puts each part of the match in a named variable 

    list($whole_match, $remote_host, $logname, $user, $date_time, $method, $request, $protocol, $status, $bytes, $referer, $user_agent) = $matches; 

} 
संबंधित मुद्दे