что такое запись логов в файл в вк

Лог: что это, зачем нужен и где его найти?

Зачем нужны лог файлы?

В некоторых ситуациях каждому пользователю ПК или сервера требуется проверить логи. Рассмотрим зачем именно нужны лог файлы.

1. Логи могут понадобится, если нужно узнать статистику по сайту. Например, логи сайтов отображают следующую информацию:

а) статистику посещаемости

б) точки входа и выхода с сайта

в) поисковые запросы, по которым приходят посетители, и наиболее популярные страницы сайта

г) поисковики, страны и браузеры посетителей

д) уровень конверсии и страницы сайта, которые никто не посещает

е) сайты, которые ссылаются на этот ресурс.

2. В случае вирусов или Дддос атаки на сайт, логи помогут быстрее выяснить причину и соответственно помочь устранить ее.

3. Для восстановления доступов испольузются логи авторизации, которые собирают данные о попытках входа.

4. В случае ошибок в работе определенного ПО, устройства или ОС, когда необходимо определить источник проблемы.

Логи (server logs) помогают контролировать работу серверной машины и в случае возникновения ошибок быстро их находить и устранять. Логи используются практически везде, где ведется запись и прослеживание истории программного процесса. В первую очередь это необходимо в целях безопасности. Для того, чтобы найти и проанализировать логи, используют специально предназначенное для этого ПО. Некоторые логи могут обладать очень большим размером, поэтому время от времени их нужно очищать. Лог файл показывает события и его непосредственный источник. Причиной события может быть:

Какие есть виды логов?

На практике видов логов может быть несколько. Рассмотрим каждый из них.

Как найти логи?

Место, где находятся логи зависит от используемого ПО, заданных настроек и пути, который заведомо установил администратор сервера.

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

Названия файлов: журнал ошибок – error.log; журнал доступов – log; основной журнал – syslog; журнал загрузки системы – dmesg.

В ОС Windows свой способ структуризации логов, в котором выделяют уровни событий: подробности; сведения; предупреждение; ошибка; критический. Пользователь может сортировать и фильтровать записи, в зависимости от того, что именно ему нужно.

Что делать с логами?

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

Даже беглый анализ логов может помочь выяснить причины чрезмерной нагрузки на сайт, поэтому если вам нужна помощь, чтобы разобраться с логами и исправить возникшие ошибки работы сервера, обращайтесь в техническую поддержку ГиперХост.

Включение и выключение записей логов на сервере происходит в панели управления. В большинстве случаев эта функция доступна в разделе панели Журнал или Логи. Более детально об этом вы можете уточнить непосредственно у вашего хостера.

Источник

О том, как ВКонтакте собирает информацию о нас

Сегодня, ковыряя отснифеный трафик официального приложения ВКонтакте под Android, пытаясь найти особенности, по которым API отсеивает официальные приложения для получения музыки, я наткнулся на запросы довольно интересного содержания.

что такое запись логов в файл в вк. Смотреть фото что такое запись логов в файл в вк. Смотреть картинку что такое запись логов в файл в вк. Картинка про что такое запись логов в файл в вк. Фото что такое запись логов в файл в вк

Автор: Владислав Велюга (vlad805)

Disclaimer

Update 6

А еще давайте сразу, вот что ответил (где-то) Андрей Рогозов про данную информацию.

что такое запись логов в файл в вк. Смотреть фото что такое запись логов в файл в вк. Смотреть картинку что такое запись логов в файл в вк. Картинка про что такое запись логов в файл в вк. Фото что такое запись логов в файл в вк

Предисловие

Результаты

Проснифив только авторизацию, аудиозаписи и вообще первые минуты после авторизации в приложении, уже можно поймать все эти странные запросы. Итак:

что такое запись логов в файл в вк. Смотреть фото что такое запись логов в файл в вк. Смотреть картинку что такое запись логов в файл в вк. Картинка про что такое запись логов в файл в вк. Фото что такое запись логов в файл в вк

