ako na správne logovanie requestov a ich štatistiky rubrika: Programování: PHP

4 ferkomatus
položil/-a 27.9.2017

v jednom projekte robím logovanie "každého" HTTP requestu ... konkrétne len PHP scripty .. ktoré využijem na optimalizáciu systému
napíšem to všetko zjednodušene, len niektoré časti, aby ste pochopili pointu:

  • ako databáza je použitá MariaDB
  • logujem dátum vytvorenia, domenu, script, ip, počet sql, dlžku vykonávania sql, trvanie requestu, ...
  • log PHP sciptu je jednoduchý SQL insert
  • tabuľka obsahuje id, host, ip, script, ip_id, host_id, script_id ... kde *_id sú cudzie kľúče(default NULL) do iných tabuliek, ktorá obsahujú iba (ID a hodnotu)
  • ip_id, host_id, script_id boli pridané kvôli optimalizácií vyhľadávania/filtrovania
  • mám osobitnú tabuľku, do ktorej si ukladám to kedy boli aké ID spracované (date, idFrom, IdTo, convertStartDate, convertEndDate, generateStatsStart, generateStatsEnd)

  • logy musím pred použitím upraviť, vzorová ukážka pre úpravu scriptu .. to isté robím aj pre doménu a IP ... vo finalnom SQL sú viaceré SQl spojené dokopy (napr. UPDATE table SET script=NULL, host=NULL, ip=NULL WHERE ...):
  • uloženie unikátnych hodnôt, ktoré ešte nemám do osobitnej tabuľky:
    $selectIdsSQL = 'SELECT id from '.$tableLogs.' rl WHERE rl.id > '.$from.' and rl.id <= '.$to.' and rl.script NOT IN (SELECT value FROM '.$tableScript.')'
    $sql = 'INSERT INTO '.$tableScript.' (value) SELECT DISTINCT(script) FROM '.$tableLogs.' l WHERE l.id IN ('.$selectIdsSQL.')'
  • úprava kľúčov:
    $sql = 'UPDATE '.$tableLogs.' rl SET rl.script_id=(SELECT id FROM '.$tableScript.' s WHERE s.value=rl.script) WHERE script_id IS NULL'
  • vymazanie script textu:
    $sql = 'UPDATE '.$tableLogs.' rl SET rl.script=NULL WHERE rl.script IS NOT NULL'

následne mám ďalšiu tabuľku pre štatistiky, ktorá obsahuje zgrupované log dáta na každých 30 minút (ešte ju nemám vytvorenú ale bude sa vytvárať takto nejako):

$sql = 'UPDATE INTO '.$tableStats.' (time, ....) (SELECT round(time/1800), * from '.$tableLogs.' rl WHERE rl.id > '.$from.' and rl.id <= '.$to.' GROUP BY round(time/1800))'
  • v logoch mám cca 900 unikátnych scriptov, 350 000 unikátnych IP, 700 unikátnych domén
  • za posledný mesiac to bolo cca 20 000 000 logov (beží mi to iba mesiac, každý mesiac bude viac logov)
  • momentálne len vytváram zobrazovanie a generovanie štatistík, takže všetky SQL aj optimalizujem ak to niekde pôjde
  • všetky tieto štatistiky sa budú generovať na vyžiadanie(generovanie môže trvať aj pár minút) a nie automaticky

moja otázky sú:
1. je to dobrý návrh ukladania logov ?
2. je to dobrý návrh spracovania logov ?
3. ak to nie je dobre navhrnuté, ako inak by som to mal robiť ?

"konvertovanie" logov by som nemusel robiť, ak by som pred každým vložením logu zistil či už existuje IP, script a doména .. avšak rád by som sa vyhol tomu, aby som do každého requestu pridal 3 SQL naviac

EDIT:
Nejedná sa len o jednu databázu, ale o XYZ databáz.
Spustiť selecty nad produkčnou DB neviem, pretože systém je možné nakonfigurovať "nekonečne veľa možnosťami".
Optimalizácia SQL je len jedna z časti, rieším aj optimalizáciu pamäte, čas vykonania, čas renderovania, čas inicializácie frameworku, HTTP status, HTTP metódu, query string atď.
Pohľadov na tieto logy (štatistiky) bude viacero.

