Logrotate, не усекающий открытый файл

Так, похоже, что Вы действительно не задаете вопрос вокруг платформ сборки, а скорее конкретный вопрос о том, как определить, существует ли определенная строка в текстовом файле?

Если Вы хотите узнать если строка foo существует в файле, затем:

if grep -q foo thefile; then
   # it's there
else
   # otherwise
fi

должен добиться цели.

3
29.08.2012, 03:26
3 ответа

Как обещано, "достаточно близко" для вызова буферной программы, в нескольких строках 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;

Разъяснить любые вопросы о лицензировании на том коде:

CC0
По мере возможности в соответствии с законом, Anthony DeRobertis отказался от всего авторского права и имел отношение или соседние права на вышеупомянутую программу (разделитель журнала). Эта работа публикуется от: Соединенные Штаты.

0
27.01.2020, 21:13
  • 1
    Ну, это верно та замена > file с >> file более лениво, чем замена его с | log-splitter 1234 file1 file2, но я считал бы это как :D –  angus 29.08.2012, 22:15

От 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 резервных копий сделаны.

3
27.01.2020, 21:13
  • 1
    я предполагаю, что у меня должен быть clearified. Я использую copytruncate команду. Однако это не делает усеченного согласно просьбе, если мои программы не мертвы. –  dsollen 29.08.2012, 03:22
  • 2
    @dsollen Просто перенаправляет вывод Ваших программ с >> вместо >. copytruncate будет работать затем. –  angus 29.08.2012, 11:42

Я знаю, что это немного старо, но у меня была та же проблема, и решение состояло в том, чтобы использовать добавлять перенаправление для выходного файла вместо того, чтобы ударить ее. Таким образом, Ваша блокировка привычки приложения/сценария файл исключительно.

Вместо:

ProgramA > logA

Использование:

ProgramA >> logA 

С уважением.

4
27.01.2020, 21:13
  • 1
    , где это находится в документации удара? –  user3338098 11.04.2016, 19:28
  • 2
    idk, просто метод проб и ошибок.:\Так или иначе это имеет смысл для меня. –  vegatripy 11.04.2016, 19:55
  • 3
    я предполагаю это, имеет смысл, потому что это - общий подход для нескольких процессов, чтобы смочь добавить 'короткие' строки одновременно (длинные линии привели бы к строкам от каждого чередования процесса), тогда как замена файла не имеет никакого смысла во много процессе IO. –  user3338098 15.04.2016, 18:41
  • 4
    Этот работал на меня –  sinsuren 31.08.2017, 18:08

Теги

Похожие вопросы