Довольно часто промелькивали запросы к некоему сервису vigo.ru. Сервис позиционирует себя как аналитика в передаче, поиска ошибок, проблем и обработке видео. Но странно, ведь я всего лишь авторизовался, перешел в аудио и пролистал свою стену, где не было ни единого видеоролика (которые должны были автоматически проигрываться?), а запросов скопилось около 5-7 штук. Помимо notify еще был network_status. что такое запись логов в файл в вк. Смотреть фото что такое запись логов в файл в вк. Смотреть картинку что такое запись логов в файл в вк. Картинка про что такое запись логов в файл в вк. Фото что такое запись логов в файл в вк

Приложение делает бенчмарки и зачем-то передает время запроса к API и время загрузки изображений. Видимо, усредненные данные. что такое запись логов в файл в вк. Смотреть фото что такое запись логов в файл в вк. Смотреть картинку что такое запись логов в файл в вк. Картинка про что такое запись логов в файл в вк. Фото что такое запись логов в файл в вк

Чуток не негатива: приложение отправляет сообщения об ошибках, если, например, была попытка загрузить изображение (например, оно было прикреплено к посту), но произошла какая-то ошибка. На скрине предоставлен пример, когда изображение просто отсутствовало на сервере (ошибка 404 Not Found). upd: хотя вот попался момент, когда state=success и никаких других «опознавательных знаков» не было. что такое запись логов в файл в вк. Смотреть фото что такое запись логов в файл в вк. Смотреть картинку что такое запись логов в файл в вк. Картинка про что такое запись логов в файл в вк. Фото что такое запись логов в файл в вк

С видеозаписями обстоят дела еще хуже. Здесь передается информация о таких событиях как «volume_on», «volume_off» (видимо, включение/выключение звука, но это неточно), «fullscreen_on», «fullscreen_off» (переход и выход в/из полноэкранного режима), событие «video_play», которое просто отсылает текущую позицию просмотра видео, где-то с периодичностью 10-20 секунд. upd: хотя вот Андрей подсказал идею, для чего это сделано: для того, чтобы запоминалось место, на котором пользователь остановился при просмотре видео, чтобы он мог переключиться с мобильного на ПК и на ПК продолжить смотреть с места, где был в последний раз на мобильном. что такое запись логов в файл в вк. Смотреть фото что такое запись логов в файл в вк. Смотреть картинку что такое запись логов в файл в вк. Картинка про что такое запись логов в файл в вк. Фото что такое запись логов в файл в вк

При закрытии страницы (активити) с видео, приложение запрашивает метод video.viewSegments, в параметрах которого передаются рейнжы (отрезки) таймкода, которые были просмотрены пользователем.

В Kate Mobile таких сливов замечено не было. Единственное, после ввода в эксплуатацию нового алгоритма выдачи аудиозаписей, и Kate, и официальному приложению нужно обращаться к Google Accounts для получения некого receipt-токена. И всё.

О том, как работают приложения на iOS, Windows Phone мне только можно догадываться. Их пакеты не перехватывал, и устройств не имею.

Повторюсь, такие данные, как ближайшие точки доступа Wi-Fi, текущее местоположение пользователя, а также все его действия не отправляются сторонними приложениями, такими как Kate Mobile, VK Coffee (модификация официального, с вырезанными метриками и пр.), моим сайтом-клиентом APIdog и пр.

Update 2

Друг-разработчик Андрей добавил ещё скринов того, что сливается официальным приложением под Android.

что такое запись логов в файл в вк. Смотреть фото что такое запись логов в файл в вк. Смотреть картинку что такое запись логов в файл в вк. Картинка про что такое запись логов в файл в вк. Фото что такое запись логов в файл в вк

Название точки доступа, к которой подключено устройство, а также другие, которые находятся в зоне досигаемости, их сигнал в dB, MAC-адреса.

Плюсом от него же, вот что отправляет официальное приложение для Windows

что такое запись логов в файл в вк. Смотреть фото что такое запись логов в файл в вк. Смотреть картинку что такое запись логов в файл в вк. Картинка про что такое запись логов в файл в вк. Фото что такое запись логов в файл в вк

Только версию системы, версию приложения, метод ввода.

Update 3

Эдуард Безменов, разработчик модификации официального приложения VK Coffee, прокомментировал этот пост так:

Update 4

Григорий Клюшников, бывший разработчик этого самого приложения, как оказывается, был сам против включения сервисов Vigo в приложение:

А вот, что на самом деле представляет Vigo по описанию Григория:

