Portál AbcLinuxu, 13. května 2025 20:53

Dotaz: Skript na dekódování squid access.log datumu

5.2.2007 17:02 ac
Skript na dekódování squid access.log datumu
Přečteno: 539×
Odpovědět | Admin
Udělal jsem si skript v php na dekodovani data a času s access.log logu squidu v php. Jak to napsat v bashi? |V php to při větším logu přestává fungovat, alokuje to hrozně moc paměti.
$fp = FOpen ($filename, "rb");
$text = FRead ($fp, FileSize ($filename));
FClose ($fp);

       $patterns = array(
           "/^(.*)\.(.*) /smUe"
       );
       $replacements = array(
           "StrFTime('%d/%m/%Y %H:%M:%S', '\\1')"
       );
       $text = preg_replace($patterns,$replacements, $text);

Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

5.2.2007 17:30 Semo | skóre: 45 | blog: Semo
Rozbalit Rozbalit vše Re: Skript na dekódování squid access.log datumu
Odpovědět | | Sbalit | Link | Blokovat | Admin
cat access.log |
cut -d. -f1 |
while read sec; do
    date -d "19700101 00:00:00 $sec sec" "+%d/%m/%Y %H:%M:%S"
done
If you hold a Unix shell up to your ear, you can you hear the C.
5.2.2007 22:49 Semo | skóre: 45 | blog: Semo
Rozbalit Rozbalit vše Re: Skript na dekódování squid access.log datumu
No dobre no, ten cat som mohol usetrit a dat subor ako parameter cutu. Ja som to testoval na zgzipenom logu a pouzival som zcat (a nakoniec som to upravil pre publikovanie). zcut totiz neexistuje.
If you hold a Unix shell up to your ear, you can you hear the C.
Josef Kufner avatar 5.2.2007 17:31 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: Skript na dekódování squid access.log datumu
Odpovědět | | Sbalit | Link | Blokovat | Admin
Tak ten log zpracovávej po řádcích a ne celý najednou.
Hello world ! Segmentation fault (core dumped)
5.2.2007 17:31 Semo | skóre: 45 | blog: Semo
Rozbalit Rozbalit vše Re: Skript na dekódování squid access.log datumu
Odpovědět | | Sbalit | Link | Blokovat | Admin
Alebo ten skript nespravis tak hlupo, ze si ho najprv cely nacitavas do pamate, ale budes ho citat po riadkoch a rovno spracovavat.
If you hold a Unix shell up to your ear, you can you hear the C.
5.2.2007 21:45 Jan Martinek | skóre: 43 | blog: johny | Brno
Rozbalit Rozbalit vše Re: Skript na dekódování squid access.log datumu
Odpovědět | | Sbalit | Link | Blokovat | Admin
Třeba takhle:
#!/usr/bin/python
import time
for line in file('access.log'):
    splitted = line.split()
    firsttwo = ' '.join(splitted[:2])
    text = ' '.join(splitted[2:])
    time_tuple = time.strptime(firsttwo, '%d/%m/%Y %H:%M:%S')
    print time.mktime(time_tuple), text
Zpracovává to asi 10000 řádků za sekundu a paměť by to taky nějak zvlášť žrát nemělo.
6.2.2007 10:00 ac
Rozbalit Rozbalit vše Re: Skript na dekódování squid access.log datumu
10000 řádků za sekundu je málo. Ten php skript zpracuje 50 MB soubor logu za 3 sekunkdy.
6.2.2007 10:41 iSteve | skóre: 15 | blog: isteve
Rozbalit Rozbalit vše Re: Skript na dekódování squid access.log datumu
To je sice pekne, ale presto nepouzitelne:) Jestli chces rychlost, napis to v Ccku, pripadne Perlu atd. Jestli chces opravdu velkou rychlost, mej logy v tmpfs. Jestli chces web srajdu, napis to v PHP, ale poradne:) (Krom toho jsem si dost jistej, ze 10k radku/s byl guesstimate a ne mereni)

