Приветствую!
Прошлый год выдался крайне продуктивным для нашей некоммерческой организации, и эта статья является лишь началом цикла публикаций, освещающих нашу деятельность. А там есть о чём рассказать, ведь несколько наших продуктов оказались в центре больших банковских проектов — и о да — они не подвели!
Но начнём с чего-то простого и более понятного — и при этом, близкого всем нам без исключения — темы логирования.
Вступление
Год назад мы представили Бобину — революционный 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.