Portál AbcLinuxu, 7. května 2024 02:58


Dotaz: Efektivní parsování logu

13.9.2019 10:42 Jirka
Efektivní parsování logu
Přečteno: 575×
Odpovědět | Admin
Dobrý den.
Hledám možnost, jakou bych efektivně mohl parsovat logy za nějaké konkrétní časové období.
Existuje nějaký "jednoduchý" způsob, jak z logu vysypat všechno, např. ze dne 01.09.2019 v čase 09:00 - 10:15 ?

Vzorový řádek z logu
194.xxx.17x.yyy - - [13/Sep/2019:09:51:27 +0200] "GET /nejaky-obsah-bla-bla-bla/ HTTP/2.0" 301 275 "https://www.domena.cz/nejaky-obsah-bla-bla-bla" "Mozilla/5.0 (Linux; Android 6.0.1; Redmi 3S Build/MMB29M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/76.0.3809.132 Mobile Safari/537.36 [FB_IAB/FB4A;FBAV/238.0.0.41.116;]"

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

Odpovědi

13.9.2019 11:17 Peter Golis | skóre: 64 | blog: Bežné záležitosti | Bratislava
Rozbalit Rozbalit vše Re: Efektivní parsování logu
Odpovědět | | Sbalit | Link | Blokovat | Admin
Pre tento typ prípadu je ideál to mať v DB, a dáta vyťahovať selectom.
13.9.2019 11:22 Jirka
Rozbalit Rozbalit vše Re: Efektivní parsování logu
Že bych jako syslog nebo nginx logy ukládal do DB ?
...to fakt ne ;-)


Děkuji.
13.9.2019 12:42 rich
Rozbalit Rozbalit vše Re: Efektivní parsování logu
Ale moznost to je...
https://www.rsyslog.com/doc/v8-stable/tutorials/database.html
Jinak opravdu "jednoduchy" zpusob je awk, grep atd.
13.9.2019 13:24 Peter Golis | skóre: 64 | blog: Bežné záležitosti | Bratislava
Rozbalit Rozbalit vše Re: Efektivní parsování logu
Problém je ale ako potom zložiť dopyt typu SELECT blah FROM SystemEvents WHERE FromHost=:hostname AND DeviceReportedTime between "...:..." AND "...:..." .
13.9.2019 23:41 Miloslav Ponkrác
Rozbalit Rozbalit vše Re: Efektivní parsování logu
Na některých pomalejších strojích, kde je málo požadavků mám log v databázi, a nemohu si to vynachválit.

Je rozložen do několika tabulek, aby to bylo kratší.

Například je tabulka hodnot UserStringů a v logu je jenom id. Po několika letech provozu mám asi 1000 různých UserStringů a už to nepřibývá. Log je díky tomu velice malý.

Tam kde to lítá, je samozřejmě log v databázi skoro nesmysl.
13.9.2019 11:31 Ivan
Rozbalit Rozbalit vše Re: Efektivní parsování logu
Odpovědět | | Sbalit | Link | Blokovat | Admin
Tohle dela Splunk anebo ELK. Tezko rict jak "jednoduchy" je takovy tool zacit pouzivat.

wamba avatar 13.9.2019 13:52 wamba | skóre: 38 | blog: wamba
Rozbalit Rozbalit vše Re: Efektivní parsování logu
Odpovědět | | Sbalit | Link | Blokovat | Admin

Vždycky si můžeš napsat script v nějakým jazyce. Např. v Perlu 6

use v6.c;
constant %months = %(<Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec> Z=> 1..12);

sub tag-by-DateTime ($log-line) {
    $log-line
    andthen .match: rx{
        '[' $<day>= \d **2
        '/' $<month-string>= \w **3
        '/' $<year>= \d **4
        ':' $<hour>= \d **2
        ':' $<minute>= \d **2
        ':' $<sec>= \d **2
        ' '<[+-]> \d ** 4
        ']'
    }
    andthen %(.hash, "month" => %months{$<month-string>})
    andthen DateTime.new: |$_
}

sub MAIN (
    :$file = '/var/log/httpd/access_log',
    :$from = DateTime.now.earlier(:1day).Str,
    :$to   = DateTime.now.Str,
) {
    my @log = lines $file.IO;

    @log
    andthen .map: {tag-by-DateTime($_) => $_}\
    andthen .grep: {.key ~~ DateTime.new($from) .. DateTime.new($to)}\
    andthen .map: *.value.put
}
a pak
perl6 ./read-log-by-date-abc.p6 -file=/var/log/httpd/access_log  -from=2016-08-21T12:50:00 -to=2016-08-21T13:37:00

Pár poznámek:

This would have been so hard to fix when you don't know that there is in fact an easy fix.
13.9.2019 14:48 OldFrog {Ondra Nemecek} | skóre: 36 | blog: Žabákův notes | Praha
Rozbalit Rozbalit vše Re: Efektivní parsování logu
Odpovědět | | Sbalit | Link | Blokovat | Admin
Pokud používáte systemd, tak něco umí journalctl:
journalctl --since= --until= ...
To logování do databáze taky nemusí být špatný nápad, jsou i specializované řešení pro tento účel.
-- OldFrog
13.9.2019 23:37 Miloslav Ponkrác
Rozbalit Rozbalit vše Re: Efektivní parsování logu
Odpovědět | | Sbalit | Link | Blokovat | Admin
Program nebo skript, který by provedl požadované bych napsal za pár minut. Rozhodně rychlejší než hledat nějaký nástroj.

Možná bych si to během programování předvysypal grepem na řetězec [01/Jun/2019:
14.9.2019 13:04 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: Efektivní parsování logu
Odpovědět | | Sbalit | Link | Blokovat | Admin
Pro tyto účely používám AWK. Umí filtrovat a parsovat vstup i formátovat výstup. Když je třeba, zvládne porovnat záznamy mezi sebou i agregovat data.
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
14.9.2019 15:51 MP
Rozbalit Rozbalit vše Re: Efektivní parsování logu
Odpovědět | | Sbalit | Link | Blokovat | Admin
Graylog + logy v jsonu a na nejaky awk apod si ani nevzpomenete pro bezne pouziti.

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.