LinuxForum.Fans
Тема

tail -f показывает записи с задержкой (блоками по 20+ штук)

Автор: jamcb 11 сообщений 2212 просмотров
#159998

заметил странную работу утилиты
tail

Использую чистую инсталляцию Debian Squeeze x64.
Наблюдаю за логами апача
1. просто tail -f access.log - всё нормально, новые записи отображаются сразу
2. tail -f access.log | awk {'print $7'} - вот здесь проявляется проблема

а) после ввода команды не показываются последние 10 записей, как должно быть по-умолчанию
б) такое ощущение, что есть кэширование на запись и вывод новых записей идёт скопом по несколько штук за раз (от 20 новых записей строго)

на двух машинах с Debian Squeeze x64 такая ситуация, на машине с Debian Lenny x64 всё нормально.

#160067

Поле $7 вручную проверяли ? срабатыает?

awk {'print $7'} - по синтаксису вроде должно быть awk '{print $7}'

#160068
jamcb написал:

б) такое ощущение, что есть кэширование на запись и вывод новых записей идёт скопом по несколько штук за раз (от 20 новых записей строго)

Это надо смотреть настройки системного логера.

#160112
Macumazan написал:
Поле $7 вручную проверяли ? срабатыает?

awk {'print $7'} - по синтаксису вроде должно быть awk '{print $7}'

Что значит проверял вручную?
Синтаксис немного хромает ) С правильным тоже самое.

Macumazan написал:
Это надо смотреть настройки системного логера.

Так вот дело в том, что это не системный лог, а лог апача, и новые записи туда апач пишет исправно не через сислог.

Сейчас проверил
tail -f access.log | grep GET
работает как надо, записи отображаются по мере добавления
может проблема в awk ?
буфер какой-то есть?

#160115

jamcb, так если смотреть на awk в $7 инфа и она в седьмое поле, если GET то это 6 поле:

т.е.

text

marina# tail -f httpd-access.log | awk '{print $6}'
"GET
"GET
"GET
"GET
"GET
"GET
"GET
"GET
"GET
"GET
^C

и

text

marina# tail -f httpd-access.log | awk '{print $7}'
/cgi-bin/block.cgi?clientaddr=192.168.0.43&clientname=&clientident=&clientgroup=sample-clients&targetgroup=in-addr&url=http://92.241.174.131/icon/post/5.jpg
/cgi-bin/block.cgi?clientaddr=192.168.0.43&clientname=&clientident=&clientgroup=sample-clients&targetgroup=ads&url=http://www.tns-counter.ru/V13a***R>http://www.odnoklassniki.ru/*odnoklassniki_ru/ru/UTF-8/tmsec=odnoklassniki_site/103935592
/cgi-bin/block.cgi?clientaddr=192.168.0.32&clientname=&clientident=&clientgroup=sample-clients&targetgroup=ads&url=http://www.tns-counter.ru/V13a***R>*vkontakte_ru/ru/UTF-8/tmsec=vkontakte_total/54604137
/cgi-bin/block.cgi?clientaddr=192.168.0.43&clientname=&clientident=&clientgroup=sample-clients&targetgroup=ads&url=http://googleads.g.doubleclick.net/pagead/test_domain.js
/cgi-bin/block.cgi?clientaddr=192.168.0.43&clientname=&clientident=&clientgroup=sample-clients&targetgroup=ads&url=http://www.tns-counter.ru/V13a***R>http://www.odnoklassniki.ru/*odnoklassniki_ru/ru/UTF-8/tmsec=odnoklassniki_site/11053223
/cgi-bin/block.cgi?clientaddr=192.168.0.32&clientname=&clientident=&clientgroup=sample-clients&targetgroup=ads&url=http://www.tns-counter.ru/V13a***R>*vkontakte_ru/ru/UTF-8/tmsec=vkontakte_total/95949598
/cgi-bin/block.cgi?clientaddr=192.168.0.32&clientname=&clientident=&clientgroup=sample-clients&targetgroup=ads&url=http://www.tns-counter.ru/V13a***R>*vkontakte_ru/ru/UTF-8/tmsec=vkontakte_total/415071014
/cgi-bin/block.cgi?clientaddr=192.168.0.32&clientname=&clientident=&clientgroup=sample-clients&targetgroup=ads&url=http://www.tns-counter.ru/V13a***R>*vkontakte_ru/ru/UTF-8/tmsec=vkontakte_total/927305022
/cgi-bin/block.cgi?clientaddr=192.168.0.32&clientname=&clientident=&clientgroup=sample-clients&targetgroup=ads&url=http://www.tns-counter.ru/V13a***R>*vkontakte_ru/ru/UTF-8/tmsec=vkontakte_total/638590689
/cgi-bin/block.cgi?clientaddr=192.168.0.32&clientname=&clientident=&clientgroup=sample-clients&targetgroup=ads&url=http://www.tns-counter.ru/V13a***R>*vkontakte_ru/ru/UTF-8/tmsec=vkontakte_total/202297345
^C

