{"id":21110152,"url":"https://github.com/algrvvv/monlog","last_synced_at":"2026-05-18T10:33:51.191Z","repository":{"id":258640732,"uuid":"844714558","full_name":"algrvvv/monlog","owner":"algrvvv","description":"Мониторинг логов в реальном времени прямо в вашем браузере","archived":false,"fork":false,"pushed_at":"2024-12-31T18:21:44.000Z","size":149,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-10-26T09:03:03.584Z","etag":null,"topics":["go","golang","javascript","logs","web","websockets"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/algrvvv.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-08-19T20:31:01.000Z","updated_at":"2024-12-31T18:20:19.000Z","dependencies_parsed_at":"2025-10-26T09:02:53.368Z","dependency_job_id":"2cdcd6d6-d5bc-4ebd-8f1c-d7005d7c8a38","html_url":"https://github.com/algrvvv/monlog","commit_stats":null,"previous_names":["algrvvv/monlog"],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/algrvvv/monlog","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/algrvvv%2Fmonlog","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/algrvvv%2Fmonlog/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/algrvvv%2Fmonlog/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/algrvvv%2Fmonlog/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/algrvvv","download_url":"https://codeload.github.com/algrvvv/monlog/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/algrvvv%2Fmonlog/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33174773,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-18T09:27:30.708Z","status":"ssl_error","status_checked_at":"2026-05-18T09:27:28.300Z","response_time":71,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["go","golang","javascript","logs","web","websockets"],"created_at":"2024-11-20T00:58:22.344Z","updated_at":"2026-05-18T10:33:46.181Z","avatar_url":"https://github.com/algrvvv.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Monlog\n\nMonlog - мониторинг логов прямо в браузере в реальном времени, имеющий достаточно гибкую настройку и неплохой функционал!\n\n### Перед началом\nИзначально приложение задумывалось как self-hosted без возможности закрыть доступ извне,\nно в последней версии `v0.9.1` был добавлен способ аутентификации пользователя. \nЧтобы узнать подробнее, перейдите к разделу [Авторизация и аутентификация](#авторизация-и-аутентификация)\n\n### Установка\n\nКлонируем репозиторий\n```shell\ngit clone https://github.com/algrvvv/monlog.git\ncd monlog\n```\n\nЗапускаем проверку на наличие нужных утилит в системе\n\u003e ВАЖНАЯ ДЕТАЛЬ! Удаленные или локальные машины с которых идет чтение логов должны быть unix системами.\n\u003e Windows не поддерживается.\n\n```shell\n# проверяем на наличие нужных утилит без которых невозможна работа приложения\nmake install\n```\n\nНастраиваем конфигурацию после команды\n```shell\ncp config.example.yml config.yml\n```\n\nВ файле с примером конфигурации уже лежат хорошие варианты использования и настройки под ваши нужды.\nМожете ознакомиться с ним, а также с разделом [Настройка конфигурации](#настройка-конфигурации)\n\nДелаем билд\n```shell\nmake build\n```\n\n### Использование\n\nДля использования вам достаточно настроить корректно `config.yml` и запустить приложение\n```shell\n./bin/monlog\n```\n\nПриложение откроется на указанном вами порте в конфигурации. После чего вы можете выбрать интересующий вас \nсервер и смотреть за его логами в реальном времени.\n\nА если вы хотите отлучиться, то при срабатывании триггера на нужный уровень лога - вы получите,\nесли настроили, уведомление в телеграмм (или любое другое при использовании [кастомного драйвера]()).\n\n### Настройка конфигурации\n\nВ этом разделе я попытаюсь показать вам все тонкости настройки приложения.\nДля начала вам стоит просто глянуть файл `config.example.yml`, чтобы увидеть в нем комментарии\nк каждому полю и примерно уже понимать, что мы будем обсуждать здесь.\n\n### Настройка уведомлений\n\nДля уведомления можно настроить несколько полей:\n- \"notify\" - в этом поле можно указать название драйвера для уведомления\n- \"recipients\" - массив получателей. яв-ся дополнительной настройкой, которая нужна для более тонкой работы. К примеру указать айди чатов в телеграмм получателей.\n\nПо дефолту есть несколько вариантов уведомлений:\n- \"none\" или просто пустая строка \"\" - уведомления выключены.\n- \"telegram\" - драйвер уведомления, который требует дополнительной настройки в виде колонки recipients с указанием айди чатов.\n- \"terminal\" - драйвер уведомлений, который подходит для локальной разработки. Требует установленной утилиты `terminal-notifier`\n\nВ любой момент вы можете написать свой драйвер для уведомления. Для этого требуется реализовать интерфейс `notify.NotificationSender`, который получает уже настроенный `notify.Notification`:\n```go\ntype NotificationSender interface {\n\t// Send метод для отправки уведомления. Уже настроенный параметр для уведомлений, который в себе содежит в себе\n\t// все данные. подробнее смотреть Notification\n\tSend(notification *Notification) error\n}\n```\n\n`notification` - параметр, который в себе уже содержит все информацию о логе. Ваше задача - отформатировать и настроить ее отправку.\n\nПолный пример настройки драйвера: `/internal/notify/drivers/telegram.go`\n\nПодробнее: `go doc notify.NotificationSender` и `go doc notify.Notification`, а также доступные параметры для сервера: `go doc config.ServerConfig`\n\n\n#### Подключение к удаленному серверу\n\nВ данный момент для подключения к удаленному серверу, для большей безопасности, используется \nтолько способ с использованием ключей SSH. Если у вас они не настроены давайте быстренько сделаем это!\n\nДля начала давайте создадим пару ключей SSH\n```shell\nssh-keygen -t rsa -b 4096 -C \"some comment\"\n```\n\nПосле этого закинем на ваш удаленный сервер\n```shell\nssh-copy-ide [remote_username]@[server_ip_address]\n```\n\nВуаля! Теперь нам остается лишь указать путь до нашего `id_rsa` файла в конфигурации.\nОбычно это `~/.ssh/id_rsa`\n\n#### Настройка шаблона для парсинга строк логов\n\nДля каждого сервера в файле конфигурации предусмотрено поле `log_layout`, которое отвечает за \nшаблон строки лога. По этому шаблону строка парситься и получает нужные данные, к примеру, для\nуведомления. Для большего удобства в этой строке уже зарезервированы такие подстроки:\n- `%LEVEL%` - та часть строки, в которой указывается уровень лога, к примеру INFO, ERROR и тд.\n- `%TIME%` - подстрока со временем лога\n- `%MESSAGE%` - часть строки, где идет непосредственно сообщение лога\n- `...` - специальная вспомогательная конструкция равнозначная `*.?` в регулярных выражениях, которая подразумевает любые символы. Нужно для более детальной настройки вашего шаблона\nА в остальном этот шаблон работает как обычные регулярные выражения в го.\nСтоит также упомянуть, что формат времени в логах естественно будет отличаться от проекта к проекту, поэтому\n`%TIME%` будет основываться на поле конфигурации `log_time_format`, которая подробнее рассмотрена в разделе [ниже](#форматы-дат)\n\nА теперь я вам покажу для большей наглядности примеры таких строк под разные случаи жизни.\nДля большего удобства я буду показывать пример самой строки лога и шаблон к ней.\n\n```text\n--- log ---\n[2024.10.12 18:00:49] [INFO] database connected\n\n--- layout ---\n\\\\[%TIME%\\\\] \\\\[%LEVEL%\\\\] %MESSAGE%\n```\nВ примере выше используются дополнительные `\\` для правильного экранирования вашего шаблона.\nДва их потому, что если мы оставим один `\\`, то мы не сможем корректно распарсить наш `yaml` файл.\n\n```text\n--- log ---\nLOG ERROR [24.09.27 15:12:14] Connection refused\n\n--- layout ---\n^\\\\[LOG\\\\] ... %LEVEL% \\\\[%TIME%\\\\] %MESSAGE%\n```\n* `LOG` - ваша зарезервированная строка, которая есть в ваших логах\n\n```text\n--- log ---\n{\"time\":\"03.10.24 11:29:16\",\"level\":\"INF\",\"msg\":\"200 GET /home\",\"program_info\":{\"pid\":54605,\"go_version\":\"go1.23.1\"}}\n\n--- layout ---\n^{\\\"time\\\":\\\"%TIME%\\\",\\\"level\\\":\\\"%LEVEL%\\\",\\\"msg\\\":\\\"%MESSAGE%\\\",\\\"program_info\\\":...}$\n```\n\n##### Использование драйверов\n\nС последним обновлением появились драйвера для обработки строк логов. Это будет очень полезно и удобно\nособенно для json логгирования. Вы можете использовать приведенный выше способ или использовать драйвера. Во втором\nслучае вам нужно будет самостоятельно написать драйвер для обработки строки лога, которая не будет перезаписывать\nосновную строку, а лишь изменять ее на момент отображения. Для начала разберем пример:\n\nДопустим, у нас есть json строка: \n```json\n{\"message\":\"200 GET / ~0.0077750682830811\",\"context\":{\"ip\":\"127.0.0.1\"},\"level\":200,\"level_name\":\"INFO\",\"channel\":\"local\",\"datetime\":\"2024-11-29T12:39:09.354013+03:00\",\"extra\":{}}\n```\n\nДля того, чтобы наш драйвер корректно использовался в нашей системе необходимо реализовать интерфейс `LineHandleDriver`:\n```go\ntype LineHandleDriver interface {\n\t// GetName метод для получения названия драйвера\n\tGetName() (name string)\n\t// Handle метод для вашей кастомной обработки строки лога\n\tHandle(line string) (result string)\n}\n```\n\nПример полной реализации и загрузки драйвера вы можете увидеть в `internal/drivers/custom/`.\nВ файле `json_laravel_driver.go` можно увидеть пример конктрентной реализации драйвера.\nРезультатом его работы будет следующая строка из ранее показаного json:\n```text\nINFO [2024-11-29 12:30:23] 200 GET / ~0.0077750682830811\n```\n\nПреимущества такого способа заключается в гибкости. Вы в любой момент можете изменить логику и формат \nвывода сообщения из полученного джысона. Также драйвера можно переиспользовать, если структура и логика вашего\nдрайвера соответствует другому формату данных. Драйвера могут использоваться не только для json формата данных, но и для любого другого, \nтут уже дело вашей фантазии и реализации драйвера :D\n\nПосле того, как вы написал реализацию собественного драйвера и загрузили ее в общий список через функцию\n`init`, как в примере `json_laravel_driver.go`, то вам остается лишь в конфигурации к нужному серверу\nуказать параметр `log_driver` со значением, которое будет равно названию вашего драйвера (все примеры также есть в `config.example.yml`).\n\n#### Форматы дат\n\n\u003e Важно. Если вы используете драйвера для отображения данных, то формат времени нужно подстраивать под итоговую\n\u003e строку, то есть строку, которая выдет после работы драйвера.\n\nДля форматирования дат используется библиотека [metakeule/fmtdate](https://gitlab.com/metakeule/fmtdate), \nчтобы шаблоны дат было настроить удобнее и понятнее.\n\nПримеры кодов, взятые из репозитория библиотеки:\n```text\nM    - month (1)\nMM   - month (01)\nMMM  - month (Jan)\nMMMM - month (January)\nD    - day (2)\nDD   - day (02)\nDDD  - day (Mon)\nDDDD - day (Monday)\nYY   - year (06)\nYYYY - year (2006)\nhh   - hours (15)\nmm   - minutes (04)\nss   - seconds (05)\n\nAM/PM hours: 'h' followed by optional 'mm' and 'ss' followed by 'pm', e.g.\n\nhpm        - hours (03PM)\nh:mmpm     - hours:minutes (03:04PM)\nh:mm:sspm  - hours:minutes:seconds (03:04:05PM)\n\nTime zones: a time format followed by 'ZZZZ', 'ZZZ' or 'ZZ', e.g.\n\nhh:mm:ss ZZZZ (16:05:06 +0100)\nhh:mm:ss ZZZ  (16:05:06 CET)\nhh:mm:ss ZZ   (16:05:06 +01:00)\n```\n\n#### Наследование настроек\n\nВ примере ниже вы увидите как можно вынести повторяющиеся поля для настроек.\n\n```yaml\ndefault_servers_setting:\n  start_line: 0\n  notify: true\n  log_levels: \"ERROR\"\n  log_time_format: \"YYYY-MM-DD hh:mm\"\n  chat_ids: [ \"YOUR_TG_CHAT_ID\", \"ANOTHER_TG_CHAT_ID\" ]\n\nservers:\n  - id: 84\n    enabled: true\n    name: Server 1\n    log_dir: /path/to/server1/logs\n    # наследует параметры из default_server_config\n    \n  - id: 98\n    enabled: true\n    name: Server 2\n    log_dir: /path/to/server2/logs\n    log_levels: \"WARN|ERROR\" \n    # переназначаем для этого сервера настройки `log_levels`\n    # наследует параметры из default_server_config\n```\n\n### Авторизация и аутентификация\nВ этом разделе речь пойдет про возможность разместить приложение и не прибегать к каким то\nспособам закрытия доступа к вашему приложению от других. По умолчанию эта опция выключена, так что\nесли вам она не нужна - вы можете смело пропускать этот пункт и в документации, и в конфигурации :D\n\u003cbr\u003e\n\nВключив эту опцию для правильной работы вам нужно будет использовать команду:\n```shell\n# если вы запускаете напрямую с использованием го\ngo run cmd/monlog/main.go --create-user\n# либо используя бинарник (также можно использовать шортнейм: -c)\n./bin/monlog -c\n```\n\nПосле этого вас попросят ввести логин и пароль для вашего пользователя, под которым\nвы будете входить.\n\n\u003e **ВАЖНО:** Допускается иметь только одного пользователя, так как разделение по ролям никакого нет.\n\nВремя жизни сессии выставлено на одни сутки, в дальнейшем я вынесу это в конфигурацию.\nТакже стоит иметь в виду, что перезапустив сервер сессия станет неактуальной.\n\nВсе, теперь при переходе на сайт вам нужно будет обязательно залогиниться, прежде, чем получить \nдоступ к своим серверам с логами.\n\nЕсли вы нашли какие то баги или дырки в безопасности - смело бейте в ишьюсы!\n\n### Есть ошибки или предложения?\n\nЕсли вы заметили, что ваш шаблон строки лога почему то не работает, можете настроить\nполе `app.debug` на `true`, чтобы увидеть, какой вид принимает ваш шаблон и убедиться подходит ли\nсоставленное вами регулярное выражением подходим.\n\u003cbr\u003e\n\nЕсли вы заметили, что на некоторые ошибки вам не приходит уведомление в телеграмм, возможно дело в \nтом, что возможно логи пришли в одно и тоже время, которое имеет указанный вами шаблон, к примеру \n`20.09.24 14:00`. В таком случае оно будет записано в `state.yml` и при проверке следующего лога\nпрограмма посчитает его неактуальным, так как время либо равно, либо меньше сохраненного в \"состоянии\" (state.yml)\n\nВ таких случая рекомендуется использовать формат времени, в котором есть секунды.\n\n\u003cbr\u003e\nС нетерпением жду ваши ишьюсы и реквесты :D\n\n### TODO\n\n- [x] в логгировании вебсокетов зачесался \"!BADKEY\"\n- [x] сделать настраиваемое колво подгружаемых логгов до момента подключения\n- [x] разобраться с багом вечного отключения сервера\n- [x] исправить баг при повторном подключении к серверу логгирование останавливается\n- [x] добавить возможность догружать логги до подключения пользователя к просмотру логгов\n- [x] добавить местное сохранение логгов и ограничить по размерам с перезаписью\n- [x] улучшить визуал страницы с логами. как минимум исправить баг с невозможностью скролла\n- [x] разделить подключение к локальным или удаленным серверам\n- [x] сделать возможность просмотра сразу нескольких файлов с одного сервера в одной вкладке\n- [x] добавить валидацию структуры конфигурации\n- [x] можно попробовать добавить ужесточенную валидацию. к примеру, для id_rsa - filepath\n- [x] добавить в будущем дефолтные конфигурации для серверов\n- [x] сделать тг бота с уведомлениями\n- [x] добавить разные шаблоны логов для мульти серверов. Оставляем ограниченный функционал и менее гибкую настройку\n- [x] парсер для джысон формата строки логов (слишком ситуативный момент, скорее всего будет удобнее просто смотреть на json строку, чтобы видеть всю полноту картины)\n- [x] добавить возможность вынести айди чатов для тг в общие настройки (в данный момент все ломается)\n- [x] исправить ошибку с рередерингом страницы с ошибкой\n- [ ] можно попробовать добавить хот релоад конфига\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falgrvvv%2Fmonlog","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Falgrvvv%2Fmonlog","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falgrvvv%2Fmonlog/lists"}