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

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

Хороший анализ ситуации. Не очень понятно, что такое «Business info» и почему «оно» было в логах. Поясните, пожалуйста…
Не очень понял про Just in case логирование.
Фразой «выбросить и забыть» автор предлагает вообще не использовать дебажные логи?
Интересно как рещается проблема «отладки» нового функционала или предполагается, что скилл разработчиков настолько высок, что все проблемы решаются без наличия настолько низкоуровневых логов, в принципе?
Раздел про tracing интересен, но я не уверен, что все проблемы можно обработать сторонними сервисами.
Или я что-то упускаю?
Мне кажется тут надо-бы сделать разделение. Когда сервис только разрабатывается/создается «Just in case» логирование очень хорошо помогает найти ошибки, а вот когда сервис уже устаканился и работает, оно в принципе уже не очень нужно.
А если нужно расширять функицонал сервиса?
Или подход, что новая бизнес-логика после какого-то уровня сложности обязана реализовываться в другом сервисе?
По опыту когда сервис устаканился и работает находят баги, соответственно, нужно дебажить, зачастую, логами. Не правильнее ли грамотно настроить систему логирования, а не ограничиваться только сообщениями об ошибках в коде, ведь и сама логика работы в сервисе может быть довольно сложной даже без учета ошибок и всякого мониторинга?
Не правильнее ли грамотно настроить систему логирования…
Эта мысль похожа на фразу «Не правильнее ли сразу написать систему без ошибок», но я с вами согласен. Вот только как найти баланс между размерами логов (гигабайты логов каждый день?) и их будущей полезностью (каждую команду логгировать?) — вопрос довольно сложный.

У них было 250 000 строк логов в секунду. Что вы собрались там отлаживать? Вы даже десятую часть из этого прочесть не сможете.


Отлаживать надо в dev-окружении, а на продакшене смотреть метрики, как я понимаю.

У нас доходит до 40тб логов за день (и кстати эластик с этим справляется) и при этом отлаживать по логам всё ещё помогает.

Я собирался бы отлаживать бизне-логику, как обычно.
Зачастую, достаточно пары(десятков) секунд, чтобы локализовать проблему. Думаю, что даже самый просто греп справится с несколькими миллионами строк.


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

Тоже не совсем понял про just in case логи.
Зачастую они и дают понять контекст ошибок.
Что-то мне кажется, что Sentry не особо поможет прислав мне какой-нибудь InvalidOperationException, который возникает при определённых аргументах в методе, а по логам я как раз смогу увидеть/понять что предшествовало ошибке.


Или вы предлагаете заменить just in case логи на трейсинг?

В общем-то сентри об этом и пишут здесь
https://sentry.io/vs/logging/

НЛО прилетело и опубликовало эту надпись здесь

Кажется кто-то перепутал 250000 и 250000000.
А ещё пятеро кто поставили плюсы — не удосужились прочесть содержание коммента перед его оценкой.
Впрочем кбайт на строку тоже не совсем обычно выглядит.

НЛО прилетело и опубликовало эту надпись здесь
Не думаю, что с потолка. Тк например у нас сейчас строка лога в КликХаусе около 0.15Кб, в ЕластикСерча строка уже под 1Кб.
НЛО прилетело и опубликовало эту надпись здесь
Не в первый раз вижу, когда log base metrics становятся основой получения данных и не могу понять причину предпочтения этого подхода.

Те же business info (количество запросов от одного юзера на конкретный сервис), application performance (скорость выполнения запроса), errors (количество errors за N время) данные вполне можно получать в виде метрик — выйдет гораздо дешевле, быстрее и более информативно, ввиду бОльшей гибкости за счет дешевизны метрик.

Я не отрицаю пользу логов, но почему не использовать то и другое, вместо затрат на парсинг логов?
а выделенной железной машине стояло приложение, которое читало топик Kafka и писало в файлы на диск.

Сложно даже подсчитать количество попыток приготовить Elasticsearch. Предполагаю, что мы не умеем его готовить. Но это и не то, что нам нужно, если для его использования, как хранилища логов, требуются особые способности (скилы).

— удивительно, мой велосипед, трудоемкостью в одну человеко-неделю, забирал лог сообщения из ActiveMQ (тут похоже на ваше решение) и клал их в Lucene (индексы создавались ежедневно). Как профит — все хранится также в ФС, плюс поиск по логам на основе запросов Lucene (в эластике они же) и отсутствие каких либо настроек. Правда под нагрузкой в 250 000 записей в секунду я его не тестил) В моем случае, наверное уперся бы в скорость записи на диск, а дальше переполнилась бы очередь в ActiveMQ
Любителям .NET рекомендую взглянуть на EventPipe

