Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> обработка огромного лога, как читать только новые записи 
:(
    Опции темы
afybc
Дата 7.11.2008, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 23.7.2008

Репутация: нет
Всего: нет



Syslog пишет лог в файл. Этот файл имеет огромный размер. Мне нужно написать скрипт который будет висеть в кроне, парсить этот лог и добавлять новые записи в базу. Как мне сделать так, чтобы не модифицировать лог и при этом не парсить его с самого начала?
PM MAIL   Вверх
ginnie
Дата 7.11.2008, 17:54 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



afybc, надо сохранять позицию (полученную вызовом tell()), до которой скрипт дошел при очередной обработке, в "удобном месте". При старте скрипта считывать это значение и перемещать текущий указатель для файлового дескриптора лога при помощи seek().

Это сообщение отредактировал(а) ginnie - 7.11.2008, 17:55


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
afybc
Дата 7.11.2008, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 23.7.2008

Репутация: нет
Всего: нет



Спасибо, думал об этом, но кроме базы больше нигде не могу сохранять. А использовать БД для переменной как-то не особо хочется. Если не ошибаюсь в perl'e есть возможность сохранять переменные в теле скрипта? Если я прав, то подскажите как.
PM MAIL   Вверх
ginnie
Дата 7.11.2008, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



afybc, а в файл никак нельзя?


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
afybc
Дата 7.11.2008, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 23.7.2008

Репутация: нет
Всего: нет



Можно, но хочется узнать именно про возможность сохранения в теле скрипта, если она конечно же существует.
PM MAIL   Вверх
afybc
Дата 8.11.2008, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 23.7.2008

Репутация: нет
Всего: нет



Нашел как.

Use the __DATA__ or __END__ tokens after your program code to mark the start of a data block, which can be read inside your program or module from the DATA filehandle.

Код

# Use __DATA__ within a module:

while (<DATA>) {
    # process the line
}
__DATA__
# your data goes here

# Similarly, use __END__ within the main program file:

while (<main::DATA>) {
    # process the line
}
__END__
# your data goes here



Это сообщение отредактировал(а) afybc - 8.11.2008, 11:12
PM MAIL   Вверх
sir_nuf_nuf
Дата 8.11.2008, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 6.1.2008

Репутация: 14
Всего: 31



afybc, ну и что вы этим добьетесь ?
вы можете оттуда прочитать переменную.
но записать туда что - то вы не сможите. точнее это не сохранится.

Так что - пишите в файл! назовите мне причину по которой вы не сможете писать в файл ? 



--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
amg
Дата 8.11.2008, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 38
Всего: 50



Цитата(sir_nuf_nuf @  8.11.2008,  13:26 Найти цитируемый пост)
назовите мне причину по которой вы не сможете писать в файл ?
Я тоже не вижу веских причин. Хранение в отдельном файле лучше со всех точек зрения. Но технически не сложно организовать хранение и в теле скрипта, причем где именно -- особой роли не играет. Но пусть будет в блоке __DATA__:
Код
use Fcntl ':flock';

my $log = './file.log';

open LOG, '<', $log or die "Can't open $log: $!\n";
flock(LOG,LOCK_EX);

my $pos = 0;

$pos = do {chomp; $_} while <DATA>;

seek LOG, $pos, 0 if $pos <= -s $log;

while (<LOG>) {
  print;
}

$pos = tell LOG;
flock(LOG,LOCK_UN);
close LOG;

exec qw(perl -0777 -i -pe), 's/$/\n'.$pos.'/', $0;

__DATA__
0
Этот скрипт после каждого вызова дописывает себе в конец строку с последней позицией лог-файла, и чтение его начинает с этой позиции. Как быть, если сторонняя программа (например, logrotate) изменит лог-файл -- другой вопрос. Минимальная защита в предлагаемом скрипте предусмотрена -- если сохраненная позиция оказывается больше размера лога, то чтение начнется с начала.

PM MAIL   Вверх
afybc
Дата 28.11.2008, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 23.7.2008

Репутация: нет
Всего: нет



Спасибо, amg. Воспользовался Вашим решением.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0586 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.