Nejsem vyvojar, tak jsem to jen zbezne proletl. Ale posledni obrazek z vypisem logu mi potvrdil, ze tam chybi to nejdulezitejsi - aneb, vidim, jak to prasi vyvojari u nas.
Vyvojari neumi logovat tak, aby to nenakoplo standardni prostredi. Posilat log na konzoli bez vyzadani? Kravina. Posilat vse do logu bez odliseni urovne logovani? Kravina. atd...
Staci tu aplikaci/script spustit v systemd unite a hned je videt, jak jsou systemove logy zasvinene bordelem.
A propos, chybi tu podle mne jeden dil. A ten dil by uz autorovi odhalil, jak tento serial prasi logy. A to je posilani vystupu ne do souboru (ale budiz), ale aby se ten log posilal na nejake centralizovane misto, cili musi mit taky nejakou parsovatelnou strukturu. V tom poslednim vystupu je jasne videt nekolik mist, ktere budou parsovani rozbijet, resp. nejsou parsovatelne out of box.
My 2 cents from sysadmin.
osilat log na konzoli bez vyzadani?
Monolog samozřejmě má logLevel a ten je automaticky invokován pužitím funkcí info(); error(); etc.
LogLevel se nastavuje v konfigurac, všechno pod je přeskočeno. Kam a jak Monolog vypisuje není automatické, ale nastavuje v konfiguraci: outputFormatter/OutputHandler (file, stderr ...) takže můžete vlastně psát zároveň do obou. Symfony má nějaký default ....
Mě osobně ale v článku zlobí ta čeština v kódu ...
20. 10. 2021, 10:36 editováno autorem komentáře
Napriklad?
Kus logu vypada jako json parsovatelny.
Poslete jeden radek toho logu do parseru json. Hm, on ten zacatek pred () neni json parsovatelny. A vubec, proc tam jsou jednoduche zavorky a ne "{ }"?
Aneb, kockopes. Bud, at je vystup cely na regexp, nebo na nejaky format pro parsovani (idealne s prepinanim dle potreby).
@czechsys
A zkoušel jste to? Já to shodou okolností minulý týden parsoval (staženo z AWS v CSV formátu). Chvilku jsem se u toho vztekal a pak jsem to zparsoval:
(jenom taková rychlá čuňárna v pythonu)
for row in reader:
...
myJson = row[1].replace("[]", "").replace("\n", "")
obj = json.loads(myJson)
log = obj["log"]
My tedý máme ještě jinou strukturu, protože logy ve skutečnosti zpracováváme Kubernetes/AWS Logs Insight. Logy tam mají teda víc dimenzí, ale výsledná log zpráva je prostě ta samá ze Symfony (monolog), nepoužíváme žádné custom formattery etc.
Můžu odpoledne zkusit tady to co je v článku, teď zas tolik času nemám ;-) :-)
DISCLAIMER: Neříkám že nemáte pravdu, jenom jsem se do toho nějak zabral a tak mě to zajímá, protože s tím teď vlastně dělám ...
20. 10. 2021, 13:07 editováno autorem komentáře
Kus logu vypada jako json parsovatelny.
Pokud myslíte řádku např.:
{"file":"C:\\xampp\\htdocs\\logovani\\src\\app\\priklad\\Funkce.php","line":106,"class":"app\\priklad\\Funkce","function":"nactiSoubor"}
tak to je automaticky vložený výstup připojeného procesoru, který nelze dodatečně formátovat. Toto bylo vysvětleno v předchozím článku https://www.root.cz/clanky/logovani-v-php-moznosti-vystupu-logovani-zajistovanych-handlery/ v části 2.6.3. Existující procesory.
Pavel Herout
Přiznám se, že Vašemu příspěvku nerozumím. Pokusím se tedy odpovědět tak, jak jsem jednotlivé části pochopil. Pokud jsem Vaši připomínku pochopil špatně, prosím, upřesněte ji. Části Vaší připomínky jsou kurzívou.
Posilat log na konzoli bez vyzadani?
Příklad je ukázka možností, které v předchozích článcích byly ukázány co možná nejjednodušeji. Zde v tomto syntetickém příkladu jsou vzájemně zkombinovány, aby bylo vidět, co je možné. Protože je celé logování nakonfigurováno v jedné metodě nastavLogovani(), je možné logování do konzole snadno na lehce nalezitelném místě vypnout.
Posilat vse do logu bez odliseni urovne logovani? Kravina.
Vůbec netuším, co tím míníte. Když se podíváte do uvedených výpisů (jak konzole, tak soubor), tak je vždy v nich úroveň uvedena. Například hlavni.NOTICE.
A to je posilani vystupu ne do souboru (ale budiz), ale aby se ten log posilal na nejake centralizovane misto, ...
V tomto jednoduchém příkladě jsem nepovažoval za výhodné posílat logy na nějaké centralizované místo. Příklad si každý může spustit lokálně, udělat si nějaké své pokusy a rychle si prohlédnout výstupní soubor bez hledání, kde se vlastně soubor nachází.
...cili musi mit taky nejakou parsovatelnou strukturu.
Potřebujete-li parsovatelnou strukturu, stačí použít JsonFormatter, který je popsán v tomtéž článku (2.7.4.)
A propos, chybi tu podle mne jeden dil. A ten dil by uz autorovi odhalil, jak tento serial prasi logy.
Napište jej. Určitě zde chybí díl s pracovním názvem "Logování v rozsáhlých aplikacích".
Pavel Herout
Vytrhl jste to z kontextu. Zapomel jste na to, ze v textu pred tim oznacene kurzivou je napsano, ze vidim, jak to delaji vyvojari u nas.
Tu parsovatelnou strukturu jsem odkazoval na to, ze neco je v zavorkach, a pred temi zavorkami je text (datestamp atd), ktery to parsovani rozbiji.
Ten clanek psat nemusim. Vidim to v realite na serveru. Zatimco treba apache/nginx muzu standardni logy prekonfigurovat kompletne do json, tak treba haproxy udela presne ten samy vystup, co vy. datetime+pid+etc...+parsovatelny objekt.
Ja nekitizuji clanek jako takovy. Ja upozornuji na to, ze pokud neco logovat, tak je dnes vice nez vhodne operovat i s parsovatelnosti atd.
V závěru té série bylo napsáno: Máte-li zkušenosti s jinými knihovnami nebo s jinými postupy, prosím, napište je do diskuze.
No a to se díky Vašemu upozornění stalo. Ale pokud máte víc praktických zkušeností, zejména s většími projekty, tak je škoda se o ně nepodělit. Já jsem z akademického prostředí a ten praktický pohled mi nutně chybí.
Pavel Herout
Jsou tam i jiné prohřešky, pokud se nemýlím. Např. tohle:
"Vystupni soubor:".$jmenoOut
by mělo být buď s jednoduchými závorami nebo se proměnou zasazenou do textu. Pokud vím, php parsuje \" při hledání všemožných vložených features, např. \\n, použitím \' php bere string jako pouze string, takže buď
"Vystupni soubor: {$jmenoOut}";
sprintf('Vystupni soubor: %s', $jmenoOut);
nebo
'Vystupni soubor: ' . $jmenoOut;
20. 10. 2021, 13:16 editováno autorem komentáře
A ja bych doplnil, ze i tak jste tam zanechal z meho pohledu puvodni autorovu chybu.
Ta oddelovaci dvojtecka vcetne mezery by v tom retezci byt nemela. Oddelovac by mel byt definovany predem, ne podle toho, jak se kdo upise. Pak se omezi tyto problemy:
- jednou s mezerou, jednou bez mezery
- pri parsovani obsahuje ta promenna dvojtecku s mezerou
- preklad do jineho textu atd.
@czechsys
Oddělovač je jak vidím definovaný předem. Je to ta dvojtečka. Text alá "<něco>: " je text tak běžný jako JSON sám. Někdy taky potřebujete mít logy/výstup formátovaný pro čtení lidmi.
Běžný JSON parser by si s tím měl poradit. Parser přímo pro JSON jsem nikdy nedělal, ale různé jiné parsery ano. Parser musí brát v potaz cekovou trukturu, tedy např. {"":""} i kdyby tam bylo dvojeteček plný pytel. Klíč může být např. ":<něco>" ... Ale je to k zamyšlení, já používám jak <něco>: tak např. Entity::id=
Každopádně, nevím jestli zadáním bylo, aby to byl čistě nutně strojově parsovatelný výstup. Ve zprávě logu může být i uživatelem definované jméno, ale dvojtečky ani tečky či čárky a apostrofy bych uživatelům po světě nazakazoval.
Překlad by se řešil už při zapisování logu, a nebo vám bude jedno co tam je, buď budete mít shodu na text který má být nahrazen a to od písmene prvního až po poslední, a nebo ne.
A nebo špatně chápu Vaši poznámku.
27. 10. 2021, 22:36 editováno autorem komentáře