Во всей презентации нет ответа на очевидный вопрос: а эластик и логстэш? Не то, чтобы я большой фанат явы, но впечатляющие 18Гб логов в сутки это куда менее пугающие 200kb в секунду, которые прекрасно перевариваются даже однонодовой конфигурацией ELK.

ТЕРАбайт*, а это 200мб/cек

А, пропустил. 18Тб логов — это серьёзно, и одинокий ELK от 200Мб/с будет страдать. Но минимальный шардинг эту проблему должен решить.


Кстати, какой у них там retention? 3 года логов по 18Тб/сутки — это 20Пб логов.

18гб логов в сутки это капля в море для эластика. Мы храним террабайты логов и некоторые дневные индексы легко переваливают за сотни гб.

Логи позволяют понимать, как работает код, который ты (кто-то) написал. Если ты и так понимаешь, как работает твой (чей-то) код, то логи не нужны. Но чаще присутствует иллюзия понимания, чем само понимание.


18 ТБ логов в день...

Это с каким уровнем логирования? Как по мне, так на prod'е trace/debug (обычно) не нужны, а если "250К строк в секунду" это уровня warn/err, то — ой!


Вполне допускаю, что trace/debug могут использоваться для сбора каких-то метрик, но, как правильно отметил автор публикации, профилирование != логирование.

Клиентские запросы логгировать например, по которым потенциально потом некие расследования вести.

Резонно. Возможно, есть смысл уровень "info" выделять в отдельный канал, либо сохранение запросов-ответов вынести в отдельную бизнес-функцию. В общем, это тема "на подумать".

Это не должно быть в логах, это должно быть в базе. А в общем случае, подобная информация в логах — это дыра в безопасности. Сколько уже было историй когда логи использовались для взлома (чисто за счет того что к логам более безалаберное отношение)

Смотря какая информация туда пишется.


Я в свое время писал миллиарды RADIUS-запросов в логи, по которым потом дебажил если что-то не так. Никакой ценной информации там не было.


Потом начал писать их же в InfluxDB в более структурированном виде — стало быстрее и удобнее.

Тоже давно кажется что логи не нужны. Экономический эффект уходит в минуса с растущими объёмами и сложностью обработки. Самое время пилить ИИ для анализа логов))

У эластика есть ИИ для анализа логов.
Вообще было бы интересно почитать историии про его использование

а зачем там ИИ если они сдантартизированы?
Принципиально неверное решение задачи)))

Перед тем как писать этот мерзкий велосипед(а любой велосипед мерзкий), нужно посмотреть, как часто и зачем логами пользуются. И на основе этого, что-то писать или не писать ничего вообще. А так вы сделали какие-то свои предположения.

Перед тем как говорить, что я там пишу какую то метрику, надо узнать, а как эта метрика будет использоваться и какие решения можно на основе ее принять.
TL;DR: Мы в Яндексе создали подразделение, которое слепило из логов других подразделений огромный комок грязи, из-за чего пришлось изобретать велосипеды для его обработки, а другие команды теперь ходят на поклон за тридевять земель, чтобы получить информацию из собственных логов и пофиксить баг.
Очень полезно иметь уникальный ID для каждого вызова логгера — сильно упрощает фильтрацию, маршрутизацию и поиск в логах. На прошлом месте работы написали пре-коммит скрипт, заменявший NEXT_LOG_ID (определенный по дефолту как -1, чтобы компилировалось) на следующий свободный идентификатор. Он же (скрипт) проверял количество вызовов логгера в модуле — чтобы не копипастили ID из других мест в коде (проверка не 100% но зато довольно быстрая).
Чтобы работать с логами однообразно сформировали собственный JSON-формат. Он закрывает большинство потребностей в дальнейшей работе с логами.

Не хотите глянуть на формат tree? Тут я о нём рассказывал: https://youtu.be/vBqJWQzPB3Y?t=5652


Если вкратце сравнить с JSON:


  1. Не тратится время на экранирование и разэкранирование строк.
  2. Компактный как минифицированный JSON.
  3. Наглядный как YAML.
  4. Крайне простой, что позволяет быструю его обработку.

Ваш пример лога мог бы выглядеть так:


info
    time \2006-01-02T15:04:05.000+07:00
    message \base message
    + custom_field \
        \my custom
        \multiline message
    context \r.y.a.w.r.b.MySuperClass
    request_id \7328467235678463578634578678456783647
    thread \123
Зарегистрируйтесь на Хабре, чтобы оставить комментарий