Tracey este un proiect personal, realizat în C++, folosind Qt Framework sub licența LGPL v3.0. Scopul aplicației este eficientizarea monitorizării și analizării fișierelor de log în format text, în special a celor de dimensiuni mari, oferind funcții de monitorizare și filtrare automată, într-un pachet minimal, cu o interfață simplă și ușor de folosit.
Numele aplicației derivă din noțiunea de software tracing, o formă specializată de logging, al cărei scop este obținerea de informații detaliate despre funcționarea unui program. Cu toate că de multe ori aceste două noțiuni sunt folosite ca sinonime, se pot sublinia câteva diferențe în tabelul de mai jos.
General logging | Tracing |
---|---|
Destinat în special pentru utilizatori | Destinat în special pentru programatori |
Conține informații high level (acțiuni, evenimente, erori) | Conține informații low level (stack trace, accesare funcții etc.) |
Trebuie să fie cât mai succint, fără informații duplicate. | Poate fi extrem de detaliat și cu multe informații duplicate |
Performanța programului nu este afectată. | Performanța programului se reduce simțitor. |
Nu trebuie să conțină niciodată informații sensibile. | Poate și chiar este necesar să conțină informații sensibile. |
Nu necesită mecanism de dezactivare. | Necesită mecanism de dezactivare. |
Atunci când se activează codul de tracing, cantitatea de date scrisă în fișiere devine extrem de mare, acestea ajungând rapid la dimensiuni la care nu mai pot fi citite eficient sau chiar deloc de aplicații uzuale pentru fișiere text. O alternativă este tăierea acestora, manuală sau automată, însă rezultatul este un număr mare sau foarte mare de fișiere care nu pot fi urmărite sau analizate eficient.
Tracey permite monitorizarea și filtrarea automată a fișierelor de dimensiuni oricât de mari, limitat doar de memorie, în același timp oferind și posibilitatea de lucru cu părți de fișiere.
Tracey nu este un editor de text, are doar rol de vizualizare, nefiind posibilă alterarea fișierelor originale.
Pentru lucrul cu fișiere mari am luat în considerare două idei de implementare. Prima și cea mai evidentă este încărcarea fișierului în totalitate în memorie, a doua este încărcarea doar a unei părți din fișier, pe măsura ce e nevoie a fi vizualizată. A doua opțiune pare de preferat, oferind o viteză mult mai mare de acces și un consum de memorie foarte mic comparativ cu dimensiunea fișierului. Problema apare la efectuarea de operații repetate de căutare asupra întregului conținut, care trebuie citit de pe disc de fiecare dată. În plus, apar probleme de performanță pe partea de interfață, în special atunci când fișierele se află pe un disc cu rată de transfer mică, în special în rețea sau în cazul vizualizării mai multor fișiere în paralel.
S-a pornit experimental cu implementarea celei de-a doua metode. Testele de performanță și memorie pentru vizualizare oferă rezultate extrem de bune, având în vedere că doar se scana fișierul pentru a obține poziția fiecărei linii. Însă, în ceea ce privește navigarea prin fișier și mai ales filtrarea, performanța devenea extrem de slabă. Prin urmare, s-a făcut trecerea la prima metodă.
Încărcând tot fișierul în memorie, performanța inițială este redusă, aproximativ 20 de secunde pentru un fișier de 1GB, cu word wrap activ, folosind un SSD obișnuit. Memoria ocupată este de aproximativ două ori mai mare decât dimensiunea fișierului, datorită implementării Unicode, dar în majoritatea cazurilor nu este necesară încărcarea întregului fișier, Tracey oferind o serie de opțiuni pentru încărcare parțială, descrise mai jos, ceea ce reduce masiv timpul de încărcare și memoria folosită (100MB in aproximativ 2 secunde). De asemenea, dat fiind că aplicația este multithreading, nu este necesară încărcarea completă a fișierului înainte de a începe o filtrare, aceasta făcându-se automat pe măsură ce fișierul se încarcă.
Din cauza dimensiunii mari a fișierelor, folosirea unei componente destinate afișării de text nu este posibilă în mod direct. Prin urmare, liniile de text sunt stocate într-o listă, iar componenta utilizată pentru afișare acționează doar ca viewport pentru intervalul de linii care trebuie afișat în funcție de poziția în listă. Acest lucru a presupus reimplementarea tuturor funcțiilor de navigare și selectare.
Ca limbaj de programare s-a optat pentru C++ si utilizarea Qt Framework, care oferă o performanță solidă și în plus permite o implementare ușoară multiplatformă. Executabilul final, compilat static, după compresie cu UPX, are aproximativ 5MB și nu necesită nici un fel de dependințe.
Tracey permite monitorizarea unui fișier fără încărcarea conținutului existent. Așadar, prima opțiune este dacă să se încarce sau nu conținutul fișierului. În cazul în care se dorește încărcarea conținutului fișierului se poate alege un interval de început și sfârșit, fie ca poziție în fișier, fie ca poziție relativă la sfârșitul fișierului (tail), fie ca număr de linie. Se pot utiliza prescurtările k, M, G pentru kilo, mega și giga. De exemplu, o valoare de 10M pentru câmpul Start și opțiunea Tail va încarcă ultimii 10M din fișier.
Ca mod de tratare a liniilor mari sau foarte mari se poate alege intre Cut si Wrap și se poate alege dimensiunea maximă a liniei în caractere.
Tracey monitorizează automat schimbările din fișier, cu excepția cazului în care se introduce o valoare pentru sfârșitul intervalului de încărcare. Modificările sunt încărcate și filtrate automat în toate filtrele active.
Asupra unui fișier se pot aplica mai multe filtre simultan, fiecare filtru fiind conținut într-un tab propriu. Filtrele sunt implementate ca expresii logice folosind operatorii &,\|, ! si paranteze. Filtrele se aplică fiecărei linii din fișier. Se pot folosi opțiunile Match Case si Whole Word, pentru restrângerea căutării.
Exista trei moduri de căutare, care determină modul în care se face căutarea pentru fiecare, operând din expresie:
Normal - operanzii sunt tratați ca text normal.
Wildcard - operanzii sunt căutați folosind wildcards (* - înlocuiește oricâte caractere, ? - înlocuiește un singur caracter)
În plus, este posibilă specificarea unui număr de linii înainte și după liniile care rezultă după filtrare, lucru util de exemplu, în cazul în care se caută un stack trace.
Opțiunea Source Lines permite afișarea concomitentă a numărului de linie din fișierul sursă. Se poate naviga ușor în fișierul sursă folosind opțiunile din context menu (Show in Trace, Mark in Trace, Mark All in Trace).
Pe lângă partea de filtrare se poate face căutare standard în oricare din ferestre, cu aceleași opțiuni ca la filtrare. În plus, se poate folosi funcția de contorizare sau de navigare la o anumită linie și coloană.
Este posibilă aplicarea de marcări pe linii, cu acces rapid din fereastra Marks.
Partea de highlighting este implementată sub forma de reguli, care pot fi grupate după preferințe personale. În acest moment este posibilă doar aplicarea unui singur grup de highlighting, prin utilizarea combo box-ului care se găsește în fiecare fereastră.
Ca idei pentru viitor deocamdată este in plan o îmbunătățire a părții de highlighting, prin aplicarea mai multor grupuri deodată, plus adăugarea de highlighting standard pentru anumite tipuri de fișiere, gen XML și adăugarea unei funcții opționale de notificare atunci când un anumit filtru are un rezultat.
Tracey este un program gratuit, sub licența MIT, se poate descărca la următoarea adresă:
de Ovidiu Mățan
de Daniel Butean , Alex Ghiran , Călin Manea
de Ovidiu Mățan
de Radu Ilea