Как стать автором
Обновить

Комментарии 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.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации