Как собрать все логи в один.

Иногда возникает задача найти что-то в логах ручками, без установки анализаторов логов.

Логов может быть много, некоторые сжатые — некоторые нет. Для работы со сжатыми файлами есть утилиты, начинающиеся на z: zcat, zgrep, zdiff

ls /bin/z* в помощь.

Для сборки логов в один я написал простой скрипт. Он выдает в stdout все логи, в порядке создания, сжатые разжимаются.

#!/bin/bash

test -z "$1" && echo "need log file" && exit

declare EXT=gz

for CUR_LOG in $(ls -tr "$1"*);do
  PREFIX=z
  if [[ "${CUR_LOG##*.}" != "$EXT" ]];then
    PREFIX=
  fi
  ${PREFIX}cat ${CUR_LOG}
done

Сохраняем его в файл sumlog.sh, делаем файл исполняемым:

chmod +x sumlog.sh
sudo ./sumlog.sh /var/log/apache2/access.log

Лог-файл без индексов и архивных расширений.

Поскольку скрипт очень простой, метод написания я выбрал максимально извращенный. :-)

declare EXT=gz — сжатый файл.

ls -tr "$1"* — список файлов, отсортированный по времени (-t), в порядке убывания (-r).

Если у файла расширение не gz, то используем утилиту cat, если gzzcat.

Tagd Tagd
Tagd Tagd
Bash Master
Задать вопрос
Если у файла расширение не gz, то используем утилиту cat, если gzzcat.

А дальше обрабатывать вывод можно как угодно:

sudo ./sumlog.sh /var/log/apache2/access.log|grep ...
sudo ./sumlog.sh /var/log/apache2/access.log|awk ...
sudo ./sumlog.sh /var/log/apache2/access.log|sed ...

UPD: Тут пользователь Кирилл Катаевский (@rosskk) подсказал, как можно упростить:

#!/bin/bash
test -z "$1" && echo "need log file" ||zcat -f $(ls -tr "$1"*)