Как я могу рассматривать много файлов журнала как один виртуальный файл в Perl? - PullRequest
5 голосов
/ 18 сентября 2010

У меня есть журналы множественного доступа в каталоге журналов, в соответствии с приведенным ниже соглашением об именах:

access.log.1284642120
access.log.1284687600
access.log.1284843260

По сути, журналы «чередуются» Apache в день, поэтому их можно сортировать по порядку.

Я пытаюсь «читать их один за другим», чтобы их можно было рассматривать как один файл журнала.

my @logs = glob('logs/access.log.*');

Приведенный выше код выведет все журналы, но я не уверен:

  • В каком порядке будут организованы журналы в алфавитном порядке?
  • если я хочу проверить «последнее время доступа с уникального IP-адреса», как я могу это сделать?

У меня есть Perl-скрипт, который может читать одиночный журнал доступа и легко это проверять (мой алгоритм - иметь большой хеш, который использует IP-адрес в качестве ключа и время доступа в качестве значения, и просто продолжать нажимать ключ / значение пар к нему ...). Но я не хочу просто объединять все файлы доступа в один временный файл только для этого процесса.

Есть предложения? Большое спасибо заранее.

Ответы [ 2 ]

11 голосов
/ 18 сентября 2010

Если вы хотите обеспечить определенный заказ, сортируйте его самостоятельно, даже если просто для того, чтобы убедиться, что он получится правильным:

 my @files = sort { ... } glob( ... );

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

 my @files = sort glob( ... );

Чтобы прочитать их как один über-файл, мне нравится использовать local @ARGV, чтобы я мог использовать оператор diamond, который на самом деле является просто волшебным ARGV дескриптором файла. Когда он достигает конца одного файла в @ARGV, он переходит к следующему. Это подделывает указание всех файлов в командной строке, присваивая @ARGV внутри программы:

 {
 local @ARGV = sort { ... } glob( ... );

 while( <> ) {
      ...;
      }
 }

Если вам нужно знать файл, который вы сейчас обрабатываете, посмотрите в $ARGV.

Если вам нужно что-то более причудливое, вам, возможно, придется прибегнуть к грубой силе.

2 голосов
/ 18 сентября 2010

В среде Unix-y вы можете использовать оболочку для группировки файлов:

my @files = glob("$dir/access.log.*");
open my $one_big_logfile, "-|", "cat @files" or die ...;
while (<$one_big_logfile>) {
   ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...