ABONAMENTE VIDEO REDACȚIA
RO
EN
Numărul 148 Numărul 147 Numărul 146 Numărul 145 Numărul 144 Numărul 143 Numărul 142 Numărul 141 Numărul 140 Numărul 139 Numărul 138 Numărul 137 Numărul 136 Numărul 135 Numărul 134 Numărul 133 Numărul 132 Numărul 131 Numărul 130 Numărul 129 Numărul 128 Numărul 127 Numărul 126 Numărul 125 Numărul 124 Numărul 123 Numărul 122 Numărul 121 Numărul 120 Numărul 119 Numărul 118 Numărul 117 Numărul 116 Numărul 115 Numărul 114 Numărul 113 Numărul 112 Numărul 111 Numărul 110 Numărul 109 Numărul 108 Numărul 107 Numărul 106 Numărul 105 Numărul 104 Numărul 103 Numărul 102 Numărul 101 Numărul 100 Numărul 99 Numărul 98 Numărul 97 Numărul 96 Numărul 95 Numărul 94 Numărul 93 Numărul 92 Numărul 91 Numărul 90 Numărul 89 Numărul 88 Numărul 87 Numărul 86 Numărul 85 Numărul 84 Numărul 83 Numărul 82 Numărul 81 Numărul 80 Numărul 79 Numărul 78 Numărul 77 Numărul 76 Numărul 75 Numărul 74 Numărul 73 Numărul 72 Numărul 71 Numărul 70 Numărul 69 Numărul 68 Numărul 67 Numărul 66 Numărul 65 Numărul 64 Numărul 63 Numărul 62 Numărul 61 Numărul 60 Numărul 59 Numărul 58 Numărul 57 Numărul 56 Numărul 55 Numărul 54 Numărul 53 Numărul 52 Numărul 51 Numărul 50 Numărul 49 Numărul 48 Numărul 47 Numărul 46 Numărul 45 Numărul 44 Numărul 43 Numărul 42 Numărul 41 Numărul 40 Numărul 39 Numărul 38 Numărul 37 Numărul 36 Numărul 35 Numărul 34 Numărul 33 Numărul 32 Numărul 31 Numărul 30 Numărul 29 Numărul 28 Numărul 27 Numărul 26 Numărul 25 Numărul 24 Numărul 23 Numărul 22 Numărul 21 Numărul 20 Numărul 19 Numărul 18 Numărul 17 Numărul 16 Numărul 15 Numărul 14 Numărul 13 Numărul 12 Numărul 11 Numărul 10 Numărul 9 Numărul 8 Numărul 7 Numărul 6 Numărul 5 Numărul 4 Numărul 3 Numărul 2 Numărul 1
×
▼ LISTĂ EDIȚII ▼
Numărul 89
Abonament PDF

Aplicație de monitorizare, filtrare și analiză de fișiere text

Claudiu Arseniu
Senior Java Developer @ Siemens



PROGRAMARE


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.

Implementare

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.

Opțiuni de deschidere a fișierelor

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.

Opțiuni de filtrare

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:

Î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).

Căutare, marcare si highlighting

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ă.

Idei pentru viitor

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.

Licența

Tracey este un program gratuit, sub licența MIT, se poate descărca la următoarea adresă:

https://carseniu.github.io/Tracey/.

LANSAREA NUMĂRULUI 149

Marți, 26 Octombrie, ora 18:00

sediul Cognizant

Facebook Meetup StreamEvent YouTube

NUMĂRUL 147 - Automotive

Sponsori

  • Accenture
  • BT Code Crafters
  • Accesa
  • Bosch
  • Betfair
  • MHP
  • BoatyardX
  • .msg systems
  • P3 group
  • Ing Hubs
  • Cognizant Softvision
  • Colors in projects