Как собрать все логи в один.
Иногда возникает задача найти что-то в логах ручками, без установки анализаторов логов.
Логов может быть много, некоторые сжатые — некоторые нет. Для работы со сжатыми файлами есть утилиты, начинающиеся на 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, если gz — zcat.
gz, то используем утилиту cat, если gz — zcat.А дальше обрабатывать вывод можно как угодно:
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"*)








Комментарии