Комментарии 18
Довольно "хакерский" проект.
На Github перечислены некоторые ограничения, - например то, что работа Nerdlog нагружает серверы на которых запущены сервисы.
Я бы добавил ещё одно ограничение: если сервер взломали, то с Nerdlog я логи посмотреть не смогу. А вот если логи собирались на Elastic / Splunk / ... - то логи того, как лезут на сервер у меня останутся.
Вы правы, но это следствие того же ограничения. На Github в этом пункте о дополнительной нагрузке на сервер также указано, что если сервер вообще не отзывается по любой причине, то и логи посмотреть не получится. Но наверное вы правы, что стоит упомянуть и про сценарий со вломом в этом же пункте (если взломщики были настолько аккуратны, что стерли свои следы из логов).
Это не столько о том, что стёрли логи, а ещё про сценарий когда потеряли доступ к серверу. Заблокировали пользователя.
Или когда диск сдох. То в отправленных логах ещё бывает можно что-то увидеть, а вот на сам сервер зайти бывает уже не получается.
А, ну тогда это уже указано в доках (выделение мое):
Likewise, if the host becomes unresponsive for whatever reason, we can't get logs from it either.
И следующий параграф там также упоминает, что это можно решить синхронизацией логов на отдельный хост; rsyslog это умеет, насколько мне известно (но сам я не заморачивался. KISS и все такое).
Хаб $mol как будто бы лишний тут
Хмм, я не завсегдатай на Хабре, и, похоже, неправильно понял предназначение этого хаба: был почему-то уверен, что он для любых небольших утилит и т.д., но сейчас вижу, что это про конкретный фреймворк. Извиняюсь! Нужно было осмотреться получше.
Убрал его из статьи, спасибо, что указали!
Пока что просто в open source, значит. Если считаете, что статья хорошо подойдет в какие-то другие хабы, буду рад совету. Я еще думал про DevOps (т.к. знаю пару devops инженеров, использующих Nerdlog), но т.к. статья скорее про детали реализации, то сомневался про этот хаб, и пока не стал туда добавлять.
Поздравляю вы почти изборели либо «шитые файлы» - текстовые файлы когда первый столбец содержит длину строки - тогда не приходится просматривать все символы в поисках перевода строки.
Либо недоизобрели базу данных.
В вашем первом примере вызов
Cat filename | awk … можно упростить. Выкинуть cat. Awk с флагом -f позволяет читать сразу из файла.
Если вы обрабатываете файл - создаете индекс по датам, то почему бы не сохранить контент в SQLite?
Тогда у вас будет нормальный поиск/индекс по датам и с помощью full text search расширения SQLite сможете искать все что угодно и когда угодно.
Поздравляю вы почти изборели либо «шитые файлы» - текстовые файлы когда первый столбец содержит длину строки - тогда не приходится просматривать все символы в поисках перевода строки.
Либо недоизобрели базу данных.
Спасибо конечно, но сразу знать абсолютное смещение в файле все равно ведь быстрее, чем пропускать строку за строкой, даже с "шитими файлами" (Кстати, не слышал такого термина раньше, и не гуглится ничего по теме. Но из вашего описания понял, о чем речь)
В вашем первом примере вызов
Cat filename | awk … можно упростить. Выкинуть cat. Awk с флагом -f позволяет читать сразу из файла.
Вы правы, в этом простом примере можно (и даже без флага -f
можно - этот флаг нужен только если мы хотим читать сам awk-скрипт из файла). В реальности в Nerdlog так не получится, т.к. ему нужно будет отсечь ненужные части логов с помощью tail и head и уже результат обработать в awk, но да, в этом примере можно. Поправлю.
Если вы обрабатываете файл - создаете индекс по датам, то почему бы не сохранить контент в SQLite?
Потому, что тогда sqlite должен быть установлен на всех хостах, с которых мы хотим читать логи. Цель была - использовать только GNU утилиты, предустановленные почти везде, чтобы Nerdlog работал из коробки.
У вас соединение по ssh. Так что первой командой можете туда SQLite залить :)
Технически, можно. Но вы действительно думаете, что это того стоит? Еще и сделать так, чтобы работало не только на Linux, но и BSD и MacOS.
Для простого индекса по датам, как мне кажется, простой текстовый файл достаточен, и усложнять вещи незачем. KISS и все такое.
Linux,MacOS,BSD- MacOs вроде не серверная :)
SQLite кросс платформенный, работать будет везде. А вон реализаций awk может отличаться - может не стоять gawk
MacOS не серверная, но прочитать логи из localhost все равно удобно. Когда я этот проект только что опубликовал, несколько человек сразу сказали, что хотят поддержку localhost без ssh.
С gawk - да, есть такое, хорошо бы добавить поддержку POSIX awk. Но sqlite тут не заменит gawk (т.к. в индекс-файле, о котором идет речь, нет данных из логов - там только таймстампы и соответствующие номера строк и смещения).
Если же вы имели в виду вкачивать все данные из логов в sqlite, то это уж точно перебор для Nerdlog. И место на диске двойное будет занимать (существенно, если размер файл логов измеряется в гигабайтах, как было в нашем оригинальном случае). И для поддержки journalctl пришлось бы тогда все данные оттуда вычитывать сначала, а journalctl медленный, так что это первоначальная инициализация этой базы данных займет кучу времен.
Самая фишка этого проекта в том, чтобы не усложнять больше необходимого, и использовать простые текстовые файлы как "базу данных".
В общем, можно ли так сделать - можно. Но вот стоит ли - я не думаю.
Это знания погибшей цивилизации Атлантов :)
Я это то-ли у Декстеры, то-ли у Вирта читал ещё во времена Pascal. Современный интернет забит хламом, но ChatGPT помнит/знает:
«Как называется формат текстовых файлов когда в начале строки храниться ее длина?»
Такой формат часто называют length-prefixed (или length-prefixed text format / length-prefixed records). В нём каждая строка (или запись) начинается с числа, указывающего длину последующих данных.
Также встречаются альтернативные термины:
• Record length encoding
• Length-value format (LV)
• В контексте телекоммуникаций или бинарных протоколов — TLV (Type-Length-Value), но без Type — просто LV
Пример строки в таком формате:
05Hello
07Goodbye
Где 05 и 07 — это длина строки (часто фиксированной ширины, иногда бинарная, иногда ASCII).
Используется в:
• бинарных протоколах,
• некоторых форматов логов,
• системах обмена сообщениями,
• старых базах данных (например, в COBOL или старых мейнфреймах).
┌────────────────────────────┐
│ 🖥️ Клиент Nerdlog (Go + tview) │
└────────────┬───────────────┘
│
│ SSH
▼
┌────────────────────────────┐
│ 🖧 Удалённый сервер (Linux/Unix) │
│ - /var/log/syslog │
│ - bash, awk, tail, head │
└────────────────────────────┘
│
▼
📊 Логи фильтруются и агрегируются
📈 Строится гистограмма активности
📜 Отображаются последние сообщения
🧩 Индекс по времени → Быстрая выборка
📁 Форматы: лог-файлы и journalctl
Нет ли у вас желания сделать обертку для поддержки и хранения соединений к серверам в сетке?
В небольших сетках ограниченное количество серверов и удобно было бы не переподключаться каждый раз.
Пользуюсь XShell для SSH доступа к Linux серверам из Windows.
Интерфейс поддерживает хранение соединений.
Приложение нравится преднастроенными соединениями.

