[solveD] как правильно выковырить ежесекундно данные из постоянно пишущегося файла ?

суть вопроса:
есть файл, который пишется sylog-ng допустим /var/log/stream.log. инфа в него летит примерно со скоростью 1..3 кБ\сек.
нужно желательно ежесекундно, допустимо ежедесятисикундно "снимать данные с этого файла с ликвидацией того что сняли". грубо говоря периодически срывать банк.
как сие лутше организовать ?

(*)

#include

#include <sys/types.h>
#include <fcntl.h>
#include <iostream>
#include <stdio.h>

int main(){
        int log_file = open("iptables.log", O_RDWR | O_CREAT | O_TRUNC, 0600);
        int new_log_file = open("iptables.tmp.log", O_RDWR | O_CREAT | O_TRUNC, 0600);

        if (dup2(log_file, new_log_file) < 0) { printf ("errrrrror !!!1");}

        if (new_log_file != log_file) {printf( "close new logfile "); close(new_log_file);}

        rename("iptables.log", "iptables.var.log");
        rename("iptables.tmp.log", "iptables.log");  
        return 0;
}

данные продолжают лететь в iptables.var.log, тобишь дискриптор не перекинулся на iptables.tmp.log

_______________________________________
грех обманывать компиляторы в субботу

raskapulk

raskapulk написал(а):
данные продолжают лететь в iptables.var.log, тобишь дискриптор не перекинулся на iptables.tmp.log

Естественно. Для начала нужно понять, а как это вообще работает.

Логгер открывает файл. У него имеется дескриптор. Пока дескриптор есть, файл никуда не денется, даже если его удалить. Его не будет видно в файловой системе, но он по прежнему будет занимать диск и программа по прежнему будет писать в него. Следовательно, для того чтобы забирать уже записанную часть нужно чтобы логгер закрыл дескриптор.

Есть два типа логгеров. Те которые открыв файл держат дескриптор, и те которые отрывают файл только чтобы записать одно сообщение, после чего снова файл закрывают. Со вторыми жизнь проще. Делаешь 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 есть касяк, хз как лечится

prom-lan IN=eth1 OUT=eth0 SRC=192.168.3.198 DST=161.8.53.1 LEN=177 TOS=0x00 01.017258]
lan-prom IN=eth0 OUT=eth1 SRC=161.8.53.2 DST=192.168.3.198 LEN=1500 TOS=0x00 PREC=0x00 TTL=127 ID=9824 DF PROTO=TCP SPT=445 DPT=1110 012 DF PROTO=TCP SPT=445 DPT=1110 WINDOW=65031 RES=0x00 ACK URGP=0 
prom-lan IN=eth1 OUT=eth0 SRC=192.168.3.198 DST=161.8.53.2 LEN=40 TOS=0x00 PREC=0x00 TTL=127 ID=20934 DF PROTO=TCP 017 DF PROTO=TCP SPT=1110 DPT=445 WINDOW=65352 RES=0x00 ACK PSH URGP=0
lan-prom IN=eth0 OUT=eth1 SRC=161.8.53.2 DST=192.168.3.198 LEN=1500 TOS=0x00 PREC=0x00 TTL=127 ID=28945 DF 02.036770]
out-lan IN= OUT=eth0 SRC=161.8.53.8 DST=161.8.53.35 LEN=1500 TOS=0x00 PREC=0x00 TTL=64 ID=46752 DF PROTO=TCP SPT=943 DPT=1161 WINDOW=40200 RES=0x00 ACK 0200 RES=0x00 ACK URGP=0
out-lan IN= OUT=eth0 0200 RES=0x00 ACK URGP=0
lan-prom IN=eth0 OUT=eth1 SRC=161.8.53.2 DST=192.168.3.198 LEN=223 TOS=0x00 PREC=0x00 TTL=127 ID=17999 DF PROTO=TCP SPT=445 DPT=1110 WINDOW=64086 RES=0x00 02022]
lan-prom IN=eth0 OUT=eth1 SRC=161.8.53.2 021.465182]
lan-prom IN=eth0 OUT=eth1 02940]
prom-lan IN=eth1 OUT=eth0 SRC=192.168.3.198 DST=161.8.53.2 LEN=40 TOS=0x00 PREC=0x00 TTL=127 ID=3936 DF PROTO=TCP SPT=1110 DPT=445 WINDOW=65535 RES=0x00 ACK 038]

эдакие не полные записи, причём если бы в конце файла... она в середине, бывают в начале. такое ощущение, что 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 [

taho написал(а):
k=0; while [ $k -eq 0 ];

гы, есть программка true для этого) while true; ...
а в конкретном этом примере туда вообще sleep надо переставить.
извините за оффтоп.

не кошерно имхо

не кошерно имхо, хотя [ это тоже программка ..., ок

тогда уж клшерней while :;

тогда уж кoшерней while :;

век живи, век учись ...

век живи, век учись ... спасибо

а всего-то и надо было лишь

а всего-то и надо было лишь почитать ABS Guide ;)

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".