Безумные логи +16





Утром, не сделав и глотка кофе, открываешь почту и видишь баг репорты по тому, что вполне себе нормально работало, не сбоило и особо не беспокоило. Идей с ходу ноль, подозреваемых нет, больших изменений в коде тоже не было — нужно лезть в логи.

А туда ты не ходил так давно, что раздало файл с логами аж до 100 мб. или до 500 мб. Черт! А может и до 10 Гб (*). И лежат драгоценные улики где-то там среди 10 737 418 240 байтов, что надо срочно пробежать, дабы выяснить, что ж вообще происходит, меж тем как кофе уже остывает.

А может к рапорту прицепом шёл и архив с двумя сотнями файлами (скажем по 5 Мб каждый) разбитых логов и надо их как-то клеить, а потом смотреть, копать и думать.

Знакомо?

В общем все мы так или иначе сталкиваемся с необходимостью анализа «следов жизнедеятельности» наших творений и хорошо если файл весит пару Мб, потому как открыть лог в 1 Гб блокнотом, да ещё и попытаться поиск сделать — занятие весьма сомнительное.

Под катом поведаю об одном инструменте, не имеющим лимитов (**) по размерности открываемых файлов, зато обладающим весьма шустрым поиском.

А ещё приглашу к разработке присоединиться.

И да, будет много интересных картинок.

