Comments 40
p.s. И честно говоря, я не вижу разницы, из-за чего терять деньги — из-за упавшей БД или опечатке в коде, чтобы иметь для них разные уровни.
Numerical Severity Code 0 Emergency: system is unusable 1 Alert: action must be taken immediately 2 Critical: critical conditions 3 Error: error conditions 4 Warning: warning conditions 5 Notice: normal but significant condition 6 Informational: informational messages 7 Debug: debug-level messages
Эти уровни придумали вместе с протоколом syslog в 80-е и получилось неидеально. Пока писал, глянул на logging в питоне. Там сделано так же, как я описал выше
но здесь главное, чтоб не получилось 15 конкурирующих стандартов
Боюсь, что уже поздно: java.util.logging.Level, python logging levels, встроенный пакет логирования Go вообще не поддерживает уровней. С другой стороны, все эти реализации живут строго внутри соответствующих экосистем, так что большой беды от этого нет. А если учесть, что для пересылки по сети они, таки, переводятся в syslog, то избыточность уровней в стандарте — это даже и не плохо
Error в логе это локальный error, не обязательно глобальный, что бы всех на уши ставить. Если библиотека для чтения конфига не может прочитать, то, что вы ей передали в качестве параметра, то она вполне себе может сказать "error: не читается файл такой то", вероятно в самом приложении это детектится и используются настройки по умолчанию, в этом случае приложение может сказать дополнительно "warn: использую настройки по умолчанию". Если не нравится ошибка в библиотеке, то в приложении надо проверить предварительно, есть ли файл с конфигурацией и читаем ли он. Тогда останется только warn приложения. Я по крайней мере таким принципом пользуюсь и не мучаюсь.
Буду рад, если этот текст добавит разработчикам больше взаимопонимания и уменьшит споры о том, как "правильно".
Да нет, теперь у нас просто будет еще один вариант "как кто-то думает, что правильно".
У меня вот правило про Fatal
четкое: все, что привело к падению или остановке приложения (а у нас честное такое многопользовательское приложение) — это (и только это) Fatal
.
Но статья ведь о том, что механическое придание максимального уровня важности событию, которое происходит регулярно, бессмысленно.
Ну вот именно потому, что для вас это бессмысленно, а для меня — нет, и продолжатся споры, какой уровень чему ставить.
Чем не могут похвастаться все другие проекты.
Спор как раз в том, что вы думаете, что они себе этого не могут позволить, а они думают, что могут. И объективного способа этот спор разрешить нет.
Если этого не происходит — значит не так уж оно и важно, чтобы там в логах не было написано.
Вот именно потому, что не важно, что в логах написано, можно писать Fatal
.
Вы просто почему-то думаете, что Fatal
— это все бросили и немедленно переключились. А я думаю, что Fatal
— это пользователь не может пользоваться приложением. А вот надо ли бросать и переключаться — это уже не ко мне, а к тем, с кем SLA заключен.
Fatal — ситуация при которой приложение не может продолжать работу и должно быть немедленно остановлено.
Error — ситуация которая не должна была случиться в приложении, требует анализа и должна быть исправлена рано или поздно, в идеале в логе не должно быть ни одной ошибки.
Warning — ситуация которая может потребовать особого внимания, но при этом не является тем, что необходимо исправлять.
Info — минимально необходимая информация необходимая для анализа текущего состояния нормально работающего приложения.
Debug — подробная информация необходимая для отладки приложения, запись обычно включается только на время отладки приложения.
Trace — полное логирование всех входящих и исходящих сообщений в приложении, запись обычно включается только на время отладки приложения.
{Debug ... Critical}
добиться того же самого эффекта в плане информирования/реагирования, что и Вы — используя двумерную {Debug... Critical, Component}
. Причем цена вопроса с одномерной — нулевая — всего лишь за счет смещения «спектра» значений на одну ступеньку вниз и того факта, что сбои в критичных модулях сами по себе настолько важны, что уже сам уровень ошибки внутри это модуля теряет значение, потому им можно пренебречь.Проблема "одномерной" структуры в том, что она фиксирована. Вы не можете поменять приоритет реагирования на проблему в тот момент, когда система перешла из стейджинга в прод, скажем. А так вы просто настраиваете, что Critical
в стейджинге идет в емейл, а в проде — на пейджер.
target="Email"
, на проде условно minLevel='critical' target = "Пейджер"
minLevel='warning' maxLevel='error' target= "НеПейджер"
. (Я в основном по .NET, потому под «target» имеется ввиду target от Nlog бибилиотеки, для Serilog это 'sink' и т.д.)Ну, у него есть дополнительный смысл, как я понимаю, что для отдельных компонентов можно делать "снижение" уровня при маппинге на общий выход (в каком-то субкомпоненте его Fatal превращается в общий Error, а в каком-то вообще в Warning). Но я не смог с ходу найти вариант, когда такой маппинг надо регулировать в зависимости от режима запуска, так что сомневаюсь в необходимости.
(Хотя может быть, например, деление в зависимости от того, с кем соединение...)
Ну, у него есть дополнительный смысл, как я понимаю, что для отдельных компонентов можно делать "снижение" уровня при маппинге на общий выход
У кого "у него"?
У подхода автора статьи.
А как добавление промежуточных уровней (а "подход автора статьи" именно в этом) позволяет делать "снижение уровня при маппинге на общий выход"?
Trace, Info, Warning, Error, Fatal — кто все эти люди..?