PDA

View Full Version : Programma per sistemare Log File


FabryHw
07-10-2010, 19:06
Ho svariate centinaia di MB di log files (generati per lo più da sw Java, ma non ha importanza la fonte che ha generato i log) che devo sistemare.

Per un errore nel sw, i vari files non sono insiemi disgiunti ma contengono parti duplicate e sovrapposte tra loro.
Ossia per esempio il log del 15esima settimana contiene parte della 13esima settimana, tutta la 14esima settimana e naturalmente la 15esima settimana.
Poi il file della 16esima settimana contiente parte delle 15esima e tutta la 16esima, il file della 17esima settimana invece è giusto e così via.

Io cerco un sw che mi permetta di fare 2 cose:

Concatenare tutti i files in unico file eliminado automaticamente (ma con precisione) le parti ripetute
Suddividere, se mi servisse, il file unico in file più piccoli frammentando per mese, per settimana o per giorno secondo le mie necessità


Finora perché erano pochi casi ho sempre sistemato tutto a mano (taglia ed incolla a mano), ma ora cercavo qualcosa di automatico dato che il numero di log errati che devo sistemare è cresciuto.
E siccome non avevo voglia di mettermi lì a scrivere un sw o anche uno script (esempio in Python) che faccia il lavoro, mi chiedevo cosa posso trovare (per windows e/o linux) di già pronto che soddisfi le mie necessità.

Suggerimenti ?

Ciao

khelidan1980
07-10-2010, 19:18
Ho svariate centinaia di MB di log files (generati per lo più da sw Java, ma non ha importanza la fonte che ha generato i log) che devo sistemare.

Per un errore nel sw, i vari files non sono insiemi disgiunti ma contengono parti duplicate e sovrapposte tra loro.
Ossia per esempio il log del 15esima settimana contiene parte della 13esima settimana, tutta la 14esima settimana e naturalmente la 15esima settimana.
Poi il file della 16esima settimana contiente parte delle 15esima e tutta la 16esima, il file della 17esima settimana invece è giusto e così via.

Io cerco un sw che mi permetta di fare 2 cose:

Concatenare tutti i files in unico file eliminado automaticamente (ma con precisione) le parti ripetute
Suddividere, se mi servisse, il file unico in file più piccoli frammentando per mese, per settimana o per giorno secondo le mie necessità


Finora perché erano pochi casi ho sempre sistemato tutto a mano (taglia ed incolla a mano), ma ora cercavo qualcosa di automatico dato che il numero di log errati che devo sistemare è cresciuto.
E siccome non avevo voglia di mettermi lì a scrivere un sw o anche uno script (esempio in Python) che faccia il lavoro, mi chiedevo cosa posso trovare (per windows e/o linux) di già pronto che soddisfi le mie necessità.

Suggerimenti ?

Ciao

forse è meglio che correggi il baco originale se possibile, la prima richiesta mi pare alquanto difficile da esaudire

FabryHw
07-10-2010, 20:50
forse è meglio che correggi il baco originale se possibile, la prima richiesta mi pare alquanto difficile da esaudire

Questo non è possibile o facile a breve.
Sia perché il problema non sta nel mio sw ma nella libreria di logging (che ho aggiornato ad ogni nuova release uscita ma continua a fare il difetto), sia perché non ho capito perché si comporta così (bug della libreria, errore nel file di conf, problemi di memoria non sufficiente, ...ecc).

E cmq rimane sempre il problema dei log già generati e che devono essere sistemati (non mi basta sistemare il futuro, anzi mi è più utile sul passato).

In realtà visto che ogni riga nei file di log inizia con un preciso timestamp, l'operazione in sé non è difficile.
Basta leggere il file X e guardare l'ultima riga, poi cercare nel file X+1 quella riga e prendere il testo da lì in poi e così via.

