Ik zet wat eerste stapjes op het gebied van Perl (lezen kon ik wel aardig, maar schrijven niet) en loop bij onderstaande ogenschijnlijk simpele loopje tegen een probleem aan.
De basis is dat een Apache logfile regel voor regel doorlopen wordt en ik voor iedere regel gebruik kan maken van een aantal variabelen. Die kan ik uit iedere regel halen met een regex. Maar nog voor we daar zijn, lijkt er iets mis te gaan met de declaratie van de variabelen, als ik de errors goed begrijp.
Het volledige script:
Als ik dit uitvoer dan krijg ik dit:
De suggestie is dat er iets mis is met de declaratie van de variabelen, maar wat dan precies? Ik begin toch keurig met een my ([...]) en een voorbeeldscriptje dat ik heb bekeken doet niet heel veel anders dan wat ik hier doe.
De inhoud van de logfile is momenteel 11 regels totaal, dus de laatste foutmelding komt 1x voor bij iedere regel in de log. In het script staat al een voorbeeld van hoe een regel van de logfile eruit kan zien. Hier nog een paar van dergelijke regels:
De fout zit 100% zeker niet in de output buffering en ook niet in de variabelen die over twee regels verspreid zijn voor de leesbaarheid: uitgebreid getest en dat is niet het issue
Ik begrijp niet wat ik fout doe of wat ik verder kan doen om te achterhalen wat er fout gaat. Iemand pointers?
De basis is dat een Apache logfile regel voor regel doorlopen wordt en ik voor iedere regel gebruik kan maken van een aantal variabelen. Die kan ik uit iedere regel halen met een regex. Maar nog voor we daar zijn, lijkt er iets mis te gaan met de declaratie van de variabelen, als ik de errors goed begrijp.
Het volledige script:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
| #!/usr/bin/perl -w use strict; use warnings; # Continue with unbuffered output $|=1; # Every time we're receiving a line on stdin, then... while (<STDIN>) { # Our vhost_combined Apache LogFormat variables my ($host, $ip, $ident_user, $auth_user, $date, $time, $time_zone, $method, $url, $protocol, $status, $bytes, $referer, $useragent); # From O'reilly's Perl for Web Site Management # host ip ident auth [ 06/Jul/2012:16:55:15 +0200 ] "method url proto" status bytes "referer" "useragent" my $vhost_combined = qr/^(\S+) (\S+) (\S+) (\S+) \[([^:]+):(\d+:\d+:\d+) ([^\]]+)\] "(\S+) (.+?) (\S+)" (\S+) (\S+) "([^"]+)" "([^"]+)"$/; # qr = quote regex # # host:80 1.2.3.4 - - [16/Oct/2012:23:21:25 +0200] "GET /url HTTP/1.1" 400 519 "-" "-" # =~ run this against a regex ($host, $ip, $ident_user, $auth_user, $date, $time, $time_zone, $method, $url, $protocol, $status, $bytes, $referer, $useragent) =~ $vhost_combined or next; # next - will proceed to the next value and skip the rest of this block print join $host, $ip, $ident_user, $auth_user, $date, $time, $time_zone, $method, $url, $protocol, $status, $bytes, $referer, $useragent; } |
Als ik dit uitvoer dan krijg ik dit:
code:
1
2
3
4
5
| Useless use of private variable in void context at ./script.pl line 25. (hieronder nog 12x dezelfde foutmelding) Use of uninitialized value $useragent in pattern match (m//) at ./script.pl line 24, <STDIN> line 1. (hieronder nog 10x dezelfde foutmelding over line 24, maar dan stdin line 2 t/m 11) |
De suggestie is dat er iets mis is met de declaratie van de variabelen, maar wat dan precies? Ik begin toch keurig met een my ([...]) en een voorbeeldscriptje dat ik heb bekeken doet niet heel veel anders dan wat ik hier doe.
De inhoud van de logfile is momenteel 11 regels totaal, dus de laatste foutmelding komt 1x voor bij iedere regel in de log. In het script staat al een voorbeeld van hoe een regel van de logfile eruit kan zien. Hier nog een paar van dergelijke regels:
code:
1
2
3
4
| host.nl:80 1.2.3.4 - - [16/Oct/2012:22:31:13 +0200] "GET /x.php HTTP/1.1" 200 302 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:16.0) Gecko/20100101 Firefox/16.0" host.nl:80 1.2.3.4 - - [16/Oct/2012:22:31:34 +0200] "GET /y/ HTTP/1.1" 304 474 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:16.0) Gecko/20100101 Firefox/16.0" host.nl:80 6.7.8.9 - - [16/Oct/2012:23:21:25 +0200] "GET /w00tw00t.at.ISC.SANS.DFind:) HTTP/1.1" 400 519 "-" "-" host.nl:80 3.4.5.6 - - [17/Oct/2012:00:45:16 +0200] "HEAD /manager/html HTTP/1.0" 404 182 "-" "-" |
De fout zit 100% zeker niet in de output buffering en ook niet in de variabelen die over twee regels verspreid zijn voor de leesbaarheid: uitgebreid getest en dat is niet het issue
Ik begrijp niet wat ik fout doe of wat ik verder kan doen om te achterhalen wat er fout gaat. Iemand pointers?