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

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

    А туда ты не ходил так давно, что раздало файл с логами аж до 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.
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 35

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

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

        +4
        The application requires macOS 10.15 or later.

        Why?
          –1

          Потому, что для хипстеров.

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

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


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

                chipmunk/application/electron/dist/release
                

                На борту надо иметь:
                • node 10 и младше
                • ruby 2.6 и младше
                • rust
                  0
                  Не получилось
                  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

                    0
                    просто обновите ruby. Там были обновления URI библиотеки.
                      0
                      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
                      

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

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

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

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

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

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

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

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


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

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

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


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

                    0

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

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

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

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

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

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


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

                      +1
                      split+grep+ловим льва в пустыне
                        0
                        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
                        
                        

                        Они имеют что-нибудь общее?
                          0
                          нет, релизы пока публикуются только на github
                            0

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

                            +1

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

                            0
                            Видел, как для логов на S3 используется запрос в Snowflake. Штука упоротая и вроде как недешевая, но результат впечатляет
                              0
                              Из той же оперы: cloudvyzor.com. Зип аплоадишь и ищешь. Или указываешь внешнее хранилище с зипами (шара, S3, Azure Blob). Можно облачную версию юзать, можно скачать поставить себе (Windows, 2.5MB).
                                0
                                есть конечно еще LogTail под Mac, вполне удобный. правда платный, но он не дорогой (пара чашек кофе)
                                  0
                                  Ещё есть lnav, который достаточно лёгкий и распространённый, что бы иметь на удалённых серверах и более удобный, чем grep/sed/less magic
                                    +1
                                    О, а вот это дельная софтина. Даже в репах дебиана есть. Спасибо.
                                    ТС-у пожелаю сбросить пару десятков метров. Потому как в комментах уже упомянули, что тянуть логи на локалхост, или софтину на сотню метров на сервер как-то не очень хочется. А так — почему бы и нет? На первый взгляд довольно удобная штука.

                                  Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                  Самое читаемое