Questo è sia il procedimento da seguire a mano che quello per un eventuale sw.
Solo che non ho tempo e voglia di scrivermi io il sw e cercavo qualcosa di esistente che già implementasse una tale richiesta (nonché anche la seconda che ho fatto).

khelidan1980
08-10-2010, 08:11
Sinceramente su due piedì non mi viene in mente un sw che faccia questo lavoro, sopratutto sempre parlando della prima richiesta senza scriverlo ad hoc, comunque sei sicuro che non sia un problema di configurazione, accesso concorrente ai file di log, cluster etc etc?


Ps: ma la libreria quale è? Qualcosa di pubblico tipo Log4j?

Kralizek
08-10-2010, 08:21
se il formato dei file é omogeneo, perché non crei una tabella ad hoc su un database e, file per file, inserisci i record controllandone l'unicitá secondo i tuoi criteri.

alla fine estrai tutto e lo salvi in un unico file

FabryHw
08-10-2010, 08:50
Sinceramente su due piedi non mi viene in mente un sw che faccia questo lavoro, sopratutto sempre parlando della prima richiesta senza scriverlo ad hoc, comunque sei sicuro che non sia un problema di configurazione, accesso concorrente ai file di log, cluster etc etc?


Ps: ma la libreria quale è? Qualcosa di pubblico tipo Log4j?

La libreria è LogBack (+ SL4J) che è proprio l'erede di Log4j

Doveva secondo il file di conf, archiviare ogni singolo giorno di log in un file zippato e questo per 3 log distinti (e per più clienti alias più installazioni).
Solo che a distanza di mesi quando sono andato a vedere la cartella di log l'ho trovata enorme (oltre il GB).

Alcuni log non li ha mai tagliati, ma ogni giorno ha archiviato una copia dell'intero log (ok sarà zippato ma è un file che continua a crescere e che viene duplicato ogni giorno) ed in altri casi invece ha tagliato ma random.
Ossia, per esempio, giorno 5 archiviato singolo, poi 5 + 6, poi 5-7, ...ecc
Finalmente al giorno 21 taglia giusto e dal 22 riparte con singolo giorno, ma già al 23 va in errore ancora.
In alcuni casi ha tagliato a metà del giorno e non sempre alla mezzanotte come dovrebbe, come alcune volte non ha archiviato nulla lasciando un temp file in giro.

Non ho ancora capito (anche se qualche sospetto ce l'ho) cosa gli impedisce di funzionare giusto, ma cmq il mio problema primario è sistemare i log fin qui pasticciati.

Un log l'ho sistemato a mano, erano un totale di quasi 3-4GB di files, ma una volta concatenato il tutto tagliando le parti comuni è rimasto un singolo file da 700MB (al più ora ho il problema di rifrazionarlo giusto, magari non singolo giorno ma su settimana o mese).
Grazie a grossi intervalli ripetuti ho dovuto fare a mano solo un decina o poco più di taglia ed incolla, ma non voglio sistemare a mano tutti i log che rimangono.

FabryHw
08-10-2010, 08:59
se il formato dei file é omogeneo, perché non crei una tabella ad hoc su un database e, file per file, inserisci i record controllandone l'unicitá secondo i tuoi criteri.

alla fine estrai tutto e lo salvi in un unico file

Si è un'idea che ho pure io (soprattutto perché con i DB me la cavo molto bene).
Basterebbe una tabella con 3 campi :

NomeFileSorgente
IdRigaNelFile
TestoRiga


Importare tutti i file e poi con delle abbastanza semplici query sql estrarre il testo senza duplicazioni.

L'unica cosa che mi ha evitato di farlo finora è che mi sembrava uno spreco di risorse.
Alcuni testi sono già su file qualcosa come 3 o più GB di dati, quindi tirati dentro un DB crescerebbero di dimensione (e già un MS SQL Express non basterebbe visto il limite dei 4GB di DB).

Ossia cercavo di fare qualcosa a livello di file.
Avevo pensato anche ad un uso incrementale di tool di diff&merge (es. winmerge in ambito windows) ma non saprei come fare il loop su tutti i file.
Insomma dovrei dirgli qualcosa come "tieni fisso il file a sx e continua a leggere nella finestra di dx nuovi file, integrando nella file a sx il testo nuovo presente solo a dx"

yorkeiser
08-10-2010, 11:16
In che formato sono questi log?
Se ad esempio hanno un inizio riga fisso, tipo giorno + ora + qualcosa, insomma un criterio che ti permetta di discernere "dove" andare a copiare le righe, metterli a posto con un programmino automatico è banale, saranno sì e no 30 righe di codice.

banryu79
08-10-2010, 11:23
In che formato sono questi log?
Se ad esempio hanno un inizio riga fisso, tipo giorno + ora + qualcosa, insomma un criterio che ti permetta di discernere "dove" andare a copiare le righe, metterli a posto con un programmino automatico è banale, saranno sì e no 30 righe di codice.
Anche secondo me, fa prima a scriverselo :)