Отправка местоположения, как оказалось, производится только при просмотре отдельного поста. На аудиозаписи это не влияет, как некоторые стали считать, что в зависимости от региона некоторые треки «скрывается».

Update 5: Ответы от ВКонтакте

Мобильная техподдерка

Денис решил всё-таки добиться ответов на наши вопросы и задал их мобильной поддержке ВК (id333)

что такое запись логов в файл в вк. Смотреть фото что такое запись логов в файл в вк. Смотреть картинку что такое запись логов в файл в вк. Картинка про что такое запись логов в файл в вк. Фото что такое запись логов в файл в вк

Оказывается, Ваше местоположение, данные для таргетинговой рекламы, список установленных приложений и сети Wi-Fi жизненно необходимы для приложения и сайта в целом.

В ответ на последний вопрос, поддержка решила отойти от темы.

что такое запись логов в файл в вк. Смотреть фото что такое запись логов в файл в вк. Смотреть картинку что такое запись логов в файл в вк. Картинка про что такое запись логов в файл в вк. Фото что такое запись логов в файл в вк

О том, как это было получено

Подручные средства

Подготовка: создание сертификата SSL

В phrase key вводим что-то типа пароля. Он нам еще понадобится. Затем его еще раз повторить. Остальные поля можно оставить пустыми/не вводить. По окончанию в текущей директории будет создано два файла.

Подготовка: установка нашего сертификата на устройство

Передаем файл cert.pem на устройство и устанавливаем его в систему. Обращу внимание, что для установки сертификата необходимо, чтобы на телефоне был какая-нибудь защита на экране блокировки (графический ключ, пароль или PIN).

что такое запись логов в файл в вк. Смотреть фото что такое запись логов в файл в вк. Смотреть картинку что такое запись логов в файл в вк. Картинка про что такое запись логов в файл в вк. Фото что такое запись логов в файл в вк

что такое запись логов в файл в вк. Смотреть фото что такое запись логов в файл в вк. Смотреть картинку что такое запись логов в файл в вк. Картинка про что такое запись логов в файл в вк. Фото что такое запись логов в файл в вк

Пошаговая установка сертификата на Android 5.1

Подготовка: переброс портов

Возвращаемся на Linux, вбиваем в терминал:

Подготовка: Ettercap

После установки его запускаем.

Снифинг данных

что такое запись логов в файл в вк. Смотреть фото что такое запись логов в файл в вк. Смотреть картинку что такое запись логов в файл в вк. Картинка про что такое запись логов в файл в вк. Фото что такое запись логов в файл в вк

что такое запись логов в файл в вк. Смотреть фото что такое запись логов в файл в вк. Смотреть картинку что такое запись логов в файл в вк. Картинка про что такое запись логов в файл в вк. Фото что такое запись логов в файл в вк

что такое запись логов в файл в вк. Смотреть фото что такое запись логов в файл в вк. Смотреть картинку что такое запись логов в файл в вк. Картинка про что такое запись логов в файл в вк. Фото что такое запись логов в файл в вк

что такое запись логов в файл в вк. Смотреть фото что такое запись логов в файл в вк. Смотреть картинку что такое запись логов в файл в вк. Картинка про что такое запись логов в файл в вк. Фото что такое запись логов в файл в вк

Конец подготовки: SSLSplit

Далее в терминале ставим sslsplit:

Когда установка завершена, создаем директории:

И в текущей директории (где лежат файлы cert.pem и key.pem)

Выходим из аккаунта в приложении на телефоне.

В текущей директории выполняем:

Вводим phrase key, который указывали при создании сертификата.

В logfile.log будут записываться неполные логи (именно домен, адрес, порт), в директорию logs будут записываться подробные запросы, заголовки и ответы.

Далее авторизуемся в приложении и видим, как в терминале, в logfile.log и в директории logs появляются данные. Для остановки снифинга жмем в терминале Ctrl+C.

Логи в директории logs будут записываться под владельцем и группой root без доступа к чтению и записи от текущего пользователя. Поэтому нужно изменить владельца. В директории с сертификатами вводим

Далее можно просматривать файлы с помощью обычного текстового редактора.

Update

