SLF4J-퀵 가이드
SLF4J는 S구현하다 L오깅 F아카데미 Java. Java의 모든 로깅 프레임 워크에 대한 간단한 추상화를 제공합니다. 따라서 사용자는 Log4j, Logback 및 Logback과 같은 모든 로깅 프레임 워크로 작업 할 수 있습니다.JUL(java.util.logging) 단일 종속성을 사용합니다. 런타임 / 배포시 필요한 로깅 프레임 워크로 마이그레이션 할 수 있습니다.
Ceki Gülcü는 자카르타 커먼즈 로깅 프레임 워크의 대안으로 SLF4J를 만들었습니다.
SLF4J의 장점
다음은 SLF4J의 장점입니다-
SLF4J 프레임 워크를 사용하면 배포시 원하는 로깅 프레임 워크로 마이그레이션 할 수 있습니다.
Slf4J는 log4j, JUL, 단순 로깅 및 NOP와 같은 모든 인기있는 로깅 프레임 워크에 대한 바인딩을 제공합니다. 따라서 배포시 이러한 인기있는 프레임 워크로 전환 할 수 있습니다.
SLF4J는 사용하는 바인딩에 관계없이 매개 변수화 된 로깅 메시지를 지원합니다.
SLF4J는 애플리케이션과 로깅 프레임 워크를 분리하므로 로깅 프레임 워크와 관계없이 애플리케이션을 쉽게 작성할 수 있습니다. 애플리케이션을 작성하는 데 사용되는 로깅 프레임 워크에 대해 신경 쓸 필요가 없습니다.
SLF4J는 마이그레이션기로 알려진 간단한 Java 도구를 제공합니다. 이 도구를 사용하면 Jakarta Commons Logging (JCL) 또는 log4j 또는 Java.util.logging (JUL)과 같은 로깅 프레임 작동을 사용하는 기존 프로젝트를 SLF4J로 마이그레이션 할 수 있습니다.
프로그래밍에 로그인하는 것은 활동 / 이벤트를 기록하는 것을 의미합니다. 일반적으로 애플리케이션 개발자는 로깅을 처리해야합니다.
로깅 작업을 더 쉽게하기 위해 Java는 log4J, java.util.logging (JUL), 작은 로그, 로그 백 등 다양한 프레임 워크를 제공합니다.
로깅 프레임 워크 개요
로깅 프레임 워크는 일반적으로 세 가지 요소를 포함합니다.
나무꾼
메타 데이터와 함께 메시지를 캡처합니다.
포맷터
로거가 캡처 한 메시지를 형식화합니다.
매니저
핸들러 또는 어 펜더는 마지막으로 콘솔에 인쇄하거나 데이터베이스에 저장하거나 이메일을 통해 전송하여 메시지를 발송합니다.
일부 프레임 워크는 작업 속도를 높이기 위해 로거 및 어 펜더 요소를 결합합니다.
로거 개체
메시지를 기록하기 위해 응용 프로그램은 이름 및 보안 수준과 함께 로거 객체 (경우에 따라 예외와 함께)를 보냅니다.
심각도 수준
기록되는 메시지는 다양한 수준입니다. 다음 표에는 일반적인 로깅 수준이 나열되어 있습니다.
Sr. 아니요 | 심각도 및 설명 |
---|---|
1 | Fatal 응용 프로그램을 종료하는 심각한 문제입니다. |
2 | ERROR 런타임 오류. |
삼 | WARNING 대부분의 경우 오류는 더 이상 사용되지 않는 API의 사용으로 인해 발생합니다. |
4 | INFO 런타임에 발생하는 이벤트입니다. |
5 | DEBUG 시스템 흐름에 대한 정보. |
6 | TRACE 시스템 흐름에 대한 자세한 정보. |
log4j는 무엇입니까?
log4j는 안정적이고 빠르며 유연합니다. logging framework (APIs) written in Java, Apache 소프트웨어 라이센스에 따라 배포됩니다.
log4j는 런타임에 외부 구성 파일을 통해 고도로 구성 할 수 있습니다. 우선 순위의 관점에서 로깅 프로세스를보고 데이터베이스, 파일, 콘솔, UNIX Syslog 등과 같은 다양한 대상으로 로깅 정보를 전달하는 메커니즘을 제공합니다 (log4j에 대한 자세한 내용은 자습서 참조 ).
SLF4J 및 Log4j 비교
log4j와 달리 SLF4J (S구현하다 L오깅 F아카데미 Java)는 로깅 프레임 워크의 구현이 아닙니다. abstraction for all those logging frameworks in Java similar to log4J. 따라서 둘 다 비교할 수는 없습니다. 그러나 둘 중 하나를 선호하는 것은 항상 어렵습니다.
선택할 수있는 경우 로깅 추상화가 로깅 프레임 워크보다 항상 선호됩니다. 로깅 추상화, 특히 SLF4J를 사용하는 경우 단일 종속성을 선택하지 않고 배포시 필요한 로깅 프레임 워크로 마이그레이션 할 수 있습니다.
더 잘 이해하려면 다음 다이어그램을 참조하십시오.
이 장에서는 Eclipse IDE에서 SLF4J 환경을 설정하는 방법에 대해 설명합니다. 설치를 진행하기 전에 시스템에 이미 Eclipse가 설치되어 있는지 확인하십시오. 그렇지 않은 경우 Eclipse를 다운로드하여 설치하십시오.
Eclipse에 대한 자세한 내용은 Eclipse Tutorial을 참조하십시오.
1 단계 : 종속성 JAR 파일 다운로드
SLF4J 웹 사이트 의 공식 홈페이지 를 열고 다운로드 페이지로 이동합니다.
이제 최신 안정 버전을 다운로드하십시오. slf4j-X.X.tar.gz또는 slf4j-XXzip , 운영 체제에 따라 (Windows .zip 파일 또는 Linux tar.gz 파일 인 경우).
다운로드 한 폴더 내에서 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 바인딩
이외에 slf4j-api.x.x.jar 파일, SLF4J아래와 같이 몇 가지 다른 Jar 파일을 제공합니다. 이것들은SLF4J bindings.
각 바인딩은 해당 로깅 프레임 워크에 대한 것입니다.
다음 표에는 SLF4J 바인딩 및 해당 프레임 워크가 나열되어 있습니다.
Sr. 아니요 | Jar 파일 및 로깅 프레임 워크 |
---|---|
1 | slf4j-nop-x.x.jar 작업 없음, 모든 로깅을 삭제합니다. |
2 | slf4j-simple-x.x.jar 정보 이상의 메시지가 인쇄되고 모든 출력이 System.err에 남아있는 간단한 구현입니다. |
삼 | 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 파일 (바인딩)을 추가해야합니다.
한 프레임 워크에서 다른 프레임 워크로 전환하려면 각 바인딩을 바꿔야합니다. 경계가 발견되지 않으면 기본적으로 작동하지 않는 모드입니다.
SLF4J 용 Pom.xml
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는 SLF4J API의 진입 점입니다. 다음은이 인터페이스의 중요한 방법을 나열합니다.
Sr. 아니. | 방법 및 설명 |
---|---|
1 | void debug(String msg) 이 메서드는 DEBUG 수준에서 메시지를 기록합니다. |
2 | void error(String msg) 이 메서드는 ERROR 수준에서 메시지를 기록합니다. |
삼 | void info(String msg) 이 메서드는 INFO 수준에서 메시지를 기록합니다. |
4 | void trace(String msg) 이 메서드는 TRACE 수준에서 메시지를 기록합니다. |
5 | void warn(String msg) 이 방법은 WARN 수준에서 메시지를 기록합니다. |
LoggerFactory 클래스
LoggerFactory 클래스 org.slf4j package는 log4j, JUL, NOP 및 단순 로거와 같은 다양한 로깅 API에 대한 로거를 생성하는 데 사용되는 유틸리티 클래스입니다.
Sr. 아니. | 방법 및 설명 |
---|---|
1 | Logger getLogger(String name) 이 메서드는 이름을 나타내는 문자열 값을 받아들이고 Logger 지정된 이름을 가진 개체. |
프로파일 러 클래스
이 클래스는 패키지에 속합니다. org.slf4j이것은 프로파일 링 목적으로 사용되며 가난한 사람의 프로파일 러로 알려져 있습니다. 이를 사용하여 프로그래머는 장시간 작업을 수행하는 데 걸리는 시간을 알 수 있습니다.
다음은이 수업의 중요한 방법입니다.
Sr. 아니. | 방법 및 설명 |
---|---|
1 | void start(String name) 이 메서드는 새 하위 스톱워치 (이름이 지정됨)를 시작하고 이전 하위 스톱워치 (또는 시간 계기)를 중지합니다. |
2 | TimeInstrument stop() 이 메서드는 최근 하위 스톱워치와 글로벌 스톱워치를 중지하고 현재 시간 계측기를 반환합니다. |
삼 | void setLogger(Logger logger) 이 메서드는 Logger 개체를 받아들이고 지정된 로거를 현재 프로파일 러에 연결합니다. |
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 interface는 필요한 메시지를 나타내는 문자열 값을 받아들이고 정보 수준에서 기록합니다.
logger.info("Hi This is my first SLF4J program");
예
다음은 SLF4J를 사용하여 Java로 샘플 로거를 작성하는 방법을 보여주는 프로그램입니다.
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는 기본적으로 작동하지 않는 구현으로 설정되었습니다. 따라서 메시지를 보려면 프로젝트 클래스 경로에 원하는 바인딩을 추가해야합니다. 이클립스를 사용하고 있으므로build path 각 JAR 파일에 대해 또는 pom.xml 파일에 해당 종속성을 추가하십시오.
예를 들어 JUL (Java.util.logging 프레임 워크)을 사용해야하는 경우 jar 파일의 빌드 경로를 설정해야합니다. slf4j-jdk14-x.x.jar. 그리고 log4J 로깅 프레임 워크를 사용하려면 빌드 경로를 설정하거나 jar 파일에 대한 종속성을 추가해야합니다.slf4j-log4j12-x.x.jar 과 log4j.jar.
다음을 제외한 로깅 프레임 워크를 나타내는 바인딩을 추가 한 후 slf4j-nopx.x.jar 프로젝트 (classpath)에 다음 출력이 표시됩니다.
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 − 이것은 1.6.0과 1.8.0-beta2 사이의 SLF4J 버전에서 발생합니다.
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.
클래스 경로에는 1.8 이전의 slf4j-api 버전을 대상으로하는 SLF4J 바인딩이 포함되어 있습니다.
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.jarJCL 로거의 호출을 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 파일 중 하나를 삭제하십시오.
로거 이름 불일치 감지
다음과 같이 로거 객체를 만들 수 있습니다.
생성 될 로거의 이름을 인수로 전달 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 응용 프로그램을 다음과 같이 볼 수 있습니다.
창에 지정된대로 수행하려는 마이그레이션 유형을 확인하고 프로젝트 디렉토리를 선택한 다음 Migrate Project to SLF4J 버튼을 클릭해야합니다.
이 도구는 제공 한 소스 파일로 이동하여 가져 오기 행 및 로거 선언을 현재 로깅 프레임 워크에서 SLF4j로 변경하는 것과 같은 간단한 수정을 수행합니다.
예
예를 들어 샘플이 있다고 가정 해 보겠습니다. log4j(2) 다음과 같이 단일 파일로 이클립스에서 프로젝트-
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는 문자열 유형 이외의 메시지를 지원하지 않습니다.
Migrator는 FATAL 수준을 지원하지 않습니다.
log4j로 작업하는 동안 마이그레이션자는 호출을 PropertyConfigurator 또는 DomConfigurator로 마이그레이션하지 않습니다.
SLF4J Distribution은 slf4j-ext.jar 여기에는 프로파일 링, 확장 로깅, 이벤트 로깅 및 Java 에이전트를 사용한 로깅과 같은 기능에 대한 API가 포함됩니다.
프로파일 링
때때로 프로그래머는 메모리 사용, 시간 복잡도 또는 프로그램에 대한 특정 명령 사용과 같은 일부 속성을 측정하여 해당 프로그램의 실제 기능을 측정하려고합니다. 프로그램에 대한 이러한 종류의 측정을 프로파일 링이라고합니다. 프로파일 링은 동적 프로그램 분석을 사용하여 이러한 측정을 수행합니다.
SLF4J는 Profiler 에 org.slf4j.profiler프로파일 링 목적을위한 패키지. 이것은 가난한 사람의 프로파일 러로 알려져 있습니다. 이를 사용하여 프로그래머는 장시간 작업을 수행하는 데 걸리는 시간을 알 수 있습니다.
Profiler 클래스를 사용하여 프로파일 링
프로파일 러에는 스톱워치와 하위 스톱워치가 포함되어 있으며 프로파일 러 클래스에서 제공하는 메서드를 사용하여 시작 및 중지 할 수 있습니다.
프로파일 러 클래스를 사용하여 프로파일 링을 계속하려면 다음 단계를 따르십시오.
1 단계-프로파일 러 클래스 인스턴스화
프로파일 러의 이름을 나타내는 문자열 값을 전달하여 Profiler 클래스를 인스턴스화합니다. Profiler 클래스를 인스턴스화하면 글로벌 스톱워치가 시작됩니다.
//Creating a profiler
Profiler profiler = new Profiler("Sample");
2 단계-어린이 스톱워치 시작
우리가 호출 할 때 start() 메서드는 새 하위 스톱워치 (이름이 지정됨)를 시작하고 이전 하위 스톱워치 (또는 시간 계기)를 중지합니다.
호출 start() 의 방법 Profiler 생성 할 하위 스톱워치의 이름을 나타내는 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();
예
다음 예제는 SLF4J의 Profiler 클래스를 사용한 프로파일 링을 보여줍니다. 여기서 우리는 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