[solveD] как правильно выковырить ежесекундно данные из постоянно пишущегося файла ?
raskapulk 21 сентября, 2011 - 16:16
суть вопроса:
есть файл, который пишется sylog-ng допустим /var/log/stream.log. инфа в него летит примерно со скоростью 1..3 кБ\сек.
нужно желательно ежесекундно, допустимо ежедесятисикундно "снимать данные с этого файла с ликвидацией того что сняли". грубо говоря периодически срывать банк.
как сие лутше организовать ?
»
- Для комментирования войдите или зарегистрируйтесь
(*)
http://www.linuxquestions.org/questions/programming-9/how-to-backup-and-truncate-the-log-file-while-the-process-is-running-591653/
#include
данные продолжают лететь в iptables.var.log, тобишь дискриптор не перекинулся на iptables.tmp.log
_______________________________________
грех обманывать компиляторы в субботу
raskapulk
Естественно. Для начала нужно понять, а как это вообще работает.
Логгер открывает файл. У него имеется дескриптор. Пока дескриптор есть, файл никуда не денется, даже если его удалить. Его не будет видно в файловой системе, но он по прежнему будет занимать диск и программа по прежнему будет писать в него. Следовательно, для того чтобы забирать уже записанную часть нужно чтобы логгер закрыл дескриптор.
Есть два типа логгеров. Те которые открыв файл держат дескриптор, и те которые отрывают файл только чтобы записать одно сообщение, после чего снова файл закрывают. Со вторыми жизнь проще. Делаешь mv и все. С первыми жизнь сложнее. После того как сделал mv нужно логгеру сигнал кинуть, чтобы он дескриптор закрыл и открыл новый файл.
Чем больше юзерфрендли, тем сложнее юзать.
ну тогда используем сие
ну тогда используем сие свойство
mv iptables.log{,.`date +'%s.%N'`}; /etc/init.d/syslog-ng reload;
_______________________________________
грех обманывать компиляторы в субботу
(*)
Это у вас каждый день 86400 файлов новых именами вида iptables.log.1316676654.566418160.
на другом серваке скрипт
на другом серваке скрипт сканит каталог, и парсит оные, затем в базе данный агригируются, файлы сносятся.
максимум 2-3 файла висит.
_______________________________________
грех обманывать компиляторы в субботу
(*)
Сам не пробовал, но слышал, что syslog-ng может сразу в базу, минуя mv + parse
да, но там вроде когда-то
да, но там вроде когда-то имелись ограничения. вот наверно, придут слеп и нога и возмутятся этим бредом, а пока
rsyslog
и можно забыть эти лясопеды
в базу то он может, но это
в базу то он может, но это получится тот же ulog за минусом того, что поля данных не разделены. на каждый чих летит insert, а для мускула желателен "групповой insert", таким образом файлег в 200 кб(15 сек дневных логов) он переваривает за 3 сек. а это где то 1000-1500 записей.
но у syslog-ng есть касяк, хз как лечится
эдакие не полные записи, причём если бы в конце файла... она в середине, бывают в начале. такое ощущение, что syslog не успевает записать строку, как уже новая лезит и старая остаётся недописанная
_______________________________________
грех обманывать компиляторы в субботу
k=0; while [ $k -eq 0 ]; do
k=0; while [ $k -eq 0 ]; do cat /var/log/stream.log; > /var/log/stream.log; sleep 1; done
Пойдет так?
taho написал(а): k=0; while [
гы, есть программка true для этого)
while true; ...
а в конкретном этом примере туда вообще sleep надо переставить.
извините за оффтоп.
не кошерно имхо
не кошерно имхо, хотя [ это тоже программка ..., ок
тогда уж клшерней while :;
тогда уж кoшерней while :;
век живи, век учись ...
век живи, век учись ... спасибо
а всего-то и надо было лишь
а всего-то и надо было лишь почитать ABS Guide ;)