суббота, 13 июня 2020 г.

Google выпустил новый фреймворк для логгирования в Java

Перевод статьи "Google Releases New Java Logging Framework" 

Недавно Google объявил о выпуске нового open-source Java-фреймворке логгирования под названием Flogger. Признавая мир логгирования на Java чрезвычайно перенасыщенным, Google все же утверждает, что Flogger предлагает разработчикам много преимуществ по сравнению с уже существующими решениями. Улучшения в Flogger включают в себя снижение падения производительности при отключенном логгировании, улучшение читаемости логов и повышение расширяемости системы логгирования.

Flogger - эффективный симбиоз fluent API и логгирования, утверждает, что одним из его главных преимуществ является то, что отключение логгирования обходится практически бесплатно. В то время как другие фреймворки даже при отключении логгирования как правило вносят в байт-код дополнительные вызовы, Flogger стремится полностью избежать этого.

Если конкретнее, обычно в системах логгирования при вызове методов используется varargs, вместо того, чтобы иметь сотни или даже тысячи разнообразных сигнатур. Использование varargs приводит к дополнительным инструкциям на уровне байт-кода, например для выделения памяти под Object[] для хранения аргументов методов логгирования. И хотя эти дополнительные инструкции не являются типичной проблемой, они становятся особенно важными в приложениях с очень детализированными логами или при логгировании, которое происходит в циклах.

Flogger избегает таких дополнительных затрат благодаря разработке собственного API. Цепочка вызовов методов Flogger всегда начинается с вызова селектора для определенного уровня логгирования, например atInfo(). Этот селектор возвращает реализацию, соответствующую выбранному уровню логгирования, а в случае отключения логов - возвращает ничего не делающий синглтон.

Читаемость является еще одной областью, на которой сосредоточился Flogger. По словам Google, Flogger позволяет использовать "самодокументируемый код журналирования" за счет использования более выразительного API. В качестве примера рассмотрим типичный код логгирования сообщения вместе с возникающим исключением

log.error("The arg, '{}' caused an error", arg, exception)

с помощью Flogger то же самое делается так

logger.atError()
	.withCause(exception)
	.log("The arg, ‘%s’ caused an error", arg);

Дополнительно к этому, Flogger был разработан с расчетом на расширяемость. Можно расширить API Flogger и добавить собственные методы в цепочку вызовов fluent API.

И хотя сейчас документации и конкретных примеров собственных расширений не хватает, в качестве примера Google приводит расширение UserLogger, которое для каждого пользователя пишет отдельный от основного лог.

logger.at(INFO)
    	.forUserId(id)
        .log("Message: %s", param);

Дополнительная информация о проекте Flogger можно найти на Github вместе с руководством для начинающих и документацию с лучшими практиками.