Как я могу обрезать файлы журналов, используя Perl? - PullRequest
4 голосов
/ 10 февраля 2009

Недавно я столкнулся с ситуацией, когда мне нужно обрезать некоторые довольно большие файлы журналов, как только они вырастут до определенного размера. Все, кроме последних 1000 строк в каждом файле, удаляется, задание запускается cron каждые полчаса. Мое решение состояло в том, чтобы просто просмотреть список файлов, проверить размер и обрезать при необходимости.

for $file (@fileList) {
  if ( ((-s $file) / (1024 * 1024)) > $CSize) {
      open FH, "$file" or die "Cannot open ${file}: $!\n";
      $lineNo = 0;
      my @tLines;

      while(<FH>) {
        push @tLines, $_;
        shift @tLines if ++$lineNo < CLLimit;
      }
      close FH;

      open FH, ">$file" or die "Cannot write to ${file}: $!\n";
      print FH @tLines;
      close FH;
}

Это работает в текущей форме, но есть большие издержки для больших файлов журналов (особенно для тех, у кого более 100 000 строк) из-за необходимости читать каждую строку и сдвигать при необходимости.

Есть ли способ, которым я мог бы прочитать только часть файла, например, в этом случае я хочу иметь доступ только к последним строкам "CLLimit". Поскольку сценарий развертывается в системе, которая переживала лучшие времена (например, Celeron 700 МГц с 64 МБ ОЗУ), я ищу более быструю альтернативу с использованием Perl.

Ответы [ 3 ]

8 голосов
/ 10 февраля 2009

Я понимаю, что вы хотите использовать Perl, но если это система UNIX, почему бы не использовать утилиту "tail" для обрезки? Вы можете сделать это в BASH с помощью очень простого скрипта:

if [ `stat -f "%z" "$file"` -gt "$MAX_FILE_SIZE" ]; then
    tail -1000 $file > $file.tmp
    #copy and then rm to avoid inode problems
    cp $file.tmp $file
    rm $file.tmp
fi

При этом вы, вероятно, сочтете этот пост очень полезным, если вы настроены на использование Perl для этого.

4 голосов
/ 10 февраля 2009

Рассмотрим просто использование утилиты logrotate; он включен в большинство современных дистрибутивов Linux. Связанный инструмент для систем BSD называется newsyslog. Эти инструменты более или менее предназначены для ваших целей: он атомарно перемещает файл журнала с места, создает новый файл (с тем же именем, что и раньше) для хранения новых записей журнала, инструктирует программу, генерирующую сообщения, использовать новый файл, а затем (необязательно) сжимает старый файл. Вы можете настроить, сколько повернутых логов хранить. Вот потенциальный урок: http://www.debian -administration.org / статьи / 117

Это не совсем тот интерфейс, который вы желаете (сохраняя определенное количество строк), но программа, вероятно, будет более надежной, чем та, которую вы приготовите самостоятельно; например, ответы здесь не относятся к атомарному перемещению файла и уведомлению программы журнала об использовании нового файла, поэтому существует риск потери некоторых сообщений журнала.

4 голосов
/ 10 февраля 2009

Оцените среднюю длину строки в журнале - назовите ее N байтов.

Искать в обратном направлении от конца файла на 1000 * 1,10 * N (10% -ная погрешность для коэффициента 1.10) Читайте дальше, сохраняя только самые последние 1000 строк.


Был задан вопрос - какая функция или модуль?

Встроенная функция поиск выглядит мне как инструмент для использования?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...