В реальности, скорее всего, вы будете использовать четыре.
Каждый раз, когда мне приходится создавать приложение, есть вещи, которые я хочу занести в лог по разным причинам: отладка, статистика, потенциальные предупреждения или откровенные ошибки.
Большинство фреймворков и пакетов следуют стандарту PSR-3, который описывает, как работает система ведения логов. Это интерфейс, на который вы должны опираться при отправке логов в систему. В PHP чаще всего используют имплементацию Monolog, как очень гибкий и простой в понимании.
Реализация PSR-3 описывает 8 уровней логов. В порядке убывания «строгости»: Emergency, Alert, Critical, Error, Warning, Notice, Info и Debug. Попытка решить, какой из них выбрать, иногда сбивает с толку. Давайте разберём их на условном приложении.
Уровни логов
Давайте разберём их на условном приложении.
Это приложение фиксирует активность множества цифровых ключей (IoT) из стороннего хаба, которую затем можно увидеть на приборной панели. У каждого сотрудника есть своя карта и пароль для каждого ключа. Они будут отправлять события на хаб, который, в свою очередь, будет передавать данные в приложение с помощью простого HTTP-запроса.
8. DEBUG для разработки
Когда я закончил разработку, я запустил стейдж для внутреннего использования, где смотрю, как приложение себя ведет максимально детально. Множество отладочных сообщений со сгенерённой фейковой информации, но с валидной структурой было записано с помощью старого ключа, который мы использовали для тестирования.
В продакшене эти сообщения не пишутся, поскольку уровень логов равен 7, что означает, что в лог записывается все, что не является отладочным сообщением.
7. INFO для статистики
Приложение записывает в лог каждый вход в систему как info, с большим количеством информации, кроме чувствительных вещей, таких как персональные данные и доступы. Это чистая статистическая информация об активности на защищенном комплексе, которая должна быть полезна для построения графиков о том, кто, куда и когда перемещался.
6. NOTICE что-то значит
Когда пользователь вводит код ключа от двери, мы регистрируем это событие как уведомление. Изменение кода ключа через некоторое время - это нормально, поскольку оно обязательно, но ненормально, когда сотрудники меняют его до этого срока.
Это не значит, что их заставляли это делать, просто иногда люди забывают свой код и решают сгенерировать новый.
5. WARNING нежелателен
Когда пользователю не удается войти в систему, я отправляю сообщение о нескольких ошибках на уровне предупреждения с указанием ID пользователя. Так мы можем узнать, пытался ли кто-то получить доступ путем перебора кода.
Чаще всего это не ошибка, а значимое событие, которое может помочь в борьбе с несанкционированным доступом.
4. ERROR нестабилен
Некоторые старые модели ключей время от времени выдают мусор. Изношенная карточка выдала неправильные идентификаторы. Помехи в сигнале - тоже бывает. При возникновении любой из этих проблем хаб сообщал приложению об «ошибке», а оно, в свою очередь, записывало сообщение об ошибке в лог.
В сообщении указывается, какая дверь не работает. Позже будет отправлен техник для проверки ключа.
3. CRITICAL показвает состояние
Каждую минуту плюс несколько случайных секунд хаб шлёт «пинг» на каждый ключ, чтобы проверить его состояние. Я был почти уверен, что это работает с WebSockets через BLE, ну что ж.
Они редко не отвечали, но когда отвечали, то практически уходили в самоволку, так как хаб, вероятно, многократно убеждался, что это не ложное срабатывание. Любое событие, не отвечающее на код ключа, будет занесено в лог как критическое.
2. ALERT небезопасен
Если какой-либо код отправил приложению «заблокированный» ответ, например, когда кто-то пытается силой проникнуть внутрь, это событие будет записано в лог как тревога. Охрана немедленно отправлялась на осмотр комнаты. Редко кто случайно стучал в дверь, так что этот механизм был очень надежным. Я предполагаю, что ключ оснащен хорошо откалиброванными интеллектуальными датчиками и гироскопом.
Это также отправлялось, если приложение получало какой-нибудь странный или не ожидаемый запрос (например, «pong» от хаба). Не то чтобы хаб нельзя было взломать, но тем не менее.
1. EMERGENCY непригоден для использования
Наконец, если бы сам хаб отключился более чем на 1 минуту, в лог было бы записано аварийное событие, так как кто-то, вероятно, отключил бы питание хаба, что сделало бы слепой зоной активность дверей.
Вполне нормально проявлять некоторую вольность и помещать сообщения в другие уровни логов, чтобы они имели больше смысла, даже если они не соответствуют никаким свойствам. Например, когда хранилище заполнено наполовину, это сразу же становится CRITICAL, поскольку провайдер не торопится добавлять на машину дополнительные хранилища.
Просто использование четырех
В начале статьи я написал, что в основном использую четыре уровня логов. Это верно для большинства простых приложений, поскольку некоторые другие уровни логов по умолчанию используются другими системами.
DEBUG: Для всего, что показывает внутреннюю работу приложения.
ERROR: То, что не должно происходить, но произошло.
ALERT: Всё, что ставит под угрозу состояние приложения в краткосрочной перспективе.
EMERGENCY: Любая часть приложения перестала работать.
Это дает мне немного душевного спокойствия, поскольку я могу легко узнать, что произошло и с какой степенью серьезности. Надеюсь, это сработает и для вас.
Goron_Dekar
Использую 2 типа логов: отладка и всё остальное.
Причина достаточно проста: я не провидец и не знаю, какие события будут критичными, а какие нужно писать в статистику, это пусть решают те, кто организуют телеметрию. Им виднее, у них больше доступа к системе, больше источников данных и больше опыта в работе с инцидентами.
Для меня же так проще. А чем проще отправлять сообщения в логи тем больше шансов, что я сделаю эту отправку. Если каждый раз, когда мне надо было бы отправлять что-то в лог, мне надо было бы задумываться об уровне лога, боюсь, я бы чаще не отправлял ничего. И у системы было бы меньше телеметрии.
Vamp
Их легко определить. Критичные события - те, что вы хотели бы получать на email при их возникновении. Например, неперехваченное исключение, которое вылезло на самый верх и спровоцировало 500 ошибку. Или какая-нибудь специфическая ошибка при обращении к удалённому API, типа "закончились деньги на аккаунте" или "аккаунт заблокирован".
Никто кроме программиста не знает что означает та или иная запись в логе. Впрочем, даже сами программисты зачастую теряют это знание спустя год-два после разработки. Своим безразличием вы просто добавляете лишней работы коллегам из "отдела телеметрии".
Goron_Dekar
Да, это так. И я не вижу в этом ничего плохого.
Если один разработчик делает библиотеку, а другой её использует, это называется разделение труда. Вот и тут также: определять события, которые важны, это работа. И работа, требующая квалификации. Я не уверен, что у меня её достаточно.
А вот это верно только для уровня debug. Для уровня log сообщение должно быть понятным.