pondelok 12. apríla 2010

Farebné logy

Čítanie logov vo všeobecnosti nepatrí medzi veľmi obľúbené činnosti.

Väčšinou je potrebné nájsť nejakú konkrétnu informáciu v konečnom zozname logov. Na to je skvelý niekoľkonásobne zreťazený grep, grep -v a prípadne čerešnička zo sed s awk.

Niekedy je ale potrebné pozerať všetky logy a reagovať na vznikajúce problémy ešte pred tým, ako zákazník niečo zbadá. Nič tak nepoteší zákazníka ako telefonát od Vášho dohľadového technika že našiel problém v produkčnom systéme, ale už pracuje na jeho odstránení.

Tiež je vhodné sledovať všetky logy pri štarte serverov, pri kompilácii (maven píše zaujímavé veci) atď.

Ak logy obsahujú DEBUG hlášky spolu s INFO, WARN a ERROR, je z toho neprehľadný guláš a výsledok sa nedá sledovať dlhšie ako pár minút.

Logy je preto vhodné nejako zafarbiť, aby bolo hneď vidno čo je DEBUG výpis, čo je ERROR hláška a kde je nejaký WARNING.

Našiel som zopár farbičov logov, skúsil som perlový filer colorize.pl (archív), céčkový multitail a pythonovský grc.

Nápaditosťou názvu by určite vyhral posledný z nich, funkčnosťou sa mi najviac páčil perlovský colorize.

Colorize je totiž krásne jednoduchý.

Colorize funguje ako filter. Pri volaní definujete sadu dvojíc parametrov, kde na prvá časť hovorí ako sa majú dáta zvýrazniť (celý riadok alebo len nájdená časť) a aké dáta sa majú hľadať (regexp). Takýchto definičných dvojíc môžete mať koľko chcete potrebujete. Farbenia sa dajú aj kombinovať a dá sa zafarbiť podreťazec (napr. transactionId žltou) v rámci zafarbeného riadku (napr. DEBUG šedou).

Pre rôzne typy logov mám napísané špeciálne definície filtrov, a teda napr. maven build mám v colormvn, aplikačné logy filtrujem cez color. Tieto skripty len volajú colorize.pl s príslušnými parametrami.

Definičný farbič môže vyzerať napr. takto:
#/bin/bash
colorize.pl \
 +l28:BUILD\ SUCCESSFUL \
 +l18:BUILD\ FAILED \
 -n78:INFO \
 -l18:SKIPPING\|ERROR\|FAILURE \
 -l38:WARN\|Exception \
 -l08:DEBUG\|Hibernate
kde napr.
+l28:BUILD\ SUCCESSFUL
je (+) časť riadku (l) low intensity (2) zelená (8) na priesvitnom pozadí pre text "BUILD SUCCESSFUL";
-l08:DEBUG\|Hibernate
je (-) celý riadok (l) low intensity (0) biela na (8) priesvitnom pozadí pre riadky obsahujúce "DEBUG" alebo "Hibernate"

Ak by bol riadok s reťazcom "DEBUG" aj s reťazcom "BUILD SUCCESSFUL", aplikuje sa najskôr na celý riadok DEBUG farbenie bielou slabej intenzity (šedá) a na reťazec "BUILD SUCCESSFUL" pôjde tmavo zelená.

Colorize.pl mám v /usr/local/bin a užívateľské farbiče je vhodné umiestniť do ~/bin/ ktorý je štandardne v ceste.
Ak je nejaký farbič používaný viacerými užívateľmi systému, je fajn dať ho tiež do /usr/local/bin len treba dať pozor že tento adresár je štandardne v ceste pred ~/bin/ takže jednoduché prekrytie je problematické.

EDIT:
pridávam príklady farieb, kvôli viditeľnosťi na čiernom pozadí.

[style]
n = normal, l = light, u=underscore, i = inverted, b = blinking

style n = normal
 0= black  1= red  2= green  3= yellow  4= blue  5= purple  6= cyan  7= white 

style l = light
0 = black  1= red  2= green  3= yellow  4= blue  5= purple  6= cyan  7= white 

[background color]
 0= black ,  1= red ,  2= green ,  3= yellow ,  4= blue ,  5= purple ,  6= cyan ,  7= white , 8= none

UPDATE:
Stránka colorize scriptu zmizla, v archive.org sa dá pozrieť najnovšia archivovaná verzia. Skript samotný však archivovaný nie je.