SlideShare a Scribd company logo
1 of 25
Привет, коллеги
Готовы к восприятию?
Тема презентации:
Логгирование, как панацея при DEBUG-е
Оглавление :
1. Зачем нужно логгирование?
2. Существующие решения для логгирвания : (NSLog,
CocoaLumberjack, XCGLogger, NSLogger, XLFacility)
3. DeepStorm : Киллер-фичи и концепты
4. DeepStorm : Способы и нюансы использования
Зачем нужно логгирование?
Логгирование - полезный и важный инструмент
разработчика ПО. При правильном подходе :
а) Позволяет своевременно диагностировать
логгируемую систему
б) Иметь свежую реалтайм-информацию о том, что
происходит в системе
в) Логгирование незаменимо при отладке
Логгирование желательно внедрять на ранних стадиях
проекта, и оно в дальнейшем способно ускорить
разработку.
В современных системах логгированию часто не
уделяют должной роли, либо реализовывают
неправильно.
Это один из механизмов, которые трудно понять, как
реализовать правильно
Как реализовать логгирование
в проекте правильно?
• Log output не должен быть загрязнен
• Log-ов не должно быть излишне много, лог-файл/лог-лист должен быть читабельным
• Log-и должны иметь удобное и наглядное форматирование, соблюдаемое для всех строчек
(напр. : Err[xx.xx.xxxx] %@)
• Log-и разных типов желательно выделять различными цветами/шрифтами в Output-e
• Особо важные записи тоже следует особым способом помечать
• Log-и следует категорировать и типизировать (напр., один лог лист для событий
авторизации, другой - для сетевого взаимодействия)
• Log-и следует различать по степени важности : LogLevel mechanism
• Хорошая система логгирования должна иметь механизмы для : а) Фильтрации б) Поиска в)
Репортинга ( иметь возможности различными способами получить логи из действующего
приложения )
Существующие решения для
логгирвания
NSLog
Предусмотренный Apple стандартный инструмент для
Логгирования
Преимущества :
- Прост в использовании
- Для совсем маленьких проектов достаточен и минималистичен
Недостатки :
- Автоматически на RELEASE не undef-ится
- Довольно скоро в аутпут улетает столько событий, что становится нечитабелен
- Имеет низкую производительность (как утверждает в своей презентации создатель
CocoaLumberjack, каждый раз при новой записи - реконнектится к ASL Daemon-у)
- Не имеет никаких дополнительных возможностей, кроме логгирования
- Не имеет возможности категоризации и logLevel-а
- Логи никак не получить, кроме консоли XCode
CocoaLumberjack
Распространенный фреймворк для логгирования by
Robbie Hanson
Преимущества :
- Легко присоединяется с помощью Pod/Carthage, FreeBSD-лицензия
- Обладает x6 лучшей производительностью, чем NSLog. Реализует собственное взаимодействие с ASL-сервером (однако
нам на дебаге нужна производительность?)
- Позволяет выбирать Output (в файл/на удаленный сервер), и синхронизировать систему по таймеру
- Позволяет гибко назначать форматтеры
- Поддерживает цветной OutPut в XCode-консоли (требуется плагин Xcode Colors)
- Имеет удобные макросы для разных LogLevel-ов
Недостатки :
- Нету отправки логов по Email-у
- Нету возможности разбиения логов на типы (что, на мой взгляд - серьезный недостаток)
- Не умеет заворачивать из-коробки логи в JSON/XML структуры
- Не умеет потоков стримить логи в другие Output-ы (удаленный терминал / подъем веб-сервера с логами)
- Интерфейс недостаточно нативен, требует времени на изучение возможностей
XCGLogger
Простое и удобное решение для логгирования
Преимущества :
- Легко присоединяется с помощью Pod/Carthage или Submodule-м
- Прост в использовании и нативен, удобно конфигурируется форматирование вывода
- Имеет в наличии logLevel-ы
- Позволяет выводить как в обычный output, так и в файл
- Позволяет с помощью XcodeColors организовывать цветный вывод логов в Xcode
Недостатки :
- Написан для swift-а, под Obj-c могут быть различные трудности
- Не имеет возможности отправки логов в другие источники (на e-mail, удаленная БД или стримить)
- Нету возможности разбиения логов на типы
- Не умеет заворачивать из-коробки логи в JSON/XML структуры
- Малое количество функциональности
NSLogger
Мощная кроссплатформенная система логгирования, с
собственный Desktop Viewer-ом
Преимущества :
- Легко присоединяется с помощью Pod/Carthage
- Система имеет собственный DesktopViewer (десктоп-программка, в которую стремятся логи. В ней их можно фильтровать/сортировать и
передавать картинки) (это одно дает этой системе большой жирный плюс)
- Удаленно стримит логи, который подхватывает Desktop-клиент
- Высокая производительность
- Делает простой replace NSLog-вызовов
Недостатки :
- Трудно настраивается. По Stackoverflow видно, что много пользователей не сразу смогли его подключить без проблем
- Имеет много методов для логгирования в открытом интерфейсе, но трудных для разбора. Интерфейс низкоуровневый функциональный
(система уже довольно старая)
- Настроек форматирования я не обнаружил в Wiki
- Кроме того, что стримить логи моментально - ничего не умеет (в файл умеет разве что)
- Нету возможности разбиения логов на типы
- Не умеет заворачивать из-коробки логи в JSON/XML структуры
XLFacility
Необычное решение для логгирование, с большим
количеством Output-ов
Преимущества :
- Система позволяет стримить данные большим количеством способов (файл, Local DB)
- Умеет поднимать Telnet-сервер и Web-сервер (к ним можно коннектится - и получать данные в реалтайм-режиме)
- В наличии разные лог-левелы
- Позволяет удобным образом настраивать форматирование
- Позволяет выводить цветные логи, как в удаленный терминал, так и на поднятом локальном веб-сервере
- Имеет удобный интерфейс и макросы
Недостатки :
- Соединяется только через Cocoapods
- Не идеально отлажен, и работа с терминалом/веб-сервером часто напарывается на разные Exception-ы
- Мягко говоря, не лучшее решение по производительности
- Не позволяет отправлять логи на Email
- Нету возможности разбиения логов на типы
- Не умеет заворачивать из-коробки логи в JSON/XML структуры
DeepStorm : Киллер-фичи и концепты
Типизация логов и использование
специальных объектов DSJournal
В классических системах принято использование специальных объектов Logger-ов (они
нарушают Single Responsibility). Здесь система принципиально разбивается на множество
журналов, а ответственность за отправку в Output-ы ложится на другие объекты.
Можно сказать, что каждый журнал - это всего-лишь хранилище, куда скапливаются
данные.
DSJournal создает и содержит в себе объекты DSJournalRecord (запись в журнале), которая
содержит различные параметры - дату, лог левел, дополнительную информацию, и прочее
В журнал можно добавить запись различным способом, указать максимальное количество
хранимых записей, получить текущее количество, и прочее
Примеров использования журналов можно придумать множество : например, класс
работающий с сетевым взаимодействием может иметь собственный журнал, или
различные объекты-сервисы логгировать свою деятельность отдельно. Или набор
журналов для логгирования конкретных действий на разных экранах.
DSBaseLoggedService - объект со
встроенным журналом
В системе порой нужны объекты-сервисы, выполняющие различный спектр
связанных задач. Такие объекты могут пригодиться для сервисного слоя.
Например, объект работающий со счетами пользователя, или объект,
работающий с шаблонами/предпочтениями пользователя, или с юзер-
токенов
Имеется набор специальных макросов для логгирования в теле сервиса
(self подхватывается автоматически). (DSSVC_LOG(…) и прочие)
У сервиса есть специальные свойства workingMode / fixateEmergencyError: .
В репортах эти свойства указываются. Например, можно трекнуть, что в
сервисе произошла ошибка - и оно определенным образом будет видно в
репорте. С помощью этого, в репортах потом можно быстро отслеживать,
какой из сервисов вышел из строя. (Подобие Assert-ов, только без краша)
DSServiceManager - еще одна
реализация сервис-локатора
Идея была вынесена, когда я еще не был особо знаком с идеей инъекции
зависимостей, но вовсю имел желание централизовать какие-либо действия.
Суть в том, что DSBaseLoggedService адаптированы под этот сервис-
менеджер. У него есть методы, с помощью которого можно опрашивать все
сервисы системы, и собирать «репортаж».
Кроме прочего, с помощью сервис-локатора можно устанавливать сервис
по ключу, и получать сервис по ключу, в обход sharedXXX методов. В
общем, это переходная стадия к инъекции зависимостей. Создание объекта,
у которого другие объекты-клиенты могут запросить любой сервис.
Кроме всего, предоставляет удобные методы для энумерации сервисов, и
централизованные места для создания/конфигурирования
Reporter-ы и Streamer-ы
Главная киллер-фича этой системы логгирования - большой
набор объектов репортеров и стримеров.
Собственно, задача Reporter-ов - создавать репорты, которые
используются 1 раз, и передаются куда-либо
Задачи Streamer-ов - стримить в реальном времени логи в любой
возможный Output.
Благодаря простым интерфейсам - можно создать кастомные
Reporter/Streamer-ы почти на все случаи жизни.
К сожалению, Streamer-ы существуют пока только в рамках
проработанной концепции.
Многоуровневость системы
За счет разбиения системы на простейшие объекты -
удается достичь большой гибкости. Те же самые объекты
DSJournal можно расширять каким-угодно образом,
объектам DSJournalRecord задавать новые свойства,
создавать кастомные репортеры/стримеры.
Имеется специальный объект DSLogger, который
является фасадом системы, и представляет простой
интерфейс для использования системы.
Те, кому мало и этого - для них существует набор
удобных и нативных макросов
DeepStorm : Способы и нюансы
использования
Занесение записей в журнал с помощью макросов :
static NSString *firstJournal = @"firstJrn";
static NSString *secondJournal = @"secondJrn";
DSJRN_LOG(firstJournal, @"Make new day!!!");
DSJRN_LOG(secondJournal, @"Incredible Allien %@", @"HI");
DSJRN_WARNING_LOG(firstJournal, @"Warning! Hungry rabbit attacks");
DSJRN_EXT_LOG(secondJournal, @{@"key" : @"value"}, @"record text»);
Создание репортера, отправляющего логи на Email
DSEmailReporter *emailReporter = [DSEmailReporter new];
[emailReporter addDestinationEmail:@"hikto583004@list.ru"];
[emailReporter setReportingCompletion:^(BOOL isSuccessSending,
NSError *sendingError){
NSLog(@«Email with Report was sent");
}];
Отправка репорта
DSREPORT_FULL(emailReporter);
DeepStorm on GitHub :
https://github.com/huktoDev/DeepStorm
Cocoa pods :
pod 'DeepStorm'

More Related Content

What's hot

C++ STL & Qt. Занятие 06.
C++ STL & Qt. Занятие 06.C++ STL & Qt. Занятие 06.
C++ STL & Qt. Занятие 06.Igor Shkulipa
 
C++ STL & Qt. Занятие 04.
C++ STL & Qt. Занятие 04.C++ STL & Qt. Занятие 04.
C++ STL & Qt. Занятие 04.Igor Shkulipa
 
C++ STL & Qt. Занятие 01.
C++ STL & Qt. Занятие 01.C++ STL & Qt. Занятие 01.
C++ STL & Qt. Занятие 01.Igor Shkulipa
 
C++ STL & Qt. Занятие 02.
C++ STL & Qt. Занятие 02.C++ STL & Qt. Занятие 02.
C++ STL & Qt. Занятие 02.Igor Shkulipa
 
Курс Java-2016. Занятие 02. Пакеты, сборка проекта с Maven
Курс Java-2016. Занятие 02. Пакеты, сборка проекта с MavenКурс Java-2016. Занятие 02. Пакеты, сборка проекта с Maven
Курс Java-2016. Занятие 02. Пакеты, сборка проекта с Maven7bits
 
Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?Vasil Remeniuk
 
объектно ориентированная платформа для построения
объектно ориентированная платформа для построенияобъектно ориентированная платформа для построения
объектно ориентированная платформа для построенияGennady Zavyalov
 
Система обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на GroovyСистема обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на GroovyRegn
 
#noBackend, или Как выжить в эпоху толстеющих клиентов
#noBackend, или Как выжить в эпоху толстеющих клиентов#noBackend, или Как выжить в эпоху толстеющих клиентов
#noBackend, или Как выжить в эпоху толстеющих клиентовNikolay Samokhvalov
 
Database First! О распространённых ошибках использования РСУБД
Database First! О распространённых ошибках использования РСУБДDatabase First! О распространённых ошибках использования РСУБД
Database First! О распространённых ошибках использования РСУБДNikolay Samokhvalov
 
Скриптовой язык Groovy и его применение в рамках разработки ПО
Скриптовой язык Groovy и его применение в рамках разработки ПОСкриптовой язык Groovy и его применение в рамках разработки ПО
Скриптовой язык Groovy и его применение в рамках разработки ПОFedor Malyshkin
 
#RuPostges в Yandex, эпизод 3. Что же нового в PostgreSQL 9.6
#RuPostges в Yandex, эпизод 3. Что же нового в PostgreSQL 9.6#RuPostges в Yandex, эпизод 3. Что же нового в PostgreSQL 9.6
#RuPostges в Yandex, эпизод 3. Что же нового в PostgreSQL 9.6Nikolay Samokhvalov
 
Git и GitHub для создания учебного контента
Git и GitHub для создания учебного контентаGit и GitHub для создания учебного контента
Git и GitHub для создания учебного контентаПупена Александр
 
Java худеет. Спроси меня как. Уменьшение размера дистрибутива Java приложения...
Java худеет. Спроси меня как. Уменьшение размера дистрибутива Java приложения...Java худеет. Спроси меня как. Уменьшение размера дистрибутива Java приложения...
Java худеет. Спроси меня как. Уменьшение размера дистрибутива Java приложения...Nikita Lipsky
 
Testing with Selenium
Testing with SeleniumTesting with Selenium
Testing with SeleniumOSLL
 
Клиентская Java вне браузера. Делаем нативные клиенты на Java
Клиентская Java вне браузера. Делаем нативные клиенты на JavaКлиентская Java вне браузера. Делаем нативные клиенты на Java
Клиентская Java вне браузера. Делаем нативные клиенты на JavaNikita Lipsky
 
Dependency injection
Dependency injectionDependency injection
Dependency injectionGetDev.NET
 

What's hot (20)

Step 1
Step 1Step 1
Step 1
 
C++ STL & Qt. Занятие 06.
C++ STL & Qt. Занятие 06.C++ STL & Qt. Занятие 06.
C++ STL & Qt. Занятие 06.
 
C++ STL & Qt. Занятие 04.
C++ STL & Qt. Занятие 04.C++ STL & Qt. Занятие 04.
C++ STL & Qt. Занятие 04.
 
C++ STL & Qt. Занятие 01.
C++ STL & Qt. Занятие 01.C++ STL & Qt. Занятие 01.
C++ STL & Qt. Занятие 01.
 
C++ STL & Qt. Занятие 02.
C++ STL & Qt. Занятие 02.C++ STL & Qt. Занятие 02.
C++ STL & Qt. Занятие 02.
 
Курс Java-2016. Занятие 02. Пакеты, сборка проекта с Maven
Курс Java-2016. Занятие 02. Пакеты, сборка проекта с MavenКурс Java-2016. Занятие 02. Пакеты, сборка проекта с Maven
Курс Java-2016. Занятие 02. Пакеты, сборка проекта с Maven
 
Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?
 
объектно ориентированная платформа для построения
объектно ориентированная платформа для построенияобъектно ориентированная платформа для построения
объектно ориентированная платформа для построения
 
Система обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на GroovyСистема обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на Groovy
 
#noBackend, или Как выжить в эпоху толстеющих клиентов
#noBackend, или Как выжить в эпоху толстеющих клиентов#noBackend, или Как выжить в эпоху толстеющих клиентов
#noBackend, или Как выжить в эпоху толстеющих клиентов
 
Database First! О распространённых ошибках использования РСУБД
Database First! О распространённых ошибках использования РСУБДDatabase First! О распространённых ошибках использования РСУБД
Database First! О распространённых ошибках использования РСУБД
 
Скриптовой язык Groovy и его применение в рамках разработки ПО
Скриптовой язык Groovy и его применение в рамках разработки ПОСкриптовой язык Groovy и его применение в рамках разработки ПО
Скриптовой язык Groovy и его применение в рамках разработки ПО
 
Java 9 - Back to the Future
Java 9 - Back to the FutureJava 9 - Back to the Future
Java 9 - Back to the Future
 
#RuPostges в Yandex, эпизод 3. Что же нового в PostgreSQL 9.6
#RuPostges в Yandex, эпизод 3. Что же нового в PostgreSQL 9.6#RuPostges в Yandex, эпизод 3. Что же нового в PostgreSQL 9.6
#RuPostges в Yandex, эпизод 3. Что же нового в PostgreSQL 9.6
 
Сервлеты
СервлетыСервлеты
Сервлеты
 
Git и GitHub для создания учебного контента
Git и GitHub для создания учебного контентаGit и GitHub для создания учебного контента
Git и GitHub для создания учебного контента
 
Java худеет. Спроси меня как. Уменьшение размера дистрибутива Java приложения...
Java худеет. Спроси меня как. Уменьшение размера дистрибутива Java приложения...Java худеет. Спроси меня как. Уменьшение размера дистрибутива Java приложения...
Java худеет. Спроси меня как. Уменьшение размера дистрибутива Java приложения...
 
Testing with Selenium
Testing with SeleniumTesting with Selenium
Testing with Selenium
 
Клиентская Java вне браузера. Делаем нативные клиенты на Java
Клиентская Java вне браузера. Делаем нативные клиенты на JavaКлиентская Java вне браузера. Делаем нативные клиенты на Java
Клиентская Java вне браузера. Делаем нативные клиенты на Java
 
Dependency injection
Dependency injectionDependency injection
Dependency injection
 

Similar to Deep storm presentation

PostgreSQL. Стильно. Модно. Молодёжно
PostgreSQL. Стильно. Модно. МолодёжноPostgreSQL. Стильно. Модно. Молодёжно
PostgreSQL. Стильно. Модно. МолодёжноVladislav Bezverhiy
 
Построение систем автоматического протоколирования Си/Си++ кода
Построение систем автоматического протоколирования Си/Си++ кодаПостроение систем автоматического протоколирования Си/Си++ кода
Построение систем автоматического протоколирования Си/Си++ кодаTatyanazaxarova
 
разработка бизнес приложений (9)
разработка бизнес приложений (9)разработка бизнес приложений (9)
разработка бизнес приложений (9)Alexander Gornik
 
разработка бизнес приложений (7)
разработка бизнес приложений (7)разработка бизнес приложений (7)
разработка бизнес приложений (7)Alexander Gornik
 
игровая логика, проблемы и решения
игровая логика, проблемы и решенияигровая логика, проблемы и решения
игровая логика, проблемы и решенияВладимир Кожаев
 
Расширяемая платформа для создания и управления автоматизированными тестами н...
Расширяемая платформа для создания и управления автоматизированными тестами н...Расширяемая платформа для создания и управления автоматизированными тестами н...
Расширяемая платформа для создания и управления автоматизированными тестами н...jazzteam
 
Проверено и работает. Инструменты Oracle для разработки веб приложений
Проверено и работает. Инструменты Oracle для разработки веб приложенийПроверено и работает. Инструменты Oracle для разработки веб приложений
Проверено и работает. Инструменты Oracle для разработки веб приложенийMedia Gorod
 
Создаем Drupal дистрибутив: от идеи до сопровождения
Создаем Drupal дистрибутив: от идеи до сопровожденияСоздаем Drupal дистрибутив: от идеи до сопровождения
Создаем Drupal дистрибутив: от идеи до сопровожденияOvadiah Myrgorod
 
Быстрое масштабирование систем
Быстрое масштабирование системБыстрое масштабирование систем
Быстрое масштабирование системMedia Gorod
 
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 1...
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 1...PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 1...
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 1...pgdayrussia
 
Viacheslav Eremin about DOT NET (rus lang)
Viacheslav Eremin about DOT NET (rus lang)Viacheslav Eremin about DOT NET (rus lang)
Viacheslav Eremin about DOT NET (rus lang)Viacheslav Eremin
 
Карта граблей на поле сбора и доставки логов. Lazada-way / Юрий Бушмелев (Laz...
Карта граблей на поле сбора и доставки логов. Lazada-way / Юрий Бушмелев (Laz...Карта граблей на поле сбора и доставки логов. Lazada-way / Юрий Бушмелев (Laz...
Карта граблей на поле сбора и доставки логов. Lazada-way / Юрий Бушмелев (Laz...Ontico
 
Карта граблей на поле сбора и доставки логов. Lazada-way.
Карта граблей на поле сбора и доставки логов. Lazada-way.Карта граблей на поле сбора и доставки логов. Lazada-way.
Карта граблей на поле сбора и доставки логов. Lazada-way.Yury Bushmelev
 
Как сделать логирование приятным в быстро развивающемся проекте - Иван Савин,...
Как сделать логирование приятным в быстро развивающемся проекте - Иван Савин,...Как сделать логирование приятным в быстро развивающемся проекте - Иван Савин,...
Как сделать логирование приятным в быстро развивающемся проекте - Иван Савин,...it-people
 
Lektsia 5
Lektsia 5Lektsia 5
Lektsia 5bomfan
 

Similar to Deep storm presentation (20)

Sivko
SivkoSivko
Sivko
 
PostgreSQL. Стильно. Модно. Молодёжно
PostgreSQL. Стильно. Модно. МолодёжноPostgreSQL. Стильно. Модно. Молодёжно
PostgreSQL. Стильно. Модно. Молодёжно
 
Построение систем автоматического протоколирования Си/Си++ кода
Построение систем автоматического протоколирования Си/Си++ кодаПостроение систем автоматического протоколирования Си/Си++ кода
Построение систем автоматического протоколирования Си/Си++ кода
 
разработка бизнес приложений (9)
разработка бизнес приложений (9)разработка бизнес приложений (9)
разработка бизнес приложений (9)
 
Архитектура ROS
Архитектура ROSАрхитектура ROS
Архитектура ROS
 
разработка бизнес приложений (7)
разработка бизнес приложений (7)разработка бизнес приложений (7)
разработка бизнес приложений (7)
 
игровая логика, проблемы и решения
игровая логика, проблемы и решенияигровая логика, проблемы и решения
игровая логика, проблемы и решения
 
Genome
GenomeGenome
Genome
 
Расширяемая платформа для создания и управления автоматизированными тестами н...
Расширяемая платформа для создания и управления автоматизированными тестами н...Расширяемая платформа для создания и управления автоматизированными тестами н...
Расширяемая платформа для создания и управления автоматизированными тестами н...
 
Проверено и работает. Инструменты Oracle для разработки веб приложений
Проверено и работает. Инструменты Oracle для разработки веб приложенийПроверено и работает. Инструменты Oracle для разработки веб приложений
Проверено и работает. Инструменты Oracle для разработки веб приложений
 
Создаем Drupal дистрибутив: от идеи до сопровождения
Создаем Drupal дистрибутив: от идеи до сопровожденияСоздаем Drupal дистрибутив: от идеи до сопровождения
Создаем Drupal дистрибутив: от идеи до сопровождения
 
Node.js (RichClient)
 Node.js (RichClient) Node.js (RichClient)
Node.js (RichClient)
 
Быстрое масштабирование систем
Быстрое масштабирование системБыстрое масштабирование систем
Быстрое масштабирование систем
 
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 1...
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 1...PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 1...
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 1...
 
Viacheslav Eremin about DOT NET (rus lang)
Viacheslav Eremin about DOT NET (rus lang)Viacheslav Eremin about DOT NET (rus lang)
Viacheslav Eremin about DOT NET (rus lang)
 
Invisible
InvisibleInvisible
Invisible
 
Карта граблей на поле сбора и доставки логов. Lazada-way / Юрий Бушмелев (Laz...
Карта граблей на поле сбора и доставки логов. Lazada-way / Юрий Бушмелев (Laz...Карта граблей на поле сбора и доставки логов. Lazada-way / Юрий Бушмелев (Laz...
Карта граблей на поле сбора и доставки логов. Lazada-way / Юрий Бушмелев (Laz...
 
Карта граблей на поле сбора и доставки логов. Lazada-way.
Карта граблей на поле сбора и доставки логов. Lazada-way.Карта граблей на поле сбора и доставки логов. Lazada-way.
Карта граблей на поле сбора и доставки логов. Lazada-way.
 
Как сделать логирование приятным в быстро развивающемся проекте - Иван Савин,...
Как сделать логирование приятным в быстро развивающемся проекте - Иван Савин,...Как сделать логирование приятным в быстро развивающемся проекте - Иван Савин,...
Как сделать логирование приятным в быстро развивающемся проекте - Иван Савин,...
 
Lektsia 5
Lektsia 5Lektsia 5
Lektsia 5
 

Deep storm presentation

  • 3. Оглавление : 1. Зачем нужно логгирование? 2. Существующие решения для логгирвания : (NSLog, CocoaLumberjack, XCGLogger, NSLogger, XLFacility) 3. DeepStorm : Киллер-фичи и концепты 4. DeepStorm : Способы и нюансы использования
  • 5. Логгирование - полезный и важный инструмент разработчика ПО. При правильном подходе : а) Позволяет своевременно диагностировать логгируемую систему б) Иметь свежую реалтайм-информацию о том, что происходит в системе в) Логгирование незаменимо при отладке
  • 6. Логгирование желательно внедрять на ранних стадиях проекта, и оно в дальнейшем способно ускорить разработку. В современных системах логгированию часто не уделяют должной роли, либо реализовывают неправильно. Это один из механизмов, которые трудно понять, как реализовать правильно
  • 7. Как реализовать логгирование в проекте правильно? • Log output не должен быть загрязнен • Log-ов не должно быть излишне много, лог-файл/лог-лист должен быть читабельным • Log-и должны иметь удобное и наглядное форматирование, соблюдаемое для всех строчек (напр. : Err[xx.xx.xxxx] %@) • Log-и разных типов желательно выделять различными цветами/шрифтами в Output-e • Особо важные записи тоже следует особым способом помечать • Log-и следует категорировать и типизировать (напр., один лог лист для событий авторизации, другой - для сетевого взаимодействия) • Log-и следует различать по степени важности : LogLevel mechanism • Хорошая система логгирования должна иметь механизмы для : а) Фильтрации б) Поиска в) Репортинга ( иметь возможности различными способами получить логи из действующего приложения )
  • 9. NSLog Предусмотренный Apple стандартный инструмент для Логгирования Преимущества : - Прост в использовании - Для совсем маленьких проектов достаточен и минималистичен Недостатки : - Автоматически на RELEASE не undef-ится - Довольно скоро в аутпут улетает столько событий, что становится нечитабелен - Имеет низкую производительность (как утверждает в своей презентации создатель CocoaLumberjack, каждый раз при новой записи - реконнектится к ASL Daemon-у) - Не имеет никаких дополнительных возможностей, кроме логгирования - Не имеет возможности категоризации и logLevel-а - Логи никак не получить, кроме консоли XCode
  • 10. CocoaLumberjack Распространенный фреймворк для логгирования by Robbie Hanson Преимущества : - Легко присоединяется с помощью Pod/Carthage, FreeBSD-лицензия - Обладает x6 лучшей производительностью, чем NSLog. Реализует собственное взаимодействие с ASL-сервером (однако нам на дебаге нужна производительность?) - Позволяет выбирать Output (в файл/на удаленный сервер), и синхронизировать систему по таймеру - Позволяет гибко назначать форматтеры - Поддерживает цветной OutPut в XCode-консоли (требуется плагин Xcode Colors) - Имеет удобные макросы для разных LogLevel-ов Недостатки : - Нету отправки логов по Email-у - Нету возможности разбиения логов на типы (что, на мой взгляд - серьезный недостаток) - Не умеет заворачивать из-коробки логи в JSON/XML структуры - Не умеет потоков стримить логи в другие Output-ы (удаленный терминал / подъем веб-сервера с логами) - Интерфейс недостаточно нативен, требует времени на изучение возможностей
  • 11. XCGLogger Простое и удобное решение для логгирования Преимущества : - Легко присоединяется с помощью Pod/Carthage или Submodule-м - Прост в использовании и нативен, удобно конфигурируется форматирование вывода - Имеет в наличии logLevel-ы - Позволяет выводить как в обычный output, так и в файл - Позволяет с помощью XcodeColors организовывать цветный вывод логов в Xcode Недостатки : - Написан для swift-а, под Obj-c могут быть различные трудности - Не имеет возможности отправки логов в другие источники (на e-mail, удаленная БД или стримить) - Нету возможности разбиения логов на типы - Не умеет заворачивать из-коробки логи в JSON/XML структуры - Малое количество функциональности
  • 12. NSLogger Мощная кроссплатформенная система логгирования, с собственный Desktop Viewer-ом Преимущества : - Легко присоединяется с помощью Pod/Carthage - Система имеет собственный DesktopViewer (десктоп-программка, в которую стремятся логи. В ней их можно фильтровать/сортировать и передавать картинки) (это одно дает этой системе большой жирный плюс) - Удаленно стримит логи, который подхватывает Desktop-клиент - Высокая производительность - Делает простой replace NSLog-вызовов Недостатки : - Трудно настраивается. По Stackoverflow видно, что много пользователей не сразу смогли его подключить без проблем - Имеет много методов для логгирования в открытом интерфейсе, но трудных для разбора. Интерфейс низкоуровневый функциональный (система уже довольно старая) - Настроек форматирования я не обнаружил в Wiki - Кроме того, что стримить логи моментально - ничего не умеет (в файл умеет разве что) - Нету возможности разбиения логов на типы - Не умеет заворачивать из-коробки логи в JSON/XML структуры
  • 13. XLFacility Необычное решение для логгирование, с большим количеством Output-ов Преимущества : - Система позволяет стримить данные большим количеством способов (файл, Local DB) - Умеет поднимать Telnet-сервер и Web-сервер (к ним можно коннектится - и получать данные в реалтайм-режиме) - В наличии разные лог-левелы - Позволяет удобным образом настраивать форматирование - Позволяет выводить цветные логи, как в удаленный терминал, так и на поднятом локальном веб-сервере - Имеет удобный интерфейс и макросы Недостатки : - Соединяется только через Cocoapods - Не идеально отлажен, и работа с терминалом/веб-сервером часто напарывается на разные Exception-ы - Мягко говоря, не лучшее решение по производительности - Не позволяет отправлять логи на Email - Нету возможности разбиения логов на типы - Не умеет заворачивать из-коробки логи в JSON/XML структуры
  • 14. DeepStorm : Киллер-фичи и концепты
  • 15.
  • 16. Типизация логов и использование специальных объектов DSJournal В классических системах принято использование специальных объектов Logger-ов (они нарушают Single Responsibility). Здесь система принципиально разбивается на множество журналов, а ответственность за отправку в Output-ы ложится на другие объекты. Можно сказать, что каждый журнал - это всего-лишь хранилище, куда скапливаются данные. DSJournal создает и содержит в себе объекты DSJournalRecord (запись в журнале), которая содержит различные параметры - дату, лог левел, дополнительную информацию, и прочее В журнал можно добавить запись различным способом, указать максимальное количество хранимых записей, получить текущее количество, и прочее Примеров использования журналов можно придумать множество : например, класс работающий с сетевым взаимодействием может иметь собственный журнал, или различные объекты-сервисы логгировать свою деятельность отдельно. Или набор журналов для логгирования конкретных действий на разных экранах.
  • 17. DSBaseLoggedService - объект со встроенным журналом В системе порой нужны объекты-сервисы, выполняющие различный спектр связанных задач. Такие объекты могут пригодиться для сервисного слоя. Например, объект работающий со счетами пользователя, или объект, работающий с шаблонами/предпочтениями пользователя, или с юзер- токенов Имеется набор специальных макросов для логгирования в теле сервиса (self подхватывается автоматически). (DSSVC_LOG(…) и прочие) У сервиса есть специальные свойства workingMode / fixateEmergencyError: . В репортах эти свойства указываются. Например, можно трекнуть, что в сервисе произошла ошибка - и оно определенным образом будет видно в репорте. С помощью этого, в репортах потом можно быстро отслеживать, какой из сервисов вышел из строя. (Подобие Assert-ов, только без краша)
  • 18. DSServiceManager - еще одна реализация сервис-локатора Идея была вынесена, когда я еще не был особо знаком с идеей инъекции зависимостей, но вовсю имел желание централизовать какие-либо действия. Суть в том, что DSBaseLoggedService адаптированы под этот сервис- менеджер. У него есть методы, с помощью которого можно опрашивать все сервисы системы, и собирать «репортаж». Кроме прочего, с помощью сервис-локатора можно устанавливать сервис по ключу, и получать сервис по ключу, в обход sharedXXX методов. В общем, это переходная стадия к инъекции зависимостей. Создание объекта, у которого другие объекты-клиенты могут запросить любой сервис. Кроме всего, предоставляет удобные методы для энумерации сервисов, и централизованные места для создания/конфигурирования
  • 19. Reporter-ы и Streamer-ы Главная киллер-фича этой системы логгирования - большой набор объектов репортеров и стримеров. Собственно, задача Reporter-ов - создавать репорты, которые используются 1 раз, и передаются куда-либо Задачи Streamer-ов - стримить в реальном времени логи в любой возможный Output. Благодаря простым интерфейсам - можно создать кастомные Reporter/Streamer-ы почти на все случаи жизни. К сожалению, Streamer-ы существуют пока только в рамках проработанной концепции.
  • 20.
  • 21.
  • 22. Многоуровневость системы За счет разбиения системы на простейшие объекты - удается достичь большой гибкости. Те же самые объекты DSJournal можно расширять каким-угодно образом, объектам DSJournalRecord задавать новые свойства, создавать кастомные репортеры/стримеры. Имеется специальный объект DSLogger, который является фасадом системы, и представляет простой интерфейс для использования системы. Те, кому мало и этого - для них существует набор удобных и нативных макросов
  • 23. DeepStorm : Способы и нюансы использования
  • 24. Занесение записей в журнал с помощью макросов : static NSString *firstJournal = @"firstJrn"; static NSString *secondJournal = @"secondJrn"; DSJRN_LOG(firstJournal, @"Make new day!!!"); DSJRN_LOG(secondJournal, @"Incredible Allien %@", @"HI"); DSJRN_WARNING_LOG(firstJournal, @"Warning! Hungry rabbit attacks"); DSJRN_EXT_LOG(secondJournal, @{@"key" : @"value"}, @"record text»); Создание репортера, отправляющего логи на Email DSEmailReporter *emailReporter = [DSEmailReporter new]; [emailReporter addDestinationEmail:@"hikto583004@list.ru"]; [emailReporter setReportingCompletion:^(BOOL isSuccessSending, NSError *sendingError){ NSLog(@«Email with Report was sent"); }]; Отправка репорта DSREPORT_FULL(emailReporter);
  • 25. DeepStorm on GitHub : https://github.com/huktoDev/DeepStorm Cocoa pods : pod 'DeepStorm'