Нет ли у вас желания сделать обертку для поддержки и хранения соединений к серверам в сетке?В небольших сетках ограниченное количество серверов и удобно было бы не переподключаться каждый раз.
Можете пояснить, в каком виде представляете эту обертку?
Если я правильно понял идею, то: если не хочется закрывать соединения, просто не закрываете Nerdlog, и все. Т.к. Nerdlog - терминальное приложение, оно будет работать с любым терминальным мультиплексором (типа tmux или screen); так что можно держать несколько открытых nerdlog-ов, если хочется. Я не знаю, какие подобные мультиплексоры есть в Windows, но наверняка есть что-то подобное.
Ну и, конечно, можно просто держать открытым и один экземпляр nerdlog, подключенный сразу ко всем серверам, которые вам часто нужны.
Можете пояснить, в каком виде представляете эту обертку?
В приложении NerdLog реализовать возможность хранения соединений и отображения списка соединений.
Список соединений может быть отображен слева, как дополнительная панель.
Также хранить состояние подключения.
И если на момент закрытия приложения NerdLog соединение было активным, то при повторном старте приложения автоматически пересоединятся с сервером.
Это для случаев, когда требуется ongoing troubleshooting.
Я не знаю, какие подобные мультиплексоры есть в Windows, но наверняка есть что-то подобное.
Учитывая, что приложение с терминальным доступом, без разницы, какая операционная система используется.
Суть в том, чтобы создавать конфигурационный файл, в котором хранятся настроенные соединения для восстановления соединений при повторном старте NerdLog.
На первый взгляд идея рабочая, хотя не уверен, что доберусь до добавления новых элементов в польковательском интерфейсе скоро. Но в качестве минимальной реализации, в конфигурационный файл (`logstreams.yaml`) можно добавить опцию для каждого logstream, типа `persistent_connection: true`, и nerdlog тогда будет поддерживать соединения для этих логстримов постоянно открытыми.
Но этот файл нужно вручную править. Если делать автоматическое запоминание состояния при рестарте, то тут уже и без новых элементов в интерфейсе не обойтись, так что это не сейчас. Но в целом, согласен, что может быть полезно, спасибо за feature request.
del
Nerdlog: быстрый TUI-просмотрщик логов с удаленных хостов, с таймлайном, без сервера