Так, похоже, что Вы действительно не задаете вопрос вокруг платформ сборки, а скорее конкретный вопрос о том, как определить, существует ли определенная строка в текстовом файле?
Если Вы хотите узнать если строка foo
существует в файле, затем:
if grep -q foo thefile; then
# it's there
else
# otherwise
fi
должен добиться цели.
Как обещано, "достаточно близко" для вызова буферной программы, в нескольких строках Perl.
Для использования его передайте его размер файлов журнала, которые Вы хотите в байтах (плюс-минус одна строка), и два или больше файла журнала. Это переключит между файлами журнала каждые X байты. Я уверен, что уже существует программа там, чтобы сделать это, но я не мог найти его с быстрым поиском. Например,
$ your-app | log-splitter 1048576 /var/log/your-app/log1 /var/log/your-app/log2
предположение, конечно, что файл log-splitter
исполняемый файл, в $PATH, и содержит:
#!/usr/bin/perl
use warnings qw(all);
use strict;
use autodie;
use Carp;
use Fcntl qw(SEEK_SET);
use IO::Handle;
# yes, we truncate all logs at start. Sorry.
@ARGV >= 2 or croak "Usage: $0 log-size log-file...";
my ($max_size, @lognames) = @ARGV;
my @logs = map {
open my $fh, '+>', $_;
$fh->autoflush(1);
$fh;
} @lognames;
my $current_size = $max_size;
my $current_log = $#logs;
while (defined(my $line = <STDIN>)) {
if ($current_size >= $max_size) {
$current_log = ($current_log + 1) % @logs;
$current_size = 0;
seek($logs[$current_log], 0, SEEK_SET);
truncate($logs[$current_log], 0);
}
$current_size += length($line);
print {$logs[$current_log]} $line;
}
close($_) foreach @logs;
Разъяснить любые вопросы о лицензировании на том коде:
По мере возможности в соответствии с законом, Anthony DeRobertis отказался от всего авторского права и имел отношение или соседние права на вышеупомянутую программу (разделитель журнала). Эта работа публикуется от: Соединенные Штаты.
От man logrotate
:
copytruncate
Truncate the original log file to zero size in place after creat‐
ing a copy, instead of moving the old log file and optionally
creating a new one. It can be used when some program cannot be
told to close its logfile and thus might continue writing
(appending) to the previous log file forever. Note that there is
a very small time slice between copying the file and truncating
it, so some logging data might be lost. When this option is
used, the create option will have no effect, as the old log file
stays in place.
Это - вероятно, опция, необходимо вставить конфигурационный файл.
О Вашем другом вопросе: используйте postrotate
директива для выполнения команды для усечения файла после того, как это было повернуто. В этом случае необходимо сжать его вручную на данном этапе после усечения. (не действительно, эта последняя часть, потому что logrotate
не сжимает первый архив.)
Править: Немного больше о хранении последнего 1 МБ. Можно настроить его для вращения, когда файл журнала имеет больше, чем, скажем, 200 K, и только сохранять 5 резервных копий. Тем путем Вы будете всегда сохранять примерно последнего 1 МБ. Если первое резервное копирование является слишком большим, можно просто ожидать, пока оно не "уменьшается" после того, как 5 резервных копий сделаны.
>>
вместо >
. copytruncate
будет работать затем.
– angus
29.08.2012, 11:42
Я знаю, что это немного старо, но у меня была та же проблема, и решение состояло в том, чтобы использовать добавлять перенаправление для выходного файла вместо того, чтобы ударить ее. Таким образом, Ваша блокировка привычки приложения/сценария файл исключительно.
Вместо:
ProgramA > logA
Использование:
ProgramA >> logA
С уважением.
> file
с>> file
более лениво, чем замена его с| log-splitter 1234 file1 file2
, но я считал бы это как :D – angus 29.08.2012, 22:15