Учитывая, что я застрял с SLF4J и java.util.Logging, что является оптимальным решением?

Ситуация: мы используем SLF4j и Log4j 2 с асинхронными приложениями. Проблема в том, что мы также используем JSF, который использует java.util.Logging, Я вижу все виды отвратительных предупреждений о производительности в отношении использования jul-to-slf4j из-за того, что вы не можете просто бросить java.util.Logging потому что это в JDK и потому что... хорошо, вот что сказано в документации на http://www.slf4j.org/legacy.html:

"... Следовательно, перевод в июль на SLF4J может серьезно увеличить стоимость отключенных операторов ведения журнала (в 60 раз или 6000%) и ощутимо повлиять на производительность включенных операторов ведения журнала (общее увеличение на 20%). Начиная с версии 0.9.25 регистрации, с помощью LevelChangePropagator можно полностью исключить накладные расходы на 60-кратное преобразование для отключенных операторов журнала."

Обратите внимание, что несмотря ни на что, с SLF4J + java.util.Logging вы застряли с 20% -ным ударом по производительности, но вы можете отказаться от 60-кратного увеличения, используя последнюю версию.

20% недопустимо.

Другие идеи приветствуются и поощряются, но я имею в виду решение просто не консолидировать java.util.Logging, Вместо этого используйте отдельный файл конфигурации, который указывает на тот же файл журнала, что и все остальное. Кто-нибудь знает или знает, где я могу найти пример того, как это сделать, если предположить, что это не будет означать конец всего творения?

Если есть лучший способ, я открыт для этого.

1 ответ

Решение

Я думаю, что оптимальным решением является снижение производительности на 20%. Если вы не полностью замените классы JUL, обработчик - это первый раз, когда LogRecord покидает JUL. Вам также нужно написать свою собственную версию LevelChangePropagator, чтобы изменения в уровне журнала (например, реконфигурация) в Log4J2 отражались в регистраторах JUL. (В противном случае 60-кратное попадание приведет к снижению производительности отключенных операторов журнала.)

Вы могли бы заменить классы JUL своими собственными (которые используют SLF4J или Log4J2 напрямую), но поскольку JUL отсутствует в списке пакетов, охватываемых механизмом переопределения стандартов Java Endorsed, вы фактически говорите о запуске на альтернативной JVM или закрытии к этому в сложности обслуживания.

Вы можете свернуть пользовательскую реализацию JSF, возможно, взяв открытую исходную версию и заменив все вызовы JUL вызовами SLF4J. Вы бы избежали падения производительности, и это было бы не так сложно, как замена JUL. Вы по-прежнему будете поддерживать JSF-форк, хотя, если вы ограничите свои изменения, возможно, поддержка Fork не будет слишком плохой. Это также не покрывает любой другой фрагмент кода, который вызывает JUL.

Другие вопросы по тегам