FabryHw
08-10-2010, 11:25
In che formato sono questi log?
Se ad esempio hanno un inizio riga fisso, tipo giorno + ora + qualcosa, insomma un criterio che ti permetta di discernere "dove" andare a copiare le righe, metterli a posto con un programmino automatico è banale, saranno sì e no 30 righe di codice.

Ogni riga inizia con un timestamp del tipo "2010-06-28 06:00:00,015 [Nome Thread]".

Fanno eccezione alla regola solo 2 o 3 casi:

1 - Quando viene stampato uno stack trace per una eccezione (gestita ma cmq scritta nei log per tenerne traccia) il timestamp c'è solo sulla prima riga delle molte righe di stack che possono essere scritte.
2 - Quando viene stampato (se il debug mode è attivo) il contenuto XML ricevuto o inviato, c'è una riga con il TimeStamp del tipo "XML scritto sul DB:" e sotto le righe che sono la stampa del XML senza timestamp
3 - Quando viene salvato l'output testuale di qualche applicazione esterna richiamata (o anche metodo remoto via Corba), se tale output è multiriga ovviamente il timestamp c'è solo sulla prima.

FabryHw
08-10-2010, 11:35
Anche secondo me, fa prima a scriverselo :)

Si mi sto rassegnando all'idea.
Sto sistemando ancora a mano un log, perché anche qui si tratta di un 20-30 min di lavoro e ci può stare (meno tempo del fare il sw), ma visto che il lavoro dovrò ripeterlo più volte in tutti i posti (e per tutti i log) che ha scazzato, un sw mi servirà.

Mi sa che se non trovo qualcosa di pronto entro poco tempo, vado davvero con l'idea del DB.
E' la meno efficiente come risorse, ma probabilmente la più veloce da realizzare dato che tool di import file di testo dovrei averli già belli che pronti (o quasi), e con le query me la cavo molto bene.
Mentre con l'elaborazione stringhe ed accesso a file sono un po' più arrugginito.
Ci riuscirei anche con lo script (per esempio in python o in java stesso magari da usare con beanshell) ma probabilmente nel triplo del tempo di sviluppo.

yorkeiser
08-10-2010, 11:42
Se le eccezioni sono poche, puoi quindi supporre che una riga di tipo "non standard" sia stata scritta nella stessa giornata (mi pare di capire ti serva una suddivisione per settimane) della riga "standard" (ovvero con timestamp classico) subito precedente nel file di log.

Un algoritmo di base potrebbe essere:

per ogni file di log "vecchio":
apri il file in lettura
cs=null //accumulatore per salvare il valore della settimana
while not fine file
leggi riga
se cs != calcola_settimana(timestamp appena letto dalla riga) or cs==null
chiudi file su cui stai scrivendo, se ce ne sono
apri file "Nuovo file di log Settimana cs" in append
scrivi riga
altrimenti
scrivi riga