के परिणाम लिखें मुझे यकीन है कि कैसे करने के लिए शब्द यह तो मैं इसे बाहर टाइप करेंगे और फिर से संपादित करें और किसी भी सवाल है कि आने का जवाब नहीं कर रहा हूँ ..पीछा लॉग फाइल और नई फ़ाइल
वर्तमान में अपने स्थानीय नेटवर्क डिवाइस पर (PHP4 आधारित) मैं इसका उपयोग एक लाइव सिस्टम लॉग फ़ाइल को पूंछ करने के लिए कर रहा हूं: http://commavee.com/2007/04/13/ajax-logfile-tailer-viewer/
यह अच्छी तरह से काम करता है और प्रत्येक 1 सेकंड यह एक बाहरी पृष्ठ (logfile.php) लोड करता है जो tail -n 100 logfile.log
करता है स्क्रिप्ट कोई नहीं करता बफरिंग ताकि परिणाम स्क्रीन पर प्रदर्शित होने वाले परिणाम लॉग फ़ाइल से अंतिम 100 लाइनें हैं।
logfile.php शामिल हैं:
<? // logtail.php $cmd = "tail -10 /path/to/your/logs/some.log"; exec("$cmd 2>&1", $output);
foreach($output as $outputline) {
echo ("$outputline\n");
}
?>
इस भाग में अच्छी तरह से काम कर रहा है।
मैं logfile.php पेज ढाल लिया है, एक नया पाठ फ़ाइल में $ outputline लिखने के लिए बस fwrite($fp,$outputline."\n");
का उपयोग कर जबकि इस काम करता है मुझे लगता है कि बनाई गई है नई फ़ाइल में दोहराव के साथ मुद्दों कर रहा हूँ।
स्पष्ट रूप से प्रत्येक बार पूंछ-एन 100 रन उत्पन्न होता है, अगली बार जब यह चलता है तो यह कुछ समान लाइनों का उत्पादन कर सकता है, क्योंकि यह दोहराता है कि मैं नई टेक्स्ट फ़ाइल में डुप्लिकेशंस की कई पंक्तियों के साथ समाप्त कर सकता हूं।
मैं पिछली लाइनों पर लिखने वाली लाइन की तुलना सीधे तुलना नहीं कर सकता क्योंकि समान मिलान हो सकते हैं।
क्या कोई तरीका है कि मैं पिछले ब्लॉक के साथ 100 लाइनों के इस मौजूदा ब्लॉक की तुलना कर सकता हूं और फिर केवल उन पंक्तियों को लिख सकता हूं जो मिलान नहीं कर रहे हैं .. फिर से संभव है कि ब्लॉकबी में समान रेखाएं होंगी जो आवश्यक हैं ..
क्या लॉगफाइल.एफ़पी अपडेट करना संभव है कि यह आखिरी बार मेरे लॉगफाइल में ली गई स्थिति को नोट करें और फिर वहां से अगले 100 लाइनें पढ़ें और उन्हें नई फ़ाइल में लिखें?
लॉग फ़ाइल 500MB तक हो सकता है तो मैं यह सब हर बार में पढ़ने के लिए नहीं करना चाहते हैं ..
कोई सलाह या सुझाव का स्वागत करते हैं ..
धन्यवाद
अद्यतन @ 16 :
$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);
}
: 30
मैं इन सबसे छुटकारा इस काम के उपयोग करते हुए मिल गया है 10
ऐसा लगता है, लेकिन यह पूरी फ़ाइल को पहले लोड करता है और फिर केवल अपडेट लोड करता है।
मैं इसे अंतिम 50 लाइनों के साथ कैसे शुरू करूंगा और फिर केवल अपडेट?
धन्यवाद :)
अद्यतन 2013/04/06 जबकि इस काम करता है यह बड़ी फ़ाइलों के साथ बहुत धीमी है।
मैंने इस कोड को आजमाया है और यह तेज़ लगता है, लेकिन यह केवल यह कहां से नहीं छोड़ा जाता है।
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);
}
किसी भी तरह से इसे संशोधित किया जा सकता है ताकि यह अंतिम ज्ञात स्थिति से पढ़ा जा सके ..?
धन्यवाद
मेरी पहली है है सुझाव PHP को अपग्रेड करना होगा। http://php.net/eol.php – vascowhite
दुर्भाग्य से यह संभव नहीं है।यह डिवाइस में एम्बेडेड है :( – MacMan
क्या उपकरण पर्ल चला सकता है? यह एक महाकाव्य एक-लाइनर हो सकता है .. –