io non sono sicuro di come parola questo quindi mi tipo fuori e quindi modificare e rispondere alle domande che sorgono ..Tailing file di registro e scrivere i risultati al nuovo file
Attualmente sul mio dispositivo di rete locale (Basato su PHP4) Sto usando questo per accodare un file di log dal vivo: http://commavee.com/2007/04/13/ajax-logfile-tailer-viewer/
Questo funziona bene e ogni 1 secondo carica una pagina esterna (logfile.php) che fa un tail -n 100 logfile.log
Lo script non fa nessuno buffering in modo che i risultati visualizzati sullo schermo siano le ultime 100 righe del file di registro.
Il logfile.php contiene:
<? // logtail.php $cmd = "tail -10 /path/to/your/logs/some.log"; exec("$cmd 2>&1", $output);
foreach($output as $outputline) {
echo ("$outputline\n");
}
?>
Questa parte funziona bene.
ho adattato alla pagina logfile.php di scrivere il $ outputline in un nuovo file di testo, semplicemente utilizzando fwrite($fp,$outputline."\n");
Mentre questo funziona sto avendo problemi con la duplicazione nel nuovo file creato.
Ovviamente ogni volta che tail -n 100 viene eseguito produce risultati, la prossima volta che viene eseguito potrebbe produrre alcune delle stesse linee, poiché questo ripete Posso finire con più righe di duplicazione nel nuovo file di testo.
Non riesco a confrontare direttamente la riga che sto per scrivere sulle righe precedenti in quanto potrebbero esserci corrispondenze identiche.
Esiste un modo per confrontare questo blocco corrente di 100 righe con il blocco precedente e quindi solo scrivere le righe che non corrispondono. È possibile che il blocco A & B contenga le righe identiche necessarie.
È possibile aggiornare logfile.php per prendere nota della posizione in cui è stata utilizzata per ultimo nel mio file di registro e quindi leggere solo le successive 100 righe da lì e scriverle nel nuovo file?
Il file di registro potrebbe essere fino a 500 MB, quindi non voglio leggere tutto in ogni volta ..
Qualsiasi consiglio o suggerimenti di benvenuto ..
Grazie
UPDATE @ 16 : 30
ho sorta di ottenuto questo lavoro utilizzando:
$file = "/logs/syst.log";
$handle = fopen($file, "r");
if(isset($_SESSION['ftell'])) {
clearstatcache();
fseek($handle, $_SESSION['ftell']);
while ($buffer = fgets($handle)) {
echo $buffer."<br/>";
@ob_flush(); @flush();
}
fclose($handle);
@$_SESSION['ftell'] = ftell($handle);
} else {
fseek($handle, -1024, SEEK_END);
fclose($handle);
@$_SESSION['ftell'] = ftell($handle);
}
Sembra funzionare, ma prima carica l'intero file e poi solo gli aggiornamenti.
Come posso iniziare dalle ultime 50 righe e quindi solo dagli aggiornamenti?
Grazie :)
UPDATE 04.06.2013 Anche se questo funziona è molto lento con file di grandi dimensioni.
Ho provato questo codice e sembra più veloce, ma non si legge solo da dove era stato interrotto.
function last_lines($path, $line_count, $block_size = 512){
$lines = array();
// we will always have a fragment of a non-complete line
// keep this in here till we have our next entire line.
$leftover = "";
$fh = fopen($path, 'r');
// go to the end of the file
fseek($fh, 0, SEEK_END);
do{
// need to know whether we can actually go back
// $block_size bytes
$can_read = $block_size;
if(ftell($fh) < $block_size){
$can_read = ftell($fh);
}
// go back as many bytes as we can
// read them to $data and then move the file pointer
// back to where we were.
fseek($fh, -$can_read, SEEK_CUR);
$data = fread($fh, $can_read);
$data .= $leftover;
fseek($fh, -$can_read, SEEK_CUR);
// split lines by \n. Then reverse them,
// now the last line is most likely not a complete
// line which is why we do not directly add it, but
// append it to the data read the next time.
$split_data = array_reverse(explode("\n", $data));
$new_lines = array_slice($split_data, 0, -1);
$lines = array_merge($lines, $new_lines);
$leftover = $split_data[count($split_data) - 1];
}
while(count($lines) < $line_count && ftell($fh) != 0);
if(ftell($fh) == 0){
$lines[] = $leftover;
}
fclose($fh);
// Usually, we will read too many lines, correct that here.
return array_slice($lines, 0, $line_count);
}
In qualsiasi modo questo può essere modificato in modo da leggere dall'ultima posizione nota ..?
Grazie
Il mio primo suggerimento sarebbe di aggiornare PHP. http://php.net/eol.php – vascowhite
Purtroppo non è possibile.È incorporato nel dispositivo :( – MacMan
Può il dispositivo eseguire perl? Potrebbe essere un one-liner epico in perl .. –