Mimochodem, generovani stats pro zatizenejsi weby obvykle trva dlouho, neni uplne rozumny to mit v PHP ve chvili, kdy tam mas milion omezeni stran pameti a doby behu skriptu. Neni rozumny tyto omezeni rusit.

Vedet jak parsovat log je dobrej zacatek, ale zkus to jeste trochu vic domyslet v sirsich souvislostech, jestli to je opravdu presne to co chces.
6.2.2007 11:06 Jan Martinek | skóre: 43 | blog: johny | Brno
Rozbalit Rozbalit vše Re: Skript na dekódování squid access.log datumu
10000 řádků za sekundu je málo. Ten php skript zpracuje 50 MB soubor logu za 3 sekunkdy.
Tak o takové rychlosti si mohu nechat jen zdát. Odhaduji, že ten tvůj padesátimegový log obsahuje půl miliónu řádků. Už pouhé volání funkce strptime() z pythonu si u mě vezme 70 mikrosekund, což samo o sobě by se natáhlo na více než půl minuty.

Rád bych pohlédl kruté pravdě do očí - máme tak strašně odlišné počítače nebo lžou všichni, co údajně svůj web urychlili přepsáním z php do pythonu?
6.2.2007 12:16 Semo | skóre: 45 | blog: Semo
Rozbalit Rozbalit vše Re: Skript na dekódování squid access.log datumu
Ten moj bashovy skript parsuje 740r/s. Na Athlon 3200+. Vstup je generovany a vystup ide do /dev/null, takze to ani nie je brzdene diskom.
If you hold a Unix shell up to your ear, you can you hear the C.
6.2.2007 14:26 Jan Martinek | skóre: 43 | blog: johny | Brno
Rozbalit Rozbalit vše Re: Skript na dekódování squid access.log datumu
Ach ták! Taky jste mi mohl někdo říct, jak vlastně vypadá formát toho logu a že to mám vlastně úplně blbě a tudíž mi to nemůže fungovat ;-) Tak tady je nová verze
#!/usr/bin/env python
import time
for line in file('access.log'):
    sec, text = line.split(' ', 1)
    ttuple = time.localtime(float(sec))
    print time.strftime('%d/%m/%Y %H:%M:%S', ttuple), text,
která zpracovává 40000 řádků za sekundu (změřeno), vypisuje vždy celý řádek logu, jen čas a datum má polidštěný formát. Padesátimegový log se zpracovává 10 sekund a líp to nedokážu.
6.2.2007 15:25 .
Rozbalit Rozbalit vše Re: Skript na dekódování squid access.log datumu
Odpovědět | | Sbalit | Link | Blokovat | Admin
# time perl -p -e 's/^\d+\.\d+/localtime $&/e;'< access.log > access-lidsky.log

real    0m39.863s
user    0m30.460s
sys     0m3.120s
# cat /var/log/dmesg|grep MIPS
Calibrating delay loop... 799.53 BogoMIPS
# ls -l access.log
-rw-r-----    1 proxy    proxy    49436371 Feb  6 15:23 access.log
6.2.2007 15:57 Jan Martinek | skóre: 43 | blog: johny | Brno
Rozbalit Rozbalit vše Re: Skript na dekódování squid access.log datumu
Tak přece se našlo místo k optimalizaci ;-) Zkusím tedy napodobit ten perlovský kód a předpokládat, že formát data a času vyhovuje tak, jak ho vrací funkce ctime().
#!/usr/bin/env python
import time
for line in file('access.log'):
    sec, text = line.split(' ', 1)
    print time.ctime(float(sec)), text,
A opravdu se to tím zrychlilo:
$ time ./readfile.py > access-lidsky.log

real    0m6.020s
user    0m5.415s
sys     0m0.527s
$ time perl -p -e 's/^\d+\.\d+/localtime $&/e;'< access.log > access-lidsky.log

real    0m9.052s
user    0m7.245s
sys     0m1.725s
Takže padesátimegový log se pythonem zpracuje za 6 sekund, v těsném závěsu je perl s devíti sekundami. Ale nad rychlostí toho PHP mi zůstává rozum stát.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.