2012-02-28 2 views
0

Я использую tail -F log | python parse.py для мониторинга и анализа растущего файла журнала, но возникают некоторые ошибки синтаксического анализа, которые могут быть вызваны чтением неполных строк из файла журнала.Возможно ли, что `tail` испускает неполные строки?

Возможно ли, что tail испускает неполные линии?

В анализаторе я читаю строки с кодом, как следующее:

import csv 
import sys 

reader = csv.reader(sys.stdin) 
for row in reader 
    # process 

ответ

0

Вполне возможно, что хвост может излучать «неразборчивую линию» - но только в том случае недействительные строк записываются в файл. Вид круговой немного аргумент, но вот пример того, как это могло произойти:

  • Вы хвост -f на/вар/Журнал/Syslog

  • Syslog-нг умирает в середине block-spanning write (секторы составляют 512 байт, размер блока файловой системы, скорее всего, больше, хотя, вероятно, не намного больше 4096 .. поэтому syslog имеет 9k данных, буферизованных для записи, он получает через 4k байт страницу и до этого может записать следующие 4k + 1k syslog. По крайней мере на ext2, это закончится как частичная запись даже после fsck. ext3? .. heh. Я так долго встраивал, что не могу вспомнить. Но я бы НАДЕЖДЫ не .. Но кто скажет, что данные, которые вы пишете, всегда будут верный? Вы можете получить нефатальную ошибку форматирования строки, которая не включает новую строку, которую вы ожидаете.

  • После этого вы получите частичную строку, которая не будет завершена символом новой строки (или даже \ 0), и в следующий раз, когда syslog запустится и начнет добавление, он будет просто добавляться в конце файл без понятия «действительных» записей. Итак, первая новая запись будет мусором, но следующая будет в порядке.

Это легко осуществить ..

В одном окне

tail -f SOMEFILE

В другом окне

echo FOO >>SOMEFILE 
echo BAR >>SOMEFILE 
printf NO_NEWLINE >>SOMEFILE 
echo I_WILL_HAVE_THE_LAST_LINE_PREFIXED_TO_ME_CAUSING_NERD_RAGE >>SOMEFILE 

Поскольку хвост Linux использует Inotify по умолчанию, все, что чтение будет получать последнюю строку без новой строки и ждать, пока Следующая новая строка появляется при добавлении NO_NEWLINE к началу того, что он считает «последней строкой».

Если вы хотите сделать это «путинским» способом, если вы используете Linux - используйте inotify, если вы используете OSX или BSD, используйте «knotty» и отрицайте использование «хвоста» в качестве входного канала и просто просмотрите файл самостоятельно.

Хвост может сделать странные вещи, если вы также используете «resync on truncate» - то есть, если файл обнуляется и перезапускается в середине чтения, вы можете получить некоторый странный объем данных при чтении с «хвоста», закроет ранее открытый дескриптор файла взамен нового.

+0

Хотя это возможно, очень редко. Я предполагаю, что шансы намного выше, чем на скрипте python у респондента. – Perry

+0

@Perry, я обновил вопрос и добавлю код, который я использовал для чтения журналов. – satoru

+0

Вы уверены, что строки в вашем журнале являются значениями, разделенными запятой? – Perry

0

Поскольку вы изменили вопрос на меня .. новый ответ! : p

reader = csv.reader(sys.stdin) 
for row in reader: 
    try: 
     validate_row_data_somehow(row) 
     do_things_with_valid_row(row) 
    except: 
     print "failed to process row", `row` 
+1

Изменение вопроса требует другого ответа, как правило, заставляет меня сбрасывать вопрос. – jordanm

+0

Сегодня я чувствовал себя великодушным. – synthesizerpatel

Смежные вопросы