4. ak tomu správne rozumiem, tak sa jedna o spracovanie tzv. BIG DATA ?
5. ako to potom rieši napr. google, facebook, pri X milion násobne väčšom počte záznamov ? (ich riešenie je len viac serverov ?)

odkaz
3 Palo77
odpověděl/-a 28.9.2017

Logstash, elasticsearch, kibana. Na internete máš k tomu dosť zdrojov. Ak ti niečo nie je jasné daj otázku, ak budem vedieť odpoviem.

Komentáře

  • ferkomatus : otázky tam mám napísané, zaujímajú ma hlavne prvé 3 28.9.2017
  • Palo77 : 1. Nie nie je 2. Nie nie je 3. Nie nie je pouzi - Logstash, elasticsearch, kibana... 28.9.2017
  • siq : Absolutny suhlas s @Palo77, plus: 5. Elastic Search, Logstash, Kibana. Tiez sa to da Googlit ako ELK Stack. Ak si to bastlis sam, tak robis obrovsku chybu. Navyse ak mas performance problemy, tak znovu logovat do tej istej DB kazdu operaciu je fakt bullshit. 2.10.2017
  • ferkomatus : ok ... takže to čo spomínate, je len na účely logovania a zobrazenia týchto štatistík ? pretože mi nepríde správne, aby som takéto postupy používal aj na iné časti systému (vyúčtovanie, transakcie, ...) 3.10.2017
  • rs : No zalezi jestli se jedna o logy nebo jestli jsou dane zaznami soucasti datoveho modelu aplikace... Muze aplikace fungovat kdyz vymazes logy o "vyuctovani, transakcich..."? pak se jedna nejspis o logy a bez obav bych je hrnul do ELKu. Pokud by vymazanim techto udaju aplikace havarovala tak uz to nejspis nejsou logy jedna se o cast datoveho modelu a patri to ke zbytku dat do produkcni databaze 3.10.2017
  • siq : Presne ako pise @rs. Btw vies co je SQL Injection? 3.10.2017
  • ferkomatus : áno viem čo je to SQL injection. Pointa môjho komentu vyššie je stále nezodpovedaná .... ak aplikácia musí mať záznamy bez ktorých by nefungovala správne, tak ako tam riešiť tabuľky s veľkým množstvom dát ? keďže vtedy mi nepríde vhodné použiť spomínané nástroje 5.10.2017
  • rs : Co je to velke mnozstvi dat? abys neresil predcasnou optimalizaci, DB jsou delane na velke mnozstvi dat pokud s tim pracujes spravne na jednom stroji neni problem mit tabulku se 100M i vic radky radky. ve chvili kdy je to pomale muzes pouzit partitioning. jak moc data zapisujes jak moc je ctes, resis jenom inserty nebo i update / delete? jedna se o fixni strukturu (radky) nebo documenty (json) bez znalosti problemu ti nikdo presnou odpoved neda. 5.10.2017
  • archenroot : @Palo77 - elastic je bohuzel pekna mrska, ktera ve velkych clusterech inklinuje ke ztrate dat, proto je taky tak rychla, je to proste search engine (lucene), zejmena pokud se jedna o vetsi clustery, tak by se mel kazdy nejdrive kouknout na resiliency status :-). V tomto pripade je to asi ok, ale napr. v pripade projektu na generovani protiutoku proti sitovym utokum si to nemuzes dovolit. Proste neni option, ze prijdes o data. Hodne lidi tohle u elastiku opomiji. U aplikacnich logu nejake vnitropodnikove aplikace to ale asi muze byt ok. ' 1.12.2017
  • Palo77 : Nikdy sme s takouto situaciou nestretli, nepamatam ani kedy nam vypadol aspon jeden uzol, mame cely cluster na jednom mieste. Skusali ste aj novu verziu 5.0 s patchom #20384 (nemozem vlozit odkaz)? 3.12.2017

Pro zobrazení všech 7 odpovědí se prosím přihlaste:

Rychlé přihlášení přes sociální sítě:

Nebo se přihlaste jménem a heslem:

Zadejte prosím svou e-mailovou adresu.
Zadejte své heslo.