p.s.

text

marina# uname -srm
FreeBSD 8.1-RELEASE-p2 i386
marina# echo $SHELL
/bin/csh
#160118

А вообще это зависит как пишет apache в лог и не более того.

#160122

Спасибо за уделённое время!
Проблема в awk
для вывода используется буфер
переводим awk в интерактивный режим опцией -W interactive
новые записи не кэшируются, отображаются сразу
интересно знать, почему у вас работает как надо, а на чистом дебиане нет )

#160124
i2ks написал:
А вообще это зависит как пишет apache в лог и не более того.

апач пишет нормально, tail -f лог показывает всё сразу, а если пустить через awk, то проблема.

Advanced Notes: Interactive Versus Noninteractive Buffering
-----------------------------------------------------------

As a side point, buffering issues can be even more confusing, depending
upon whether your program is "interactive", i.e., communicating with a
user sitting at a keyboard.(1)

Interactive programs generally "line buffer" their output; i.e., they
write out every line. Noninteractive programs wait until they have a
full buffer, which may be many lines of output. Here is an example of
the difference:

$ awk '{ print $1 + $2 }'
1 1
-| 2
2 3
-| 5
Ctrl-d

Each line of output is printed immediately. Compare that behavior with
this example:

$ awk '{ print $1 + $2 }' | cat
1 1
2 3
Ctrl-d
-| 2
-| 5

Here, no output is printed until after the `Ctrl-d' is typed, because
it is all buffered and sent down the pipe to `cat' in one shot.
#160125

BSD:

-f The -f option causes tail to not stop when end of file is
reached, but rather to wait for additional data to be appended to
the input. The -f option is ignored if the standard input is a
pipe, but not if it is a FIFO.

linux
-f, --follow[={name|descriptor}]
output appended data as the file grows; -f, --follow, and --follow=descriptor are equivalent

попробуй ключик -F использовать:

With --follow (-f), tail defaults to following the file descriptor, which means that even if a tail'ed file is renamed, tail will continue to track its end. This default behav-
ior is not desirable when you really want to track the actual name of the file, not the file descriptor (e.g., log rotation). Use --follow=name in that case. That causes tail
to track the named file by reopening it periodically to see if it has been removed and recreated by some other program.

jamcb написал:
апач пишет нормально, tail -f лог показывает всё сразу, а если пустить через awk, то проблема.

Ммм...

#160126
i2ks написал:

попробуй ключик -F использовать:

не помогает

2 i2ks
ужё всё гуд, в интерактивном режиме awk работает как надо
я выше описал
спасибо за помощь )

#160129
jamcb написал:
2 i2ks
ужё всё гуд, в интерактивном режиме awk работает как надо
я выше описал
спасибо за помощь )

Да сам хоть буду знать по поводу ключей. :rolleyes:

Войдите или зарегистрируйтесь, чтобы ответить.