Итак, казалось бы тривиальная задача, открыть логи и поискать, может порой упереться в банальный размер файла. Мелочь то можно открыть чем угодно, да хоть бы тем же блокнотом или notepad++, а на маках и линуксах, так вообще порой проще бросить cat`ом все в консоль и сделать поиск.

Кроме всего прочего можно использовать упомянутый notepad++, atom, logExpert, sublime, bare vim, bbedit, glogg и etc. Скажу сразу, гигабайта 2 откроют не все, а некоторые из выживших увы сломаются на поиске. Да и из всех выше приведённых, пожалуй лишь atom воистину кроссплатформенный, а так хочется иметь что-то одно, когда вынужден работать на нескольких платформах параллельно. А уж сколько некоторые съедят RAM для обработки хотя бы пары сотен мегабайт логов — это отдельная история.

Вот собственно поэтому имеем тулзу chipmunk, запиленную было под узкие задачи, но быстро выросшую в комплексное решение по анализу логов. Ничего другого chipmunk не умеет, его задачи сводятся к простому:

  • открывать логи, не парясь над размером файла;
  • искать так, что б не ждать, а видеть результат сразу;
  • помнить все ваши поиски и бережно хранить их до востребования;
  • помогать вам визуально воспринимать информацию;
  • вести себя скромно по отношению к RAM;
  • решать и иные более узкие задачи, но всегда сводящиеся к анализу логов.

Ну давайте обо всем по порядку.

Ресурсы


Chipmunk ничего не грузит в оперативную память, кроме того куска логов, что виден на экране (ну ещё немного буферизации, но это мелочь). Гуляя по файлу, chipmunk, читает кусок файла (соответствующий позиции скролинга) и только лишь его и подгружает в память. Благодаря этому аппетиты по отношению к RAM вполне вразумительные и не колеблются, а первый «экран» с содержанием файла показывается немедленно (хотя фоном индексация будет продолжаться).

Удобство и визуализация


image

Имеется менеджер поисковых запросов, где можно:

  • назначить цвета фильтрам (что облегчает восприятие данных)
  • сохранить коллекцию фильтров в файл, дабы всегда иметь под рукой готовый паттерн поиска.

Можно, например, посмотреть по файлу чистоту совпадений (чем выше столбик, тем больше совпадений во фрагменте файла).

image

А можно указать группу в регулярном выражении и получить красивый график (в приведённом примере используется выражение CPU usage:\s+(\d+\.\d+)). И теперь вы видите, где потребление CPU было аномальным и какой кусок логов следует изучить внимательнее.

image

Кроме поиска самого по себе, отдельные строки логов можно кидать в закладки, которые всегда будут представлены в окне результатов поиска. Это весьма удобно, когда увидел что-то важное среди пары миллионов строк и не хочешь терять это из виду.

Комбинирование файлов


Для решения задач, связанных с несколькими файлами chipmunk может слепить файлы в один (например по дате последнего изменения в файле). Все что нужно:

  • кинуть группу файлов в окно chipmunk
  • если нужно отсортировать файлы, как душе угодно
  • в дополнение можно сделать поиск по всем файлам и, например, исключить те файлы, что не имеют совпадений по слову «error» (ну а зачем нам лезть туда, где итак все спокойно?)

image

Как результат мы получим в окне последовательность из всех выбранных файлов.

Если же требуется более сложный механизм комбинирования логов (например, если у вас имеются логи с разных девайсов/источников), то можно воспользоваться функцией merge, которая определить формат метки времени для каждого файла и выведет логи в хронологическом порядке.

image

Обратите внимание на цветовые метки слева от вывода — это метки файлов. То есть вы видите не вывод одного файла за другим (concatenation), а отсортированный по времени вывод из всех файлов (merging).

Особые штучки


Если вы когда-либо сталкивались с DLT, то вы знаете, какая это боль использовать DLTViewer. Хорошая новость в том, что chipmunk представляет собой альтернативу для открытия и анализа DLT файлов. Кроме того он поддерживает и подключение DLT потоку.

image

При открытии же DLT файла вы сразу увидите сводку по файлу, включающую перечень всех компонентов, что удобно если вас интересует какое-то конкретное APID, а не весь лог целиком.

Кстати, о потоках


Из коробки с chipmunk идёт простенький плагин «Commands», который позволят запустить любую консольную команду и получать вывод в chipmunk с возможностью поиска по этому выводу. Естественно, если у вас есть активный поиск (например, сохранённый фильтр), то данные результатов будут обновляться по мере обновления потока от вашей консольной команды.

image

Ах, да, плагины


Их, пока, мало. Вот прямо правда мало. Публичных всего 5 (тех что в открытом доступе и доступны для менеджера плагинов), не публичных, я даже не знаю, может пара десятков.

Написать свой плагин очень просто (оговорюсь, для простой задачи просто).

Например, если в ваших логах встречаются сообщения представленные в виде байтов, а вам хотелось бы их видеть сразу в читаемом виде (то есть декодированными); можно легко запилить плагин, который будет как ввод получать выделенный пользователем фрагмент логов, а декодированный вывод кидать в панель. А может и вообще на лету декодировать и на экран выводить уже вразумительный текст, а не A5 FF 13 EE … etc.

В целом есть два типа расширений: первые работают с рендером, то есть позволяют изменять представление вывода: хотите столбики — пожалуйста; хочется что-то на лету декодировать — можно; есть желание воткнуть графику (например иконки) — не ясно зачем оно вам, но можно.

Другой тип плагинов (и он более интересен), те что могут поставлять данные (создавать потоки). Например, хотите видеть вывод с serial-порта? Не проблема: делам новый npm проект, включаем в него любимую либу по работе с портами, добавляем немного UI по вкусу и вот уже ваш плагин может кидать данные в chipmunk.

Для удобства и первых свиданий, как водится в приличных семьях, имеется quickstart репозиторий с парой тройкой примеров.

Если заинтересует, дайте знать в коментах — я сделаю отдельный пост-гайд по созданию и публикации плагинов (кстати для публикации никакой регистрации не требуется).

Вместо заключения


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

Проект полностью опенсоурсный и открыт для вашего участия, любого вашего участия. Хотите увидеть поддержку чего-то этакого? Создавайте issue и выбирайте «Feature request». Нашли баг? Будем счастливы увидеть от вас bug-report с кратким (но достаточным) описанием проблемы. Английский язык приветствуется, но русский не возбраняется.

Ну и конечно, поставив заветную звёздочку на github, вы уже через несколько секунд почувствуете лёгкое тепло и улучшение настроения от нашей благодарности за одобрение того, что мы делаем. Для вас клик — для нас обратная связь и воодушевление.

Спасибо.

Релизы

Другие ссылки


Уточнение
(*) на счёт логов, раздутых до неприличия (1 Гб <). Не стоит спешить с выводами, что ПО не должно генерировать столько логов. Должно. Для некоторых ситуаций файл в 10-20 Гб, вполне себе нормальное явление. В embedded это встречается сплошь и рядом.

(**), конечно, безлимитного ничего не бывает. И chipmunk все же ограничен размером свободного места на вашем диске. Кроме того, так как chipmunk не хранит данные в RAM, а читает их с диска, то и работать он будет заметно лучше с SSD.




Комментарии (33):

  1. citius
    /#21472582

    Логи обычно не на локалхосте, а где-то в облаках лежат.

    • mjr27
      /#21472746

      Логами не только микросервисы гадяд. Десктопный софт живее всех живых

  2. savostin
    /#21472592 / +1

    The application requires macOS 10.15 or later.

    Why?

    • AlexWriter
      /#21475012

      Спасибо за ваш вопрос. Там были изменения в порядке подписания приложения. Мы «покрыли» тот порядок, который установлен на 10.15 и младше, и, честно, не стали заморачиваться над поддержкой процедуры подписания для более поздних версий. Дело только в подписи. Решили, что если появится issue на этот счёт, то обязательно добавим поддержку более ранних версий ОС, но пока запросов не поступало.

      • savostin
        /#21475028

        Имхо далеко не все как и я торопятся обновляться до 10.15 из-за кучи 32-битного софта, который перестает работать… Т.е., если самому собрать из исходников, есть вероятность, что заведётся?

        • AlexWriter
          /#21475088

          думаю, что да.

          git clone https://github.com/esrlabs/chipmunk.git
          cd chipmunk
          rake full_pipeline


          Релиз увидите в

          chipmunk/application/electron/dist/release
          

          На борту надо иметь:
          • node 10 и младше
          • ruby 2.6 и младше
          • rust

          • vvzvlad
            /#21476714

            Не получилось
            Downloading "chipmunk-asciicolors-plugin" from "https://github.com/esrlabs/chipmunk-plugins-store/releases/download/0.0.14/chipmunk-asciicolors-plugin@81100990.110000010.003421639-1.0.0-darwin.tgz"
            rake aborted!
            NoMethodError: private method `open' called for URI:Module
            /Users/vvzvlad/Downloads/chipmunk/rake-plugins.rb:87:in `block (2 levels) in delivery'
            /Users/vvzvlad/Downloads/chipmunk/rake-plugins.rb:86:in `open'
            /Users/vvzvlad/Downloads/chipmunk/rake-plugins.rb:86:in `block in delivery'
            /Users/vvzvlad/Downloads/chipmunk/rake-plugins.rb:84:in `each'
            /Users/vvzvlad/Downloads/chipmunk/rake-plugins.rb:84:in `delivery'
            /Users/vvzvlad/Downloads/chipmunk/rakefile.rb:613:in `block in <top (required)>'
            /Users/vvzvlad/Downloads/chipmunk/rake_extensions.rb:37:in `block in execute_with_benchmark'
            /Users/vvzvlad/Downloads/chipmunk/rake_extensions.rb:37:in `execute_with_benchmark'
            Tasks: TOP => full_pipeline => deliver_defaults_plugins
            (See full trace by running task with --trace)
            ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| (75.2 %) application/electron/dist/compiled/client/main.js ==> 228.2s
            ||||||||||||||| (15.2 %) application/client.core/node_modules/chipmunk.client.toolkit ==> 46.2s
            |||| (3.6 %) electron_build_ts ==> 10.9s
            ||| (2.7 %) compile_neon_ts ==> 8.1s
            || (1.8 %) application/electron/dist/compiled/apps/rg ==> 5.4s
            | (0.7 %) build_embedded_indexer ==> 2.1s
            total time was: 303.3

            • AlexWriter
              /#21476728

              просто обновите ruby. Там были обновления URI библиотеки.

              • vvzvlad
                /#21476754

                brew upgrade ruby
                ==> Summary
                /usr/local/Cellar/ruby/2.7.1: 20,372 files, 32.9MB

                rake aborted!
                NoMethodError: private method `open' called for URI:Module

                Тоже самое.

        • vvzvlad
          /#21476474

          +1 к «не все как и я торопятся обновляться до 10.15 из-за кучи 32-битного софта».
          Пойду соберу.

  3. Slader
    /#21473046 / +1

    grep, awk, head + tail
    Ну вы чего, какой notepad?!

    • AlexWriter
      /#21473218

      Спасибо за ваш комментарий. Я отвечу сравнением, если позволите.

      В каких-то повседневных задачах, не знаю, файл с настройками подправить, я вот не задумываясь прибегну к nano (или если настроение плохое, к vim). Но все же, для работы над проектом, я открою VSCode или что-нибудь от JetBrains. Я сделаю это не потому что не могу кодить в vim или nano, а просто потому, что удобнее это делать в IDE. Хотя, если задуматься, IDE добавляет в общем-то какие-то совсем тривиальные вещи: подсветку, обзор папки с решением, поиск по файлам, поиск по зависимостям и ссылкам, отладчик, конечно. И вот эти вот мелочи делают работу удобнее и быстрее.

      Как-то так и возник chipmunk. Блин, а как сохранить шаблоны поиска (скажем фильтров 5-10) и не терять их, а ещё по необходимости шарить с коллегами? А как усадить студента-тестировщика и не ввергать его в шок консольными командами, а сказать: «увидишь здесь красное — кричи!». А у нас в логах тут куча закодированных данных, которые было бы очень здорово не копи/пастить по окнам, а сразу читать. Ну и так далее. То есть базово вопрос не в том, что chipmunk умеет делать что-то что не умеют другие, нет, а в том, чтобы попытаться делать это проще. Хотя есть и DLT, которые с консоли декодировать та ещё проблема.

      На счёт tail, то уже есть feature request по этому поводу. Думаю что в ближайших обновлениях это появится, то есть chipmunk будет открывать файл и обновлять по мере его изменений.

      ЗЫ. Кстати ripgrep шустрее )

      • chapuza
        /#21473580

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

        А в виме всего этого, конечно же, нет? Вим из коробки умеет три четверти того, о чем вы пишете, включая файлы в 100500G и tail о котором вот только что попросили; если бы вместо электрона и npm вы бы сначала посмотрели на существующие решения, а потом допилили бы плагин к виму, который добавляет все эти плюшки, типа графиков и красот — вам бы миллионы людей со всего мира сказали спасибо.


        А свой электронный велосипед на macOS 10.15 or later — это хорошо на непрофильной конференции людям в кроссовках с мате в руках разок показать, простите уж за прямоту.

        • AlexWriter
          /#21474450

          Спасибо за ваш совет. Как ответить — не знаю. Задумался. Ведь так то вилка умеет три четверти того, что делает ложка, но меж тем она существует :/

          • chapuza
            /#21474576 / -1

            Угу. Только когда вы хотите есть, вы приходите в столовую, в не в магазин столовых приборов. И если в наличии есть только вилки — то да, придется есть суп вилкой. Хотя всегда есть вариант сесть в машину, съездить за город в торговый центр, купить там ложку, и вернуться.


            Тут так же. Логи живут там, где всегда есть вим и где никогда ни у одного здравомыслящего человека не будет X-клиента, чтобы пробросить GUI. sshfs тоже так себе вариант, учитывая, что оно сожрет все преимущества, оборачивая каждый tcp-пакетик в защищенный.

      • Slader
        /#21473722

        Понятно, что у каждого свой юзскейс.
        Но мне в моей ситуации (highload сервисы) удобно либо стандартную смотрелку из mc поюзать (это когда логи маленькие), либо уже греп и tail (когда логи в десятки гигабайт).
        Когда что то совсем большое — проще написать на C многопоточный парсер (по давно готовому шаблону) и получить выгрузку/агрегацию очень быстро.
        С другой стороны — мои логи в ДЦ и часто очень большие. Это накладывает свои ограничения, да.

        • AlexWriter
          /#21475054

          Полностью с вами согласен, юзкейсов очень много. И далеко не всегда логи хранятся удалённо. У нас, например, довольно большая группа пользователей, работающих с embedded software. И там можно получать десятки гигобайт логов лишь за ночь или за одну сессию тестирования. При этом логи часто бывают от нескольких источников, что вовсе не облегчает жизнь. Ну и конечно, такие логи живут более ли менее локально.

      • gecube
        /#21482770

        Я уж не говорю о том, что если требуется что-то сложное — ну, ок — либо страшный пайп из grep/sed/awk и чего-то там, либо если нужна визуализация — ок, грузим все в эластиксерч и крутим данные как хотим. 10ГиБ — это попросту чих. И если уж Вы разработчик и все прям по науке — наверняка у вас в команде уже какой-то кубернетис и сбоку-припеку есть сборка логов в какую-нибудь систему вроде Loki

  4. tqgwint
    /#21473224

    Обычно мне приходится заглядывать в логи находятся где-то там, на серверах. Инструмент размером в 175М быстренько доставить на удаленный сервер чтоб посмотреть с его помощью логи — для меня очень нежизненый сценарий. Разнести заранее на все сервера где возможно придется посмотреть логи? Хм.
    Если ваш usecase похож на мои — зайти и найти то вдруг кто-то еще не знает про less?
    Размер 188К. Но скорее всего он уже там, на сервере есть.

    • AlexWriter
      /#21473240

      Спасибо за ваш комментарий.
      Полагаю я уже ответил частично на ваш комментарий здесь. Могу добавить, что есть несколько идей по тому чтобы научить chipmunk цепляться по ssh, что во многом снимает вопрос удалённого доступа, но открывает проблемы другого характера. Пока думаем над этим. Но если у вас есть какие-то идеи или пожелания, будем очень рады увидеть их в качестве feature request.

      • gavk
        /#21473350

        sshfs не вариант? Не проще ли удалёную фс смонтировать себе?

        • tqgwint
          /#21474122

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

          • chapuza
            /#21476842

            Угу. И правильный сценарий — это сделать выборку там, а результат смотреть здесь, а не наоборот.


            А то будет напоминать работу с базой по принципу (select all) -> reduce.

  5. Andrey_Rogovsky
    /#21473940

    split+grep+ловим льва в пустыне

  6. teakettle
    /#21474872

    user@debian:~$ apt search chipmunk
    Сортировка… Готово
    Полнотекстовый поиск… Готово
    chipmunk-dev/testing,unstable,stable 6.1.5-1+b1 amd64
      Fast and lightweight 2D rigid body physics library - devel
    
    libchipmunk0d3/testing,unstable,stable 6.1.5-1+b1 amd64
      fast and lightweight 2D rigid body physics library in C
    
    libchipmunk0d3-dbg/testing,unstable,stable 6.1.5-1+b1 amd64
      Fast and lightweight 2D rigid body physics library - debug
    
    

    Они имеют что-нибудь общее?

    • AlexWriter
      /#21474990

      нет, релизы пока публикуются только на github

    • gecube
      /#21482778

      Все нормальные имена уже заняты. Ну, вы знаете примеры )))

  7. orcy
    /#21475630

    По моему довольно крутая штука. Когда я изучал вопрос я находил обычно платные инструменты под Windows (LogViewer, LogViewPlus). Так что такой инструмент я думаю обязательно найдет своего пользователя.

  8. BubaVV
    /#21476400

    Видел, как для логов на S3 используется запрос в Snowflake. Штука упоротая и вроде как недешевая, но результат впечатляет

  9. cv28
    /#21476424

    Из той же оперы: cloudvyzor.com. Зип аплоадишь и ищешь. Или указываешь внешнее хранилище с зипами (шара, S3, Azure Blob). Можно облачную версию юзать, можно скачать поставить себе (Windows, 2.5MB).

  10. Valsha
    /#21477384

    есть конечно еще LogTail под Mac, вполне удобный. правда платный, но он не дорогой (пара чашек кофе)