Как позже подсказал Антон, снифинг можно выполнить двумя кликами с помощью приложений для Android, и тогда вот эта длиннющая инструкция не понадобится. Но. кому как удобнее.

Благодарности

Также выражается благодарность Константину за наводку и подробную инструкцию по снифингу.

Источник

Использование ClickHouse в VK, или Зачем мы написали KittenHouse

что такое запись логов в файл в вк. Смотреть фото что такое запись логов в файл в вк. Смотреть картинку что такое запись логов в файл в вк. Картинка про что такое запись логов в файл в вк. Фото что такое запись логов в файл в вкВ начале года мы решили научиться хранить и читать отладочные логи ВКонтакте более эффективно, чем раньше. Отладочные логи — это, к примеру, логи конвертации видео (в основном вывод команды ffmpeg и список шагов по предварительной обработке файлов), которые иногда бывают нам нужны лишь спустя 2-3 месяца после обработки проблемного файла.

На тот момент у нас было 2 способа хранения и обработки логов — наш собственный logs engine и rsyslog, которые мы использовали параллельно. Стали рассматривать другие варианты и поняли, что нам вполне подходит ClickHouse от Яндекса — решили его внедрять.

В этой статье я расскажу о том, как мы начали использовать ClickHouse ВКонтакте, на какие грабли при этом наступили, и что такое KittenHouse и LightHouse. Оба продукта выложены в open-source, ссылки в конце статьи.

Задача сбора логов

Требования к системе:

Возможные решения

Давайте вкратце перечислим варианты, которые мы рассматривали, и их минусы:

Logs Engine

– Умеет отдавать только последние N строк, которые помещаются в RAM.
– Не очень компактное хранение (нет прозрачного сжатия).

Hadoop

– Не во всех форматах есть индексы.
– Скорость чтения могла быть и выше (зависит от формата).
– Сложность настройки.
– Нет возможности вставки с десятков тысяч серверов (нужна Kafka или аналоги).

Rsyslog + файлы

– Нет индексов.
– Низкая скорость чтения (обычный grep/zgrep).
– Архитектурно не поддерживаются строки >4 Кб, по UDP ещё меньше (1,5 Кб).
± Компактное хранение достигается путем logrotate по крону

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

LSD + файлы

– Нет индексов.
– Низкая скорость чтения (обычный grep/zgrep).
– Не особо расчитан на вставку с десятков тысяч серверов.
± Компактное хранение достигается путем logrotate по крону.

Отличия от rsyslog в нашем случае в том, что LSD поддерживает длинные строки, но для вставки с десятков тысяч серверов требуются существенные доработки внутреннего протокола, хотя это и можно сделать.

ElasticSearch

– Проблемы с эксплуатацией.
– Нестабильная запись.
– Нет UDP.
– Плохое сжатие.

ELK стек является уже почти промышленным стандартом для хранения логов. По нашему опыту — всё хорошо со скоростью чтения, а вот с записью бывают проблемы, например, во время слияния индексов.

ElasticSearch прежде всего предназначен для полнотекстового поиска и относительно частых запросов на чтение. Нам же важнее стабильная запись и возможность более-менее быстро прочитать наши данные, причём по точному совпадению. Индекс у ElasticSearch заточен под полнотекстовый поиск, и занимаемый объём на диске довольно велик по сравнению с gzip оригинального содержимого.

ClickHouse

По большому счёту, единственное, что нас не устраивало в ClickHouse — отсутствие общения по UDP. По факту, из перечисленных вариантов оно было только у rsyslog, но при этом rsyslog не поддерживал длинные строки.

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

Зачем нужен KittenHouse

Как Вы, наверное, знаете, ВКонтакте работает на PHP/KPHP, с «движками» (микросервисами) на C/C++ и немножко на Go. У PHP нет концепции «состояния» между запросами, кроме, возможно, общей памяти и открытых соединений.

Поскольку у нас десятки тысяч серверов, с которых мы хотим иметь возможность отправлять логи в ClickHouse, держать открытым соединения из каждого PHP-worker’а было бы накладно (на каждый сервер может приходиться по 100+ воркеров). Поэтому нам нужен какой-то прокси между ClickHouse и PHP. Мы назвали этот прокси KittenHouse.

KittenHouse, v1

