Ho creato un semplice algoritmo che rende i miei log più adatti per essere tracciati. Un file di registro ha la seguente struttura:
timestamp bytes
e assomiglia a questo:
1485762953167032 517
1485762953167657 517
1485762953188416 517
1485762953188504 517
1485762953195641 151
1485762953196256 151
1485762953198736 216
1485762953200099 216
1485762953201115 1261
1485762953201658 151
1485762953201840 151
1485762953202040 1261
1485762953203387 216
1485762953204183 216
1485762953206935 549
1485762953207548 546
1485762953259335 306
1485762953260025 1448
1485762953260576 1448
1485762953261087 1448
1485762953261790 1500
1485762953263878 1500
1485762953264273 1448
1485762953264914 1500
Ottengo il mio timestamp con gettimeofday(&t, NULL)
e raggiungo un long long timestamp = (t.tv_sec * 1000000) + t.tv_usec
preciso.
Quando ho detto prima "rende i miei registri più adatti" intendevo "il timestamp dovrebbe essere impostato su secondi di precisione, non su microsecondi", quindi entrambe le colonne saranno modificate.
Il mio algoritmo ingenuo è qualcosa di simile (è in Bash e dal momento che forse non piace a tutti, hai il suo pseudocodice): pronto ogni riga del file di log, trasforma il timestamp da microsecondi a secondi dividendo un milione, se è il lo stesso timestamp trasformato di quello della riga precedente, aggiorna il conteggio di byte e pacchetti (un pacchetto per riga).
for every file.log {
TIMESTAMP=0
BYTES=0
PACKETS=0
echo "Creating file $LOGFILE.plt..."
create file $LOGFILE.plt
echo "Preparing $LOGFILE for plotting..."
while read file.log LINE {
# LINE is a array: LINE[0] contains timestamp, LINE[1] contains bytes
if PACKETS == 0 {
# first row
TIMESTAMP = LINE[0] / 1000000
BYTES = BYTES + LINE[1]
PACKETS += 1
echo TIMESTAMP " " BYTES " " PACKETS
}
TEMP_TIMESTAMP = LINE[0] / 1000000
if TIMESTAMP == TEMP_TIMESTAMP {
BYTES = BYTES + LINE[1]
PACKETS += 1
}
else {
if PACKETS != 0 {
log in file "TIMESTAMP BYTES PACKETS" >> $LOGFILE.plt
}
TIMESTAMP = TEMP_TIMESTAMP
BYTES=0
PACKETS=1
}
}
}
Poiché legge ogni riga del file di log è almeno O (n) e per un lungo file di log potrebbe volerci un po 'di tempo: c'è un modo per ridurre questa volta?
Non riesco a fare questa ottimizzazione nel mio codice: è un programma basato su prestazioni in tempo reale (ad esempio streaming e altri servizi di risposta), quindi deve fare il minimo sforzo possibile; già registra, non è in grado di calcolare le cose di ottimizzazione anche sui log.