Приветствую!
Прошлый год выдался крайне продуктивным для нашей некоммерческой организации, и эта статья является лишь началом цикла публикаций, освещающих нашу деятельность. А там есть о чём рассказать, ведь несколько наших продуктов оказались в центре больших банковских проектов — и о да — они не подвели!
Но начнём с чего-то простого и более понятного — и при этом, близкого всем нам без исключения — темы логирования.
Вступление
Год назад мы представили Бобину
— революционный SLF4J
логгер. В течении этого времени мы:
- собирали замечания и пожелания (на
Хабре
,sql.ru
и вSlack
каналах) - внедряли и использовали её в своих проектах (СПО и коммерческое\банковское ПО — в фин-тех гиганте Wirecard)
- анализировали опыт работы с ней и вырабатывали план доработок
- рекламировали (на
Linkedin
) - поддерживали пользователей (таких, как
Walt Disney Studios
) - пытались бороться с багами логирования в самом
SLF4J
(безрезультатно)
Сразу скажу, что Хабр
оказался наиболее эффективной площадкой для обсуждения — самые ценные отклики были именно отсюда.
Так каково же наше критическое мнение о собственном проекте в ретроспективе?
Ответ будет следующим: Бобина
v2.0.0 была отлична, практически идеальна. Она на 100% выполнила ожидания на интенсивных проектах, сделав настройку и работу с логами удовольствием вместо пытки.
И самое главное — Бобина
ни разу не подвела, что позволяет мне с ещё большей смелостью и чистой совестью рекомендовать её для повсеместного использования.
Это послужило нам вдохновением приблизить её ещё на один шаг к идеалу.
А возможным это сделали ваши ценнейшие отклики — большое спасибо!
Итак — встречайте — Бобина
3.0.0!
https://github.com/INFINITE-TECHNOLOGY/BOBBIN
https://bintray.com/infinite-technology/io.i-t/bobbin/_latestVersion
dependencies {
compile "org.codehaus.groovy:groovy-all:2.5.4"
compile "io.i-t:bobbin:3.0.0"
}
Улучшения
Какие же основные улучшения вошли в этот релиз?
YAML конфигурация
YAML
конфигурация сменила JSON
.
Изначально Бобина имела конфигурационный файл в формате JSON
.
Однако JSON
имеет ограниченные возможности для блочного форматирования, что приводило к необходимости экранирования скриптовых выражений, например:
"\"./LOGS/PLUGINS/OUTPUT/${className}/${level}/${threadName}_${level}_${date}.log\""
Согласитесь, не очень красиво? На это жаловались и пользователи — и даже предлагали решение — YAML
.
При кажущейся очевидности, довольно долго занял процесс исследования этого решения и поиска возможных альтернатив (например, DSL
конфигурация). Всё же, остановились на YAML
— но только дойдя до "глубин" — изучив Snake YAML
парсер, поняв философию использования, найдя баги и ограничения.
Результат порадовал! YAML поддерживает блочное форматирование и чистый синтаксис, отлично подошедший под конфигурацию Бобины. Только посмотрите на новую YAML
конфигурацию:
destinations:
- name: io.infinite.bobbin.config.ConsoleDestinationConfig
levels: [warn, error, info]
- name: io.infinite.bobbin.config.FileDestinationConfig
packages: [io.infinite]
fileName: ("./LOGS/INFINITE/${className}/${level}/${className}_${level}_${date}.log")
- name: io.infinite.bobbin.config.FileDestinationConfig
fileName: ("./LOGS/PACKAGES/${className}/${level}/${className}_${level}_${date}.log")
format: dateTime + '|' + level + '|' + threadName + '|' + className + '|' + message + '\n'
Это ли не лучшая существующая конфигурация логгера? Сравните с кашей в Logback
, Log4j2
.
JSON
конфигурация больше не поддерживается в 3.0.0. Документация и Wiki также актуализированы.
Прочие улучшения конфигурации
- Отдельное указание пакетов с помощью массива
packages
- Фильтр в виде скриптового выражения
filter
- Улучшенная конфигурация по-умолчанию — теперь для большинства случаев даже не требуется ничего настраивать: ошибки пишутся в файл.
Технические улучшения
- Дальнейшее упрощение кода — теперь
Бобина
умещается всего в 13 классов. - Повышена производительность.
Бобина
и так была очень быстра, быстрее других логгеров — теперь же она вообще напрочь рвёт тот жеlogback
. Ради эксперимента мы включили вSpring Boot
приложении логирование вообще ВСЕХ классов и уровней логирования — сБобиной
не было ощутимой разницы в работе приложения. Сlogback
приложение стартовало около 5 минут в такой конфигурации. - Улучшено качество кода. Убран "странноватый" код, сделана более красиво многопоточная синхронизация.
Заключение
На данный момент, вся наша экосистема переведена на Бобину
3.0.0. Мы с нетерпением ждём и постепенного перехода внеших проектов — этому способствует наша уверенность что Бобина
будет приносить удовольствие пользователям в работе с ней, и особенно — с последним обновлением, ставшим ещё удобнее.
А тем временем, у нас колоссальные планы на 2020 год:
- больше проектов
- больше продуктов
- больше сервисов
HTTP клиент, чат-боты, мета-программирование, транспиляторы, мейнфреймы, крупнейшие финансовые проекты, SECaaS… Скоро на Хабре.
Stay tuned!
rrrad
Не нашел в документации (мб. плохо искал):
Есть ли возможность указать, откуда следует читать конфиг-файл (мы конфиги держим отдельно от веб-приложений, так удобнее ими управлять)?
Есть ли возможность перезагрузки конфигов при необходимости?
Есть ли интерфейс конфигурирования кодом?
(Мысли вслух) Смена формата конфигов вместо расширения поддерживаемых форматов (пусть и с неполной функциональностью) может играть против распространения библиотеки для тех, у кого производительность не упёрлась в логгер (у нас в одном из приложений такое было с log4j, пока не воткнули asyncappender). У меня yml не зашёл, хотя и напоминает своей идеологией питон, всё-таки значащие пробелы в конфигурации (с которой работают не только разработчики) нельзя назвать однозначно хорошим решением. Для себя нашел идеальный вариант формата конфига — hocon, потихоньку перехожу на него с других форматах в своих проектах.
antonpryamostanov Автор
привет! Спасибо за комментарий.
По Вашему указанию, в 3.1.0 добавим возможность указывать путь к конфигу Бобины. Это не сложно и может быть полезно.
Runtime изменение настроек Бобины не поддерживается, требуется перезапуск. Причина — простота и предсказуемость как кода так и эксплуатации. Это сознательное решение.
Интерфейс программной настройки — вот это интереснейший момент! Мы считаем что код логирования НЕ нужно писать вообще! И задачу эту успешно решили: код логирования генерируется и добавляется автоматически на этапе компиляции с помощью аннотации BlackBox (https://github.com/INFINITE-TECHNOLOGY/BLACKBOX). Всё что требуется — задавать что именно логировать с помощью аргумента аннотации (применимой и ко всему классу) — только ошибки методов, вызовы методов (с результатами), каждый statement, каждый expression. Эта аннотация поддерживается только в Groovy компиляторе пока — но раскроем секретные планы — идёт работа над реализацией этого функционала с помощью cglib на Java.
В общем целом — это наш основной постулат — минимизация (в идеале полная автоматизация) инфраструктурного кода. И логирование (как например и авторизация) — это именно такой инфраструктурный код. Если используете Groovy — попробуйте BlackBox. Мы полностью доверили ему весь код логирования. Работает отлично в паре с Бобиной :) (но может и с любыми SLF4J логгерами). Скоро будет отдельный пост по BlackBox.