🧑💻 Публічне інтерв'ю: Java, рефакторинг, логування
HTML-код
- Опубликовано: 29 сен 2024
- 👉 Github курсу: github.com/How...
👉 Канал курсу в телеграмі: t.me/HowProgra...
👉 NodeUA в телеграмі: t.me/HowProgra...
👉 Група в телеграмі: t.me/metaedu
👉 Зміст курсів: github.com/How...
Прикольне інтерв'ю, схоже на приємну бесіду, а не екзамен
Приємне інтервʼю. Виглядає та відчувається як бесіда двох скілових спеціалістів.
Не знаю, чому багато ставлять дизлайків, бо поруч інтерв'ю дівчини з першого курсу, теж по Java, так воно краше заходить
ruclips.net/video/nQ8I4e3n6CI/видео.html
ну, ви не порівнюйте Тимура з цим хлопцем)
стосовно принципів логування: можна немало розказати, що саме, де, як, коли, і з якою деталізацією
супер ❤
35:08 акції банку впадуть коли побачать що там гівнокод (думаю так)
Правила логов:
- логуем не класс, а датафлоу юзкейсу
- все записи в логе должны иметь коррялиционный АйДи, по которому легко искать, часто используют айди сессии
- операции заканчиваются в случае успеха месседжем "Success, ..."
- операции которые заканчиваются ошибкой, пишутся с месседжем "Error, ..."
- все експешены должны содержать коррелейшен айди, часто или в тескст ексепшена или отдельным датаполем
- выделяем две под структуры для лог лайн, одна которая индексуется, вторая которая не индексируется (metadata & payload)
- используем разные уровни логирования для контроля уровня "вербозити"/спама в логах
- не допускаем лик персональной и секьюрити информации в логи (маскинг, ексклуды, триминг)
- строим логи от логики: "а какие метрики мне надо мониторить?", это задает структуру где писать логи и какие именно.
- логеры еще могут именноваться (известно как таг, категория, тип логера)
- исключаем из логов любые вычесления, это должен быть максимально простой дата дамп с мессагой
- используем строки форматеров/шаблонные строки, не занимаемся конкатинацией строк
- используем враперы/обертки которые инджектят типичные паттерны: вход/выход/валидация/ексепшен хендлинг
- перехватываем ексепшены, и юзеру показываем только дженерик описание с кодом корреляции
- логов должно быть достаточно для повторения операции юзера в тестовой среде
- вербозити логи - практически бесполезно, можно использовать только для полного дампа данных
- логи должны конфигурироваться переменной окружения, которую легко менять в рантайме (без перезапуска инстанса)
- можно использовать первую мессагу метода для дампа в виде копи/пасте кода для запуска метода... аля нашел строку в логах скопипастил в терминал, запустил - и сразу повторил операцию юзера на своем тестового енвайронменте
- использовать "ноутбуки" аля юпитера для работы с логами (в датадоге например есть свои ноутбуки), где по-шагово выписываешь логику выгребания из логов полезную информацию
- если система постоянно меняется, то выгодно иметь "версию" логера (аля хеш, привязанный к гит-коммиту использованного для релиза)
- из обязательных полей в контексте логов, должен быть идентификатор инстанса (енвайронмент, регион, айди инстанса, айди джоба)
- ну и конечно не забываем про то что время во всех полях должно быть в одном формате
Еще добавлю:
- Периодически делайте рефакторинг логов. Смотрите где и как можно сократить количество текста. Это влияет на когнитивную сложность анализа логов. Сокращайте общеупотребимые термины. WRN вместо WARNING, ERR вместо ERROR.
- Длинные операции должны в конце показывать затраченное время. В моем движке для этого есть методы вида:
id = log.begin(...)
...
log.end(id, ...).
Есть отдельный класс который фиксирует переходы между состояниями и показывает длительность:
30.07.22 18:36:35 [gsm] Start => WaitCreg (4430 ms)
30.07.22 18:36:44 [gsm] WaitCreg => Setup (9630 ms)
30.07.22 18:36:45 [gsm] Setup => Started (360 ms)
- Для фильтрации по подсистемам добавляйте в начало строки лога префикс подсистемы, у меня это выглядит так:
30.07.22 18:36:30 [eth] WARN: Eth pref.on = 0
30.07.22 18:36:30 [gsm] Start...
Еще применяю отступы табом для форматирования вложенных операций, например:
[rule 0] LOOP '{cycle(2) $v2={{$v2}+1}} {cycle(3) $v3={{$v3}+1}}
[rule 0] '{cycle(2) $v2={{$v2}+1}}'
[rule 0] '$v2={{$v2}+1}' => '$v2=3'
[rule 0] '$v2={{$v2}+1}' => '$v2=4'
[rule 0] '{cycle(3) $v3={{$v3}+1}}'
[rule 0] '$v3={{$v3}+1}' => '$v3=4'
[rule 0] '$v3={{$v3}+1}' => '$v3=5'
[rule 0] '$v3={{$v3}+1}' => '$v3=6'
@@sergsapov2927 это больше к андройду подходит, а для бекенда логи на прямую уже почти никто не смотрит, все через системы аггригации логов, аля кибана/хаоссерч и т.п.
Потому надо отличать логи локальные от логов серверных. Локальные всегда с большой вербозити, чем серверные