Сначала решили попробовать как можно более простую схему, чтобы понять, будет наш подход работать или нет. Если Вам на ум при решении этой задачи приходит Kafka, то Вы не одиноки. Мы, однако, не хотели использовать дополнительные промежуточные сервера — в этом случае можно было легко упереться в производительность этих серверов, а не самого ClickHouse. К тому же, мы собирали логи и нам нужна была предсказуемая и небольшая задержка вставки данных. Схема выглядит следующим образом:

что такое запись логов в файл в вк. Смотреть фото что такое запись логов в файл в вк. Смотреть картинку что такое запись логов в файл в вк. Картинка про что такое запись логов в файл в вк. Фото что такое запись логов в файл в вк

На каждом из серверов ставится наш локальный прокси (kittenhouse), и каждый инстанс держит строго одно HTTP-соединение с нужным ClickHouse-сервером. Вставка осуществляется в буферные таблицы, поскольку в MergeTree часто вставлять не рекомендуется.

Возможности KittenHouse, v1

Первая версия KittenHouse умела довольно мало, однако для тестов этого было достаточно:

Первые проблемы

С первой проблемой мы столкнулись, когда «погасили» ClickHouse сервер на несколько часов и потом включили обратно. Ниже можно видеть load average на сервере после того, как он «поднялся»:

что такое запись логов в файл в вк. Смотреть фото что такое запись логов в файл в вк. Смотреть картинку что такое запись логов в файл в вк. Картинка про что такое запись логов в файл в вк. Фото что такое запись логов в файл в вк

Объясняется это довольно просто: у ClickHouse модель работы по сети — thread per connection, поэтому при попытке сделать INSERT с тысячи узлов одновременно, началась очень сильная конкуренция за ресурсы CPU и сервер еле отвечал. Тем не менее, все данные в конечном счёте вставились и ничего не упало.

Для решения этой проблемы мы поставили nginx перед ClickHouse и, в целом, это помогло.

Дальнейшее развитие

В процессе эксплуатации столкнулись ещё с некоторым количеством проблем, в основном связанных не с ClickHouse, а с нашим способом его эксплуатации. Вот ещё грабли, на которые мы наступили:

Большое количество «кусков» у Buffer таблиц приводит к частым сбросам буфера в MergeTree

В нашем случае было 16 кусков буфера и интервал сброса раз в 2 секунды, а таблиц 20 штук, что давало до 160 вставок в секунду. Это периодически очень плохо сказывалось на производительности вставки — появлялось много фоновых слияний и утилизация дисков достигала 80% и выше.

Решение: увеличили интервал сброса буфера по умолчанию, уменьшили число кусков до 2.

Nginx отдает 502, когда заканчиваются соединения с upstream

Само по себе это не является проблемой, но в сочетании с частым сбросом буфера это давало достаточно высокий фон 502 ошибок при попытке вставки в любую из таблиц, а также при попытке выполнить SELECT.

Решение: написали свою reverse proxy с использованием библиотеки fasthttp, которая группирует вставку по таблицам и очень экономно расходует соединения. Также она различает SELECT и INSERT и имеет раздельные пулы соединений для вставки и для чтения.

что такое запись логов в файл в вк. Смотреть фото что такое запись логов в файл в вк. Смотреть картинку что такое запись логов в файл в вк. Картинка про что такое запись логов в файл в вк. Фото что такое запись логов в файл в вк

Начала заканчиваться память при интенсивной вставке

У библиотеки fasthttp есть свои достоинства и недостатки. Один из недостатков — то, что запрос и ответ полностью буферизуются в памяти перед тем, как отдать управление обработчику запроса. У нас это выливалось в то, что если вставка в ClickHouse «не успевала», то буферы начинали расти и в конечном итоге заканчивалась вся память на сервере, что приводило к убийству reverse proxy по OOM. Коллеги нарисовали демотиватор:

что такое запись логов в файл в вк. Смотреть фото что такое запись логов в файл в вк. Смотреть картинку что такое запись логов в файл в вк. Картинка про что такое запись логов в файл в вк. Фото что такое запись логов в файл в вк

