SLF4J - Краткое руководство
SLF4J означает Sреализовывать Lогорчение Fакадемия для Java. Он обеспечивает простую абстракцию всех фреймворков логирования в Java. Таким образом, он позволяет пользователю работать с любой из платформ ведения журнала, таких как Log4j, Logback иJUL(java.util.logging) с использованием единой зависимости. Вы можете перейти на необходимую платформу ведения журналов во время выполнения / развертывания.
Ceki Gülcü создал SLF4J в качестве альтернативы фреймворку для ведения журнала в Джакарте.
Преимущества SLF4J
Ниже приведены преимущества SLF4J -
Используя платформу SLF4J, вы можете перейти на желаемую платформу ведения журналов во время развертывания.
Slf4J обеспечивает привязку ко всем популярным фреймворкам ведения журнала, таким как log4j, JUL, Simple logging и NOP. Поэтому вы можете переключиться на любую из этих популярных платформ во время развертывания.
SLF4J обеспечивает поддержку параметризованных сообщений журнала независимо от используемой привязки.
Поскольку SLF4J разделяет приложение и структуру ведения журнала, вы можете легко писать приложения независимо от инфраструктуры ведения журнала. Вам не нужно беспокоиться о структуре ведения журнала, используемой для написания приложения.
SLF4J предоставляет простой инструмент Java, известный как migrator. Используя этот инструмент, вы можете перенести существующие проекты, в которых используется фрейм регистрации, например, Jakarta Commons Logging (JCL) или log4j или Java.util.logging (JUL), в SLF4J.
Вход в программирование относится к записи действий / событий. Обычно ведение журнала берут на себя разработчики приложений.
Чтобы упростить ведение журнала, Java предоставляет различные фреймворки - log4J, java.util.logging (JUL), tiny log, logback и т. Д.
Обзор платформы ведения журналов
Структура ведения журнала обычно содержит три элемента:
Регистратор
Захватывает сообщение вместе с метаданными.
Форматировщик
Форматирует сообщения, записанные регистратором.
Обработчик
Обработчик или приложение, наконец, отправляет сообщения либо путем печати на консоли, либо путем сохранения в базе данных, либо путем отправки по электронной почте.
Некоторые фреймворки объединяют элементы регистратора и приложения для ускорения операций.
Объект регистратора
Чтобы зарегистрировать сообщение, приложение отправляет объект регистратора (иногда вместе с исключениями, если таковые имеются) с именем и уровнем безопасности.
Уровень опасности
Регистрируемые сообщения будут различного уровня. В следующей таблице перечислены общие уровни ведения журнала.
Старший Нет | Уровень серьезности и описание |
---|---|
1 | Fatal Серьезная проблема, из-за которой приложение закрывается. |
2 | ERROR Ошибки времени выполнения. |
3 | WARNING В большинстве случаев ошибки связаны с использованием устаревших API. |
4 | INFO События, происходящие во время выполнения. |
5 | DEBUG Информация о потоке в системе. |
6 | TRACE Более подробная информация о протекании системы. |
Что такое log4j?
log4j - надежный, быстрый и гибкий logging framework (APIs) written in Java, который распространяется под лицензией на программное обеспечение Apache.
log4j легко настраивается с помощью внешних файлов конфигурации во время выполнения. Он рассматривает процесс ведения журнала с точки зрения уровней приоритетов и предлагает механизмы для направления информации журнала в самые разные места назначения, такие как база данных, файл, консоль, системный журнал UNIX и т. Д. (Более подробную информацию о log4j см. В нашем Руководстве ).
Сравнение SLF4J и Log4j
В отличие от log4j, SLF4J (Sреализовывать Lогорчение Fакадемия для Java) не является реализацией фреймворка логирования, это abstraction for all those logging frameworks in Java similar to log4J. Следовательно, вы не можете сравнивать оба. Однако всегда сложно выбрать одно из двух.
Если у вас есть выбор, абстракция ведения журнала всегда предпочтительнее, чем структура ведения журнала. Если вы используете абстракцию ведения журнала, в частности SLF4J, вы можете перейти на любую платформу ведения журнала, которая вам понадобится во время развертывания, не выбирая единую зависимость.
Для лучшего понимания обратите внимание на следующую диаграмму.
В этой главе мы объясним, как установить среду SLF4J в Eclipse IDE. Прежде чем продолжить установку, убедитесь, что в вашей системе уже установлен Eclipse. Если нет, загрузите и установите Eclipse.
Для получения дополнительной информации о Eclipse см. Наше руководство по Eclipse.
Шаг 1. Загрузите файл JAR зависимости
Откройте официальную домашнюю страницу сайта SLF4J и перейдите на страницу загрузки.
Теперь загрузите последнюю стабильную версию slf4j-X.X.tar.gzили slf4j-XXzip , в зависимости от вашей операционной системы (если файл .zip Windows или файл tar.gz Linux).
В загруженной папке вы найдете slf4j-api-XXjar . Это необходимый файл Jar.
Шаг 2. Создайте проект и укажите путь сборки.
Откройте eclipse и создайте образец проекта. Щелкните правой кнопкой мыши проект, выберите параметрBuild Path → Configure Build Path… как показано ниже.
в Java Build Path кадр в Libraries вкладку, щелкните Add External JARs…
Выберите slf4j-api.x.x.jar файл загружен и нажмите Apply and Close.
SLF4J Bindings
В добавление к slf4j-api.x.x.jar файл, SLF4Jпредоставляет несколько других файлов Jar, как показано ниже. Они называютсяSLF4J bindings.
Где каждая привязка предназначена для соответствующей структуры ведения журнала.
В следующей таблице перечислены привязки SLF4J и соответствующие им платформы.
Старший Нет | Jar-файл и платформа ведения журнала |
---|---|
1 | slf4j-nop-x.x.jar Нет операции, отбрасывает все журналы. |
2 | slf4j-simple-x.x.jar Простая реализация, в которой печатаются сообщения для информации и выше, а все выходные данные остаются в System.err. |
3 | slf4j-jcl-x.x.jar Фреймворк Jakarta Commons Logging. |
4 | slf4j-jdk14-x.x.jar Фреймворк Java.util.logging (JUL). |
5 | slf4j-log4j12-x.x.jar Log4J фреймворк. Кроме того, вам необходимо иметьlog4j.jar. |
Чтобы SLF4J работал вместе с slf4l-api-xxjar, вам необходимо добавить соответствующий Jar-файл (привязку) желаемой структуры регистратора в путь к классам проекта (установить путь сборки).
Чтобы переключиться с одной платформы на другую, вам необходимо заменить соответствующую привязку. Если границы не обнаружены, по умолчанию используется режим бездействия.
Pom.xml для SLF4J
Если вы создаете проект maven, откройте pom.xml и вставьте в него следующий контент и обновите проект.
<project xmlns = "http://maven.apache.org/POM/4.0.0"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>Sample</groupId>
<artifactId>Sample</artifactId>
<version>0.0.1-SNAPSHOT</version>
<build>
<sourceDirectory>src</sourceDirectory>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
</dependencies>
</project>
В этой главе мы обсудим классы и методы, которые мы будем использовать в последующих главах этого руководства.
Интерфейс регистратора
Интерфейс логгера org.slf4jpackage - это точка входа в API SLF4J. Ниже перечислены важные методы этого интерфейса.
Sr.No. | Методы и описание |
---|---|
1 | void debug(String msg) Этот метод регистрирует сообщение на уровне DEBUG. |
2 | void error(String msg) Этот метод регистрирует сообщение на уровне ОШИБКИ. |
3 | void info(String msg) Этот метод регистрирует сообщение на уровне INFO. |
4 | void trace(String msg) Этот метод регистрирует сообщение на уровне TRACE. |
5 | void warn(String msg) Этот метод регистрирует сообщение на уровне WARN. |
Класс LoggerFactory
Класс LoggerFactory объекта org.slf4j package - служебный класс, который используется для создания логгеров для различных API логов, таких как log4j, JUL, NOP и простой логгер.
Sr.No. | Метод и описание |
---|---|
1 | Logger getLogger(String name) Этот метод принимает строковое значение, представляющее имя, и возвращает Logger объект с указанным именем. |
Класс профилировщика
Этот класс принадлежит пакету org.slf4jон используется для профилирования и известен как профилировщик для бедняков. Используя это, программист может узнать время, затраченное на выполнение длительных задач.
Ниже приведены важные методы этого класса.
Sr.No. | Методы и описание |
---|---|
1 | void start(String name) Этот метод запускает новый дочерний секундомер (названный) и останавливает более ранние дочерние секундомеры (или приборы времени). |
2 | TimeInstrument stop() Этот метод остановит последний дочерний секундомер и глобальный секундомер и вернет текущий инструмент времени. |
3 | void setLogger(Logger logger) Этот метод принимает объект Logger и связывает указанный регистратор с текущим Profiler. |
4 | void log() Регистрирует содержимое прибора текущего времени, связанного с регистратором. |
5 | void print() Печатает содержимое инструмента текущего времени. |
В этой главе мы увидим простую базовую программу-регистратор, использующую SLF4J. Выполните шаги, описанные ниже, чтобы написать простой регистратор.
Шаг 1. Создайте объект интерфейса slf4j.Logger
Поскольку slf4j.Logger это точка входа в SLF4J API, сначала вам нужно получить / создать его объект
В getLogger() метод LoggerFactory класс принимает строковое значение, представляющее имя, и возвращает Logger объект с указанным именем.
Logger logger = LoggerFactory.getLogger("SampleLogger");
Шаг 2 - Зарегистрируйте необходимое сообщение
В info() метод slf4j.Logger интерфейс принимает строковое значение, представляющее необходимое сообщение, и регистрирует его на информационном уровне.
logger.info("Hi This is my first SLF4J program");
пример
Ниже приводится программа, демонстрирующая, как написать образец регистратора на Java с использованием SLF4J.
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class SLF4JExample {
public static void main(String[] args) {
//Creating the Logger object
Logger logger = LoggerFactory.getLogger("SampleLogger");
//Logging the information
logger.info("Hi This is my first SLF4J program");
}
}
Вывод
При первоначальном запуске следующей программы вы получите следующий вывод вместо желаемого сообщения.
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further
details.
Поскольку мы не установили путь к классам для какой-либо привязки, представляющей структуру ведения журнала, как упоминалось ранее в этом руководстве, SLF4J по умолчанию выбрал реализацию без операции. Итак, чтобы увидеть сообщение, вам нужно добавить желаемую привязку в путь к классам проекта. Поскольку мы используем eclipse, установитеbuild path для соответствующего файла JAR или добавьте его зависимость в файл pom.xml.
Например, если нам нужно использовать JUL (фреймворк Java.util.logging), нам нужно указать путь сборки для файла jar slf4j-jdk14-x.x.jar. И если мы хотим использовать фреймворк log4J, нам нужно установить путь сборки или добавить зависимости для файлов jarslf4j-log4j12-x.x.jar и log4j.jar.
После добавления привязки, представляющей любую из платформ ведения журнала, кроме slf4j-nopx.x.jar в проект (путь к классам) вы получите следующий результат.
Dec 06, 2018 5:29:44 PM SLF4JExample main
INFO: Hi Welcome to Tutorialspoint
В этой главе мы обсудим различные сообщения об ошибках или предупреждения, которые мы получаем при работе с SLF4J, а также причины / значения этих сообщений.
Не удалось загрузить класс org.slf4j.impl.StaticLoggerBinder.
Это предупреждение, которое возникает, когда в пути к классам не указаны привязки SLF4J.
Ниже приводится полное предупреждение -
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further
details.
Чтобы решить эту проблему, необходимо добавить любую из привязок платформы ведения журнала. Это объясняется вHello world главу этого учебника.
Note - Это происходит в версиях SLF4J от 1.6.0 до 1.8.0-beta2.
Провайдеры SLF4J не найдены
В slf4j-1.8.0-beta2 приведенное выше предупреждение является более ясным, говоря “No SLF4J providers were found”.
Ниже приводится полное предупреждение -
SLF4J: No SLF4J providers were found.
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#noProviders for further details.
Classpath содержит привязки SLF4J, нацеленные на версии slf4j-api до 1.8
Если вы используете версию SLF4J 1.8 и у вас есть привязки предыдущих версий в пути к классам, но нет привязок 1.8, вы увидите предупреждение, как показано ниже.
SLF4J: No SLF4J providers were found.
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#noProviders for further details.
SLF4J: Class path contains SLF4J bindings targeting slf4j-api versions prior to
1.8.
SLF4J: Ignoring binding found at
[jar:file:/C:/Users/Tutorialspoint/Desktop/Latest%20Tutorials/SLF4J%20Tutorial/
slf4j-1.7.25/slf4j-jdk14-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#ignoredBindings for an explanation.
NoClassDefFoundError: org / apache / commons / logging / LogFactory
Если вы работаете с slf4j-jcl и если у вас есть только slf4j-jcl.jar в вашем пути к классам вы получите исключение, подобное приведенному ниже.
Exception in thread "main" java.lang.NoClassDefFoundError:
org/apache/commons/logging/LogFactory
at org.slf4j.impl.JCLLoggerFactory.getLogger(JCLLoggerFactory.java:77)
at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:358)
at SLF4JExample.main(SLF4JExample.java:8)
Caused by: java.lang.ClassNotFoundException:
org.apache.commons.logging.LogFactory
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 3 more
Чтобы решить эту проблему, вам нужно добавить commons-logging.jar к вашему пути к классам.
Обнаружены как jcl-over-slf4j.jar, так и привязанный slf4j-jcl.jar в пути к классам ..
Привязка slf4j-jcl.jar перенаправляет вызовы регистратора slf4j на JCL и jcl-over-slf4j.jarперенаправляет вызовы регистратора JCL на slf4j. Следовательно, у вас не может быть обоих в пути к классам вашего проекта. Если вы это сделаете, вы получите исключение, подобное приведенному ниже.
SLF4J: Detected both jcl-over-slf4j.jar AND bound slf4j-jcl.jar on the class
path, preempting StackOverflowError.
SLF4J: See also http://www.slf4j.org/codes.html#jclDelegationLoop for more
details.
Exception in thread "main" java.lang.ExceptionInInitializerError
at org.slf4j.impl.StaticLoggerBinder.<init>(StaticLoggerBinder.java:71)
at org.slf4j.impl.StaticLoggerBinder.<clinit>(StaticLoggerBinder.java:42)
at org.slf4j.LoggerFactory.bind(LoggerFactory.java:150)
at org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:124)
at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:412)
at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:357)
at SLF4JExample.main(SLF4JExample.java:8)
Caused by: java.lang.IllegalStateException: Detected both jcl-over-slf4j.jar
AND bound slf4j-jcl.jar on the class path, preempting StackOverflowError. See
also http://www.slf4j.org/codes.html#jclDelegationLoop for more details.
at org.slf4j.impl.JCLLoggerFactory.<clinit>(JCLLoggerFactory.java:54)
... 7 more
Чтобы решить эту проблему, удалите любой из файлов jar.
Обнаружено несоответствие имени регистратора
Вы можете создать объект Logger:
Передача имени создаваемого логгера в качестве аргумента в getLogger() метод.
Передача класса в качестве аргумента этому методу.
Если вы пытаетесь создать объект фабрики регистратора, передав класс в качестве аргумента, и если вы установили системное свойство slf4j.detectLoggerNameMismatch значение true, то имя класса, передаваемого в качестве аргумента getLogger() метод и класс, который вы используете, должны быть одинаковыми, иначе вы получите следующее предупреждение:
«Обнаружено несоответствие имени регистратора.
Рассмотрим следующий пример.
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class SLF4JExample {
public static void main(String[] args) {
System.setProperty("slf4j.detectLoggerNameMismatch", "true");
//Creating the Logger object
Logger logger = LoggerFactory.getLogger(Sample.class);
//Logging the information
logger.info("Hi Welcome to Tutorilspoint");
}
}
Здесь мы установили для свойства slf4j.detectLoggerNameMismatch значение true. Имя используемого нами класса:SLF4JExample а имя класса, которое мы передали методу getLogger (), - Sample поскольку они оба не равны, мы получим следующее предупреждение.
SLF4J: Detected logger name mismatch. Given name: "Sample"; computed name:
"SLF4JExample".
SLF4J: See http://www.slf4j.org/codes.html#loggerNameMismatch for an
explanation
Dec 10, 2018 12:43:00 PM SLF4JExample main
INFO: Hi Welcome to Tutorilspoint
Note - Это происходит после slf4j 1.7.9
Путь к классам содержит несколько привязок SLF4J.
У вас должна быть только одна привязка в пути к классам. Если у вас несколько привязок, вы получите предупреждение со списком привязок и их местоположением.
Допустим, если у нас есть привязки slf4j-jdk14.jar и slf4j-nop.jar в пути к классам мы получим следующее предупреждение.
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in
[jar:file:/C:/Users/Tutorialspoint/Desktop/Latest%20Tutorials/SLF4J%20Tutorial/
slf4j-1.7.25/slf4j-nop-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in
[jar:file:/C:/Users/Tutorialspoint/Desktop/Latest%20Tutorials/SLF4J%20Tutorial/
slf4j-1.7.25/slf4j-jdk14-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an
explanation.
SLF4J: Actual binding is of type [org.slf4j.helpers.NOPLoggerFactory]
Обнаружены как log4j-over-slf4j.jar, так и связанный slf4j-log4j12.jar на пути к классу
Чтобы перенаправить вызовы регистратора log4j на slf4j, вам необходимо использовать log4j-over-slf4j.jar привязка, и если вы хотите перенаправить вызовы slf4j на log4j, вам нужно использовать slf4j-log4j12.jar привязка.
Следовательно, в пути к классам не может быть обоих. Если вы это сделаете, вы получите следующее исключение.
SLF4J: Detected both log4j-over-slf4j.jar AND bound slf4j-log4j12.jar on the
class path, preempting StackOverflowError.
SLF4J: See also http://www.slf4j.org/codes.html#log4jDelegationLoop for more
details.
Exception in thread "main" java.lang.ExceptionInInitializerError
at org.slf4j.impl.StaticLoggerBinder.<init>(StaticLoggerBinder.java:72)
at org.slf4j.impl.StaticLoggerBinder.<clinit>(StaticLoggerBinder.java:45)
at org.slf4j.LoggerFactory.bind(LoggerFactory.java:150)
at org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:124)
at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:412)
at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:357)
at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:383)
at SLF4JExample.main(SLF4JExample.java:8)
Caused by: java.lang.IllegalStateException: Detected both log4j-over-slf4j.jar
AND bound slf4j-log4j12.jar on the class path, preempting StackOverflowError.
See also http://www.slf4j.org/codes.html#log4jDelegationLoop for more details.
Как обсуждалось ранее в этом руководстве, SLF4J обеспечивает поддержку параметризованных сообщений журнала.
Вы можете использовать параметры в сообщениях и передавать им значения позже в том же операторе.
Синтаксис
Как показано ниже, вам нужно использовать заполнители ({}) в сообщении (String) везде, где вам нужно, а позже вы можете передать значение для заполнителя в object форма, разделив сообщение и значение запятой.
Integer age;
Logger.info("At the age of {} ramu got his first job", age);
пример
В следующем примере демонстрируется параметризованное ведение журнала (с одним параметром) с использованием SLF4J.
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class PlaceHolders {
public static void main(String[] args) {
//Creating the Logger object
Logger logger = LoggerFactory.getLogger(PlaceHolders.class);
Integer age = 23;
//Logging the information
logger.info("At the age of {} ramu got his first job", age);
}
}
Вывод
После выполнения вышеуказанная программа генерирует следующий вывод:
Dec 10, 2018 3:25:45 PM PlaceHolders main
INFO: At the age of 23 Ramu got his first job
Преимущество параметризованной регистрации
В Java, если нам нужно вывести значения в операторе, мы будем использовать оператор конкатенации как -
System.out.println("At the age of "+23+" ramu got his first job");
Это включает преобразование целочисленного значения 23 в строку и объединение этого значения с окружающими его строками.
И если это оператор ведения журнала, и если этот конкретный уровень журнала вашего оператора отключен, тогда все эти вычисления будут бесполезны.
В таких обстоятельствах вы можете использовать параметризованное ведение журнала. В этом формате изначально SLF4J подтверждает, включено ли ведение журнала для определенного уровня. Если это так, то он заменяет заполнители в сообщениях соответствующими значениями.
Например, если у нас есть утверждение как
Integer age;
Logger.debug("At the age of {} ramu got his first job", age);
Только если включена отладка, SLF4J преобразует возраст в целое число и объединяет его со строками, иначе ничего не делает. Таким образом, затраты на построение параметров при отключенном уровне ведения журнала.
Вариант с двумя аргументами
Вы также можете использовать два параметра в сообщении как -
logger.info("Old weight is {}. new weight is {}.", oldWeight, newWeight);
пример
В следующем примере демонстрируется использование двух заполнителей в параметризованном ведении журнала.
import java.util.Scanner;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class PlaceHolders {
public static void main(String[] args) {
Integer oldWeight;
Integer newWeight;
Scanner sc = new Scanner(System.in);
System.out.println("Enter old weight:");
oldWeight = sc.nextInt();
System.out.println("Enter new weight:");
newWeight = sc.nextInt();
//Creating the Logger object
Logger logger = LoggerFactory.getLogger(Sample.class);
//Logging the information
logger.info("Old weight is {}. new weight is {}.", oldWeight, newWeight);
//Logging the information
logger.info("After the program weight reduced is: "+(oldWeight-newWeight));
}
}
Вывод
После выполнения вышеуказанная программа генерирует следующий вывод.
Enter old weight:
85
Enter new weight:
74
Dec 10, 2018 4:12:31 PM PlaceHolders main
INFO: Old weight is 85. new weight is 74.
Dec 10, 2018 4:12:31 PM PlaceHolders main
INFO: After the program weight reduced is: 11
Вариант с несколькими аргументами
Вы также можете использовать более двух заполнителей, как показано в следующем примере -
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class PlaceHolders {
public static void main(String[] args) {
Integer age = 24;
String designation = "Software Engineer";
String company = "Infosys";
//Creating the Logger object
Logger logger = LoggerFactory.getLogger(Sample.class);
//Logging the information
logger.info("At the age of {} ramu got his first job as a {} at {}", age, designation, company);
}
}
Вывод
После выполнения вышеуказанная программа генерирует следующий вывод:
Dec 10, 2018 4:23:52 PM PlaceHolders main
INFO: At the age of 24 ramu got his first job as a Software Engineer at Infosys
Если у вас есть проект в Jakarta Commons Logging (JCL) или, log4j или java.util.logging (JUL), и вы хотите преобразовать эти проекты в SLF4J, вы можете сделать это с помощью инструмента миграции, предоставленного в дистрибутиве SLF4J.
Запуск SLF4J Migrator
SLF4J - это простой одиночный файл jar (slf4j-migrator.jar), и вы можете запустить его с помощью команды java –jar.
Чтобы запустить его, в командной строке просмотрите каталог, в котором находится этот файл jar, и выполните следующую команду.
java -jar slf4j-migrator-1.8.0-beta2.jar
Starting SLF4J Migrator
Это запускает мигратор, и вы можете увидеть автономное приложение Java как -
Как указано в окне, вам необходимо проверить тип миграции, которую вы хотите выполнить, выбрать каталог проекта и нажать кнопку «Перенести проект на SLF4J».
Этот инструмент переходит к предоставленным вами исходным файлам и выполняет простые модификации, такие как изменение строк импорта и объявлений регистратора с текущей платформы ведения журнала на SLF4j.
пример
Например, предположим, что у нас есть образец log4j(2) проект в eclipse с одним файлом следующим образом:
import org.apache.log4j.Logger;
import java.io.*;
import java.sql.SQLException;
import java.util.*;
public class Sample {
/* Get actual class name to be printed on */
static Logger log = Logger.getLogger(Sample.class.getName());
public static void main(String[] args)throws IOException,SQLException {
log.debug("Hello this is a debug message");
log.info("Hello this is an info message");
}
}
Чтобы перенести образец log4j(2) проект в slf4j, нам нужно установить переключатель from log4j to slf4j и выберите каталог проекта и нажмите Exit мигрировать.
Мигратор изменил приведенный выше код следующим образом. Здесь, если вы заметили, что операторы import и logger были изменены.
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.*;
import java.sql.SQLException;
import java.util.*;
public class Sample {
static Logger log = LoggerFactory.getLogger(Sample.class.getName());
public static void main(String[] args)throws IOException,SQLException {
log.debug("Hello this is a debug message");
log.info("Hello this is an info message");
}
}
Поскольку у вас уже есть log4j.jar в вашем проекте вам нужно добавить slf4j-api.jar и slf4jlog12.jar файлы в проект для его выполнения.
Ограничения SLF4JMigrator
Ниже приведены ограничения мигратора SLF4J.
Migrator не будет изменять скрипты сборки, такие как ant, maven и ivy, которые вам нужно сделать самостоятельно.
Migrator не поддерживает сообщения, отличные от типа String.
Мигратор не поддерживает FATAL уровень.
При работе с log4j мигратор не будет переносить вызовы в PropertyConfigurator или DomConfigurator.
SLF4J Distribution предоставляет slf4j-ext.jar он содержит API-интерфейсы для таких функций, как профилирование, расширенное ведение журнала, ведение журнала событий и ведение журнала с помощью Java-агента.
Профилирование
Иногда программист хочет измерить некоторые атрибуты, такие как использование памяти, временная сложность или использование определенных инструкций о программах, чтобы измерить реальные возможности этой программы. Такой вид измерения программы называется профилированием. Профилирование использует динамический программный анализ для выполнения таких измерений.
SLF4J предоставляет класс с именем Profiler в org.slf4j.profilerпакет для профилирования. Это известно как профайлер бедняка. Используя это, программист может узнать время, затраченное на выполнение длительных задач.
Профилирование с использованием класса Profiler
Профилировщик содержит секундомеры и дочерние секундомеры, и мы можем запускать и останавливать их, используя методы, предоставляемые классом профилировщика.
Чтобы продолжить профилирование с использованием класса профилировщика, выполните следующие действия.
Шаг 1. Создайте экземпляр класса профилировщика
Создайте экземпляр класса Profiler, передав значение String, представляющее имя профилировщика. Когда мы создаем экземпляр класса Profiler, запускается глобальный секундомер.
//Creating a profiler
Profiler profiler = new Profiler("Sample");
Шаг 2 - Запустите детский секундомер
Когда мы вызываем start() метод, он запустит новый дочерний секундомер (названный) и остановит более ранние дочерние секундомеры (или приборы времени).
Вызвать start() метод Profiler class, передав значение String, представляющее имя создаваемого дочернего секундомера.
//Starting a child stopwatch and stopping the previous one.
profiler.start("Task 1");
obj.demoMethod1();
После создания этих секундомеров вы можете выполнять свои задачи или вызывать те методы, которые запускают ваши задачи.
Шаг 3. Включите еще один детский секундомер (если хотите)
При необходимости создайте еще один секундомер, используя start()метод и выполнить необходимые задачи. Если вы это сделаете, он запустит новый секундомер и остановит предыдущий (т.е. задача 1).
//Starting another child stopwatch and stopping the previous one.
profiler.start("Task 2");
obj.demoMethod2();
Шаг 4. Остановите часы
Когда мы вызываем stop() , он остановит последний дочерний секундомер и глобальный секундомер и вернет текущий инструмент времени.
// Stopping the current child stopwatch and the global stopwatch.
TimeInstrument tm = profiler.stop();
Шаг 5: Распечатайте содержимое инструмента времени.
Распечатайте содержимое инструмента текущего времени, используя print() метод.
//printing the contents of the time instrument
tm.print();
пример
В следующем примере демонстрируется профилирование с использованием класса Profiler для SLF4J. Здесь мы взяли две примерные задачи: распечатали сумму квадратов чисел от 1 до 10000, напечатали сумму чисел от 1 до 10000. Мы пытаемся получить время, затраченное на эти две задачи.
import org.slf4j.profiler.Profiler;
import org.slf4j.profiler.TimeInstrument;
public class ProfilerExample {
public void demoMethod1(){
double sum = 0;
for(int i=0; i< 1000; i++){
sum = sum+(Math.pow(i, 2));
}
System.out.println("Sum of squares of the numbers from 1 to 10000: "+sum);
}
public void demoMethod2(){
int sum = 0;
for(int i=0; i< 10000; i++){
sum = sum+i;
}
System.out.println("Sum of the numbers from 1 to 10000: "+sum);
}
public static void main(String[] args) {
ProfilerExample obj = new ProfilerExample();
//Creating a profiler
Profiler profiler = new Profiler("Sample");
//Starting a child stop watch and stopping the previous one.
profiler.start("Task 1");
obj.demoMethod1();
//Starting another child stop watch and stopping the previous one.
profiler.start("Task 2");
obj.demoMethod2();
//Stopping the current child watch and the global watch.
TimeInstrument tm = profiler.stop();
//printing the contents of the time instrument
tm.print();
}
}
Вывод
После выполнения вышеуказанная программа генерирует следующий вывод:
Sum of squares of the numbers from 1 to 10000: 3.328335E8
Sum of the numbers from 1 to 10000: 49995000
+ Profiler [BASIC]
|-- elapsed time [Task 1] 2291.827 microseconds.
|-- elapsed time [Task 2] 225.802 microseconds.
|-- Total [BASIC] 3221.598 microseconds.
Регистрация информации профилировщика
Вместо того, чтобы печатать результат профилировщика для регистрации этой информации, вам необходимо:
Создайте регистратор, используя LoggerFactory класс.
Создайте профилировщик, создав экземпляр класса Profiler.
Свяжите регистратор с профилировщиком, передав созданный объект регистратора в setLogger() метод Profiler класс.
Наконец, вместо печати журнала информация профилировщика с помощью log() метод.
пример
В следующем примере, в отличие от предыдущего (вместо печати), мы пытаемся записать содержимое инструмента времени.
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.profiler.Profiler;
import org.slf4j.profiler.TimeInstrument;
public class ProfilerExample_logger {
public void demoMethod1(){
double sum = 0;
for(int i=0; i< 1000; i++){
sum = sum+(Math.pow(i, 2));
}
System.out.println("Sum of squares of the numbers from 1 to 10000: "+sum);
}
public void demoMethod2(){
int sum = 0;
for(int i=0; i< 10000; i++){
sum = sum+i;
}
System.out.println("Sum of the numbers from 1 to 10000: "+sum);
}
public static void main(String[] args) {
ProfilerExample_logger obj = new ProfilerExample_logger();
//Creating a logger
Logger logger = LoggerFactory.getLogger(ProfilerExample_logger.class);
//Creating a profiler
Profiler profiler = new Profiler("Sample");
//Adding logger to the profiler
profiler.setLogger(logger);
//Starting a child stop watch and stopping the previous one.
profiler.start("Task 1");
obj.demoMethod1();
//Starting another child stop watch and stopping the previous one.
profiler.start("Task 2");
obj.demoMethod2();
//Stopping the current child watch and the global watch.
TimeInstrument tm = profiler.stop();
//Logging the contents of the time instrument
tm.log();
}
}
Вывод
После выполнения вышеуказанная программа генерирует следующий вывод.
Sum of squares of the numbers from 1 to 10000: 3.328335E8
Sum of the numbers from 1 to 10000: 49995000