Подтвердить что ты не робот

Разница между slf4j и log4j на основе создания строки

В log4j, если мы пишем

**logger.debug("Processing trade with id: " + id + " symbol: " + symbol);**

он создаст String в пуле строк, но когда мы будем использовать slf4j, мы будем использовать параметр, основанный так:

**logger.debug("Processing trade with id: {} and symbol : {} ", id, symbol);**

В чем разница между этими двумя утверждениями, slf4j будет создавать String во время выполнения или нет?

4b9b3361

Ответ 1

Разница заключается в увеличении производительности, в log4j строка конкатенируется каждый раз, когда строка оценивается, даже если уровень журнала ниже, чем debug, поэтому строка никогда не будет использоваться.

slf4j, строка и параметры передаются в регистратор, который заменяет их только в том случае, если сообщение журнала действительно используется.

Представьте код с операциями отладки каждые несколько строк, когда в процессе производства и отладки отключено, что является огромным количеством манипуляций с строкой, которые никогда не будут использоваться.

Ответ 2

Я бы сказал, чтобы увеличить производительность, уменьшив String concatenations.

Когда вы пишете этот

"Processing trade with id: " + id + " symbol: " + symbol

Вы создаете строку печати вручную.

Когда вы пишете

"Processing trade with id: {} and symbol : {} ", id, symbol
                    -------^id------------^symbol---------

Во втором случае перед печатью внутри slf4j поддерживать и сгенерировать новую строку снова с конкатенацией (не проверить исходный код, может быть StringBuilder).

{}, называемый владельцем места и заменяемый переданными вами аргументами.

Из документов sl4j

Эта форма позволяет избежать избыточной конкатенации строк, когда регистратор отключен для уровня DEBUG. Однако этот вариант берет на себя скрытую (и относительно небольшую) стоимость создания объекта [] перед вызовом метода, даже если этот регистратор отключен для DEBUG. Варианты, принимающие один и два аргумента, существуют исключительно для того, чтобы избежать этой скрытой стоимости.

Прочитайте, как использовать формат: Как использовать java.String.format в Scala?

Ответ 3

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

Ответ 4

С API Log4j2 мы можем иметь logger.info( "String: {} int: {}.", "Hello, World", 10);

Ответ 5

Например, под кодом, который вы можете записать в своих файлах классов приложений:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class HelloWorld
{
    public static void main(String[] args)
    {
        Logger logger = LoggerFactory.getLogger(HelloWorld.class);
        logger.info("Hello World");
    }
}

Теперь вам нужно выбрать, какую структуру ведения журнала необходимо использовать во время выполнения. Для этого вам нужно будет добавить два файла jar:

  • Файл привязки SLF4j
  • Необходимые файлы фреймворка фреймворка

например. для использования log4j в вашем проекте вам нужно будет включить ниже указанные файлы jar:

  • SLF4J-log4j12-1.7.12.jar
  • log4j-1.2.17.jar

Как только вы разместите оба файла jar в вашем пути к классу приложений, SLF4j автоматически обнаружит его и начнет использовать log4j для обработки операторов журнала на основе конфигурации, предоставленной в файле конфигурации log4j.

В будущем, если вы хотите заменить log4j любой другой структурой ведения журнала - все, что вам нужно сделать, это заменить файлы привязки и протоколирования баннеров (вместе с файлом конфигурации). Это просто. Не нужно изменять файлы исходного кода.

Таким образом, SLF4J не заменяет log4j, они работают вместе. Он удаляет зависимость от log4j из вашего приложения и упрощает его замену в будущем с более способной библиотекой.

Ответ 6

В чем разница между этими двумя утверждениями, slf4j будет создать строку во время рома или нет?

Строки будут созданы в любом случае независимо от того, используете ли вы log4j или sl4j. sl4j предлагает удобство владельца места.

Ответ 7

Это о конкатенации строк. Первая строка всегда делает String concat той дорогостоящей операцией, вторая строка не является concat, если уровень журнала не соответствует debug. Я не уверен, что только предполагаю, что совпадение второго уровня логарифма может быть более выгодным из-за внутреннего использования StringBuilder.