Решение: патчинг fasthttp для поддержки стриминга тела POST-запроса оказался непростой задачей, поэтому решили использовать Hijack() соединения и апгрейдить соединение на свой протокол, если пришел запрос с HTTP-методом KITTEN. Поскольку сервер должен ответить MEOW в ответ, если понимает этот протокол, вся схема называется протоколом KITTEN/MEOW.

Мы читаем только из 50 случайных соединений одновременно, поэтому, благодаря TCP/IP, остальные клиенты «ждут» и мы не расходуем память на буферы, пока до соответствующих клиентов не дошла очередь. Это сократило потребление памяти минимум в 20 раз, и больше подобных проблем у нас не было.

ALTER таблиц может идти долго, если есть долгие запросы

У ClickHouse неблокирующий ALTER — в том смысле, что он не мешает выполняться как SELECT-запросам, так и INSERT-запросам. Но ALTER не может начаться, пока не закончили исполняться запросы в эту таблицу, отправленные до ALTER.

Если у вас на сервере есть фон «долгих» запросов в какие-нибудь таблицы, то вы можете столкнуться с ситуацией, что ALTER на эту таблицу не будет успевать выполняться за дефолтный таймаут в 60 секунд. Но это не значит, что ALTER не пройдет: он выполнится, как только закончат выполняться те самые SELECT-запросы.

Это означает, что вы не знаете, в какой на самом деле момент времени произошел ALTER, и у вас нет возможности автоматически пересоздать Buffer-таблицы, чтобы их схема всегда была одинаковой. Это может приводить к проблемам при вставке.

что такое запись логов в файл в вк. Смотреть фото что такое запись логов в файл в вк. Смотреть картинку что такое запись логов в файл в вк. Картинка про что такое запись логов в файл в вк. Фото что такое запись логов в файл в вк

что такое запись логов в файл в вк. Смотреть фото что такое запись логов в файл в вк. Смотреть картинку что такое запись логов в файл в вк. Картинка про что такое запись логов в файл в вк. Фото что такое запись логов в файл в вк

Решение: Планируем в итоге полностью отказаться от использования буферных таблиц. В целом, у буферных таблиц есть сфера применения, мы пока используем их и не испытываем огромных проблем. Но сейчас мы наконец дошли до момента, когда проще реализовать функциональность буферных таблиц на стороне reverse proxy, чем продолжать мириться с их недостатками. Примерная схема будет выглядеть вот так (пунктирной линией показана асинхронность ACK на INSERT).

что такое запись логов в файл в вк. Смотреть фото что такое запись логов в файл в вк. Смотреть картинку что такое запись логов в файл в вк. Картинка про что такое запись логов в файл в вк. Фото что такое запись логов в файл в вк

Чтение данных

Допустим, мы разобрались со вставкой. Как читать эти логи из ClickHouse? К нашему сожалению, удобных и простых в эксплуатации инструментов для чтения сырых данных (без построения графиков и прочего) из ClickHouse мы не нашли, поэтому написали своё решение — LightHouse. Его возможности довольно скромные:

Просмотр структуры таблицы

что такое запись логов в файл в вк. Смотреть фото что такое запись логов в файл в вк. Смотреть картинку что такое запись логов в файл в вк. Картинка про что такое запись логов в файл в вк. Фото что такое запись логов в файл в вк

что такое запись логов в файл в вк. Смотреть фото что такое запись логов в файл в вк. Смотреть картинку что такое запись логов в файл в вк. Картинка про что такое запись логов в файл в вк. Фото что такое запись логов в файл в вк

Результаты

ClickHouse — практически единственная open-source база данных, которая «прижилась» ВКонтакте. Мы довольны скоростью её работы и готовы мириться с недостатками, о которых ниже.

Сложности в работе

В целом, ClickHouse — очень стабильная база данных и очень быстрая. Однако, как и с любым продуктом, особенно таким молодым, есть особенности в работе, которые нужно учитывать:

Open-source

KittenHouse и LightHouse теперь доступны в open-source в нашем github-репозитории:

Юрий Насретдинов, разработчик в отделе backend-инфраструктуры ВКонтакте

Источник

Как правильно писать логи (?)

Тема может и банальная, но когда программа начинает работать как то не так, и вообще вести себя очень странно, часто приходится читать логи. И много логов, особенно если нет возможности отлаживать программу и не получается воспроизвести ошибку. Наверно каждый выработал для себя какие то правила, что, как и когда логировать. Ниже я хочу рассмотреть несколько правил записи сообщений в лог, а также будет небольшое сравнение библиотек логирования для языков php, ruby и go. Сборщики логов и системы доставки не будут рассматриваться сознательно (их обсуждали уже много раз).

Есть такая linux утилита, а также по совместительству сетевой протокол под названием syslog. И есть целый набор RFC посвящённый syslog, один из них описывает уровни логирования https://en.wikipedia.org/wiki/Syslog#Severity_level (https://tools.ietf.org/html/rfc5424). Согласно rfc 5424 для syslog определено 8 уровней логирования, для которых также дается краткое описание. Данные уровни логирования были переняты многими популярными логерами для разных языков программирования. Например, http://www.php-fig.org/psr/psr-3/ определяет те же самые 8 уровней логирования, а стандартный Ruby logger использует немного сокращённый набор из 5 уровней. Несмотря на формальное указание в каких случаях должен быть использован тот или иной уровень логов, зачастую используется комбинация вроде debug/info/fatal — первый для логирования во время разработки и тестирования, второй и третий в расчёте на продакшен. Потом в какой то момент на продакшене начинает происходить что то не понятное и вдруг оказывается, что info логов не хватает — бежим включать debug. И если они не сильно нагружают систему, то зачастую так и остаются включенными в продакшен окружении. По факту остаётся два сценария, когда нужно иметь логи:

В языке Go в котором всё упрощено до предела, стандартный логер тоже прилично покромсали и оставили следующие варианты:

Я часто при написании программы с нуля повсеместно использую debug уровень для логирования с расчётом, что на продакшене будет выставлен уровень логирования info и тем самым сократится зашумлённость сообщениями. Но в таком подходе часто возникают ситуация, что логов вдруг становится не хватать. Трудно угадать, какая информация понадобиться, что бы отловить редкий баг. Возможно рационально всегда использовать по умолчанию уровень info, а в обработчиках ошибок уровень error и выше. Но если у вас сотни и больше сообщений лога в секунду, то тогда наверно есть смысл тонкой настройки между info/debug. В таких ситуациях уже имеет смысл использовать специализированные решения что бы не просаживать производительность.

Есть ещё тонкий момент, когда вы пишите что то вроде logger.debug(entity.values) — то при выставленном уровне логирования выше debug содержимое entity.values не попадёт в лог, но оно каждый раз будет вычисляться отъедая ресурсы. В Ruby логеру можно передать вместо строки сообщения блок кода: Logger.debug < entity.values >. В таком случае вычисления будут происходить только при выставленном соответствующем уровне лога. В языке Go для реализации ленивого вычисления в логер можно передать объект поддерживающий интерфейс Stringer.

После того, как разобрались с использованием уровней логов, нужно ещё уметь связывать разрозненные сообщения, особенно это актуально для многопоточных приложений или связанных между собой отдельных сервисов, когда в логах все сообщения оказываются вперемешку.

Типичный формат строки сообщения в логе можно условно разделить на следующие составные части:

Но с единым контекстом в рамках запроса возникает проблема с различными ORM, http клиентами или другими сервисами\библиотеками, которые живут своей жизнью. И ещё хорошо, если они предоставляют возможность переопределить свой стандартный логер хотя бы глобально, а вот выставить контекст для логера в рамках запроса зачастую не реально. Данная проблема в основном актуальна для многопоточной обработки, когда один процесс обслуживает множество запросов. Но например в фрэймворке Rails имеется очень тесная интеграция между всеми компонентами и запросы ActiveRecord могут писаться в лог вместе с глобальным контекстом для текущего сетевого запроса. А в языке Go некоторые библиотеки логирования позволяют динамически создавать новый объект логера с нужным контекстом, выглядит это примерно так:

После этого такой экземпляр логера можно передать как зависимость в другие объекты. Но отсутствие стандартизированного интерфейса логирования (например как psr-3 в php) провоцирует создателей библиотек хардкодить малосовместимые реализации логеров. Поэтому если вы пишите свою библиотеку на Go и в ней есть компонент логирования, не забудьте предусмотреть интерфейс для замены логера на пользовательский.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *