μμ€ν μ μλν λ μμ€ν μ μλ μνμ κΈ°λ‘κ³Ό 보쑴, μ΄μ©μμ μ΅μ± μ‘°μ¬ λ° μμ€ν λμμ λΆμ λ±μ νκΈ° μν΄ μλμ€μ κ°μ’ μ 보λ₯Ό κΈ°λ‘ν΄λ νμκ° μλ€. μ΄ κΈ°λ‘μ λ§λλ κ²μ λ‘κΉ μ΄λΌ νλ€. μ¦ λ‘κ·Έ μμ€ν μ μ¬μ©μ κ΄κ³λ μΌλ ¨μ μ¬κ±΄λ€μ μκ°μ κ²½κ³Όμ λ°λΌ κΈ°λ‘νλ κ²μ΄λ€.
- κ°λ° ν λ, λλ²κΉ μ μ¬μ©ν μ μλ€.
- μ¬μ©μμ μ΄λ²€νΈλ₯Ό μΆμ ν μ μλ€.
- μλ¬ λ°μ μ μΆμ ν μ μλ μ΅μνμ μ 보(λ μ§, μκ°, νΉμ ν΄λμ€, λ‘κ·Έ νμ (error, info, warn, debug λ±))κ° μλ€.
- μΆλ ₯λ λ‘κ·Έ λ΄μ©μ μλ²λ‘ μ μ‘ν μ μλ€.
- λ‘κ·Έ νν°λ§μ ν μκ° μλ€. νΉμ λ‘κ·Έ μμ€μ μνλ λ©μμ§λ₯Ό λΉνμ±νν μ μλ κΈ°λ₯λ€μ΄ μλ€.
- μ€λ λμ μμ νμ§ μλ€.
- printlnμ 맀 μ€νμλ§λ€ μ€νΈλ¦Όμ μμ±νκ³ , IO μμ μ μ€ννλ Blocking λ°©μμ΄λ€. μ΄λ μ±λ₯μμ λ¬Έμ λ₯Ό μΌκΈ°νμ¬ μ΄μ μ€μΈ μλ²μ μ€μκ° μ²λ¦¬λμ ν° μν₯μ λ―ΈμΉκ² λλ€.
λ‘κΉ μ λν μΆμ λ μ΄μ΄λ₯Ό μ 곡νλ μΈν°νμ΄μ€μ λͺ¨μ.
μΆμ λ‘κΉ νλ μμν¬μ΄κΈ° λλ¬Έμ, ꡬνμ²΄κ° μμ΄ λ¨λ μΌλ‘ μ¬μ©νμ§ μλλ€.
API , Binding , Bridging λΌλ μΈ κ°μ§ λͺ¨λμ μ 곡νλ€.
- slf4j μμ μ 곡νλ api λ€μ μλ―Έ
- λ‘κΉ κ΅¬ν체μ μ°κ²°νλ κ², μ»΄νμΌ νμμ μ€μ§ νλμ λ‘κΉ νλ μμν¬λ₯Ό μ¬μ©νλλ‘ λ°μΈλ© νλ€.
- log4j, JCL, JUL κ³Ό κ°μ λ€λ₯Έ λ‘κΉ API λ₯Ό μ¬μ©νλλΌλ λ΄λΆμμλ SLF4J API λ₯Ό νΈμΆνλλ‘(리λλ μ ) μ΄λν° μν μ ν΄μ£Όλ λΌμ΄λΈλ¬λ¦¬
- μ¬λ¬ κ°μ ν΄λμ€κ° νλμ μν μ μνν λ, λνμ μΈ μΈν°νμ΄μ€λ§μ λ€λ£¨λ ν΄λμ€λ₯Ό λμ΄ μνλ κΈ°λ₯μ μ²λ¦¬ν μ μκ² λμμ£Όλ ν¨ν΄μ΄λ€.
- ν΄λΌμ΄μΈνΈλ Facadeμ μμ²μ μ μ‘νμ¬ Subsystemκ³Ό ν΅μ νλ©°, Facadeλ ν΄λΉ μμ²μ μ μ ν Subsystem κ°μ²΄λ‘ μ λ¬νλ€.
- Subsystem κ°μ²΄κ° μ€μ μμ μ μννμ§λ§ Facadeλ μΈν°νμ΄μ€λ₯Ό Subsystem μΈν°νμ΄μ€λ‘ λ³ννκΈ° μν΄ μ체 μμ μ μνν΄μΌ ν μλ μλ€. μ¦, 곡ν΅λ Interfaceλ₯Ό μ μ νκ² λ³νν΄μ μ°κ²°νλ€.
- Facadeλ₯Ό μ¬μ©νλ ν΄λΌμ΄μΈνΈλ Subsystem κ°μ²΄μ μ§μ μ‘μΈμ€ν νμκ° μλ€. μ¦, ν΄λΌμ΄μΈνΈλ Subsystemμ μ νμ μμ΄ Common Interfaceμλ§ μ κ·Όνλ€.
- ν΄λμ€λ₯Ό μ»΄νμΌνκ³ μ€νν΄λ³΄μ. ( slf4j λΌμ΄λΈλ¬λ¦¬λ μν¬νΈ λμ΄μμ )
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");
}
}
- μ€ν νλ©΄, λ‘κ·Έ μΆλ ₯μ μ λλ‘ λμ§ μκ³ , κ²½κ³ κ° λ°μνλ€.
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.
-
μ΄ κ²½κ³ λ class pathμμ slf4j ꡬν체λ₯Ό μ°Ύμ μ μκΈ° λλ¬Έμ μΆλ ₯λλ€. μ¦, class pathμ μ¬μ©νκΈΈ μνλ Logging Frameworkμ λν slf4j λ°μΈλ©(.jar)μ μΆκ°ν΄μΌ νλ€. μ΄λ, λ μ΄μμ slf4j λ°μΈλ©(λ°λμ νλλ§)μ λλ©΄ μλλ€.
-
Logging Frameworkλ₯Ό μ ννλ €λ©΄ class pathμμ slf4j λ°μΈλ©μ λ³κ²½νλ€.
-
Ex) java.util.logging β> log4jλ‘ μ ννλ €λ©΄
slf4j-jdk14-1.7.25.jar β> slf4j-log4j12-1.7.25.jarλ‘ λ³κ²½
Java κΈ°λ° λ‘κΉ νλ μμν¬
λ©μΈμ§λ₯Ό κΈ°λ‘νλλ° μ¬μ©νλ€.
νμΌ, DB, Console λ±κ³Ό κ°μ λμμ λ‘κΉ μ 보λ₯Ό μΆλ ₯νλ λ° μ¬μ©νλ€.
λ‘κΉ μ 보μ μ€νμΌμ μ νλλ°μ μ¬μ©νλ€.
Trace < Debug < Info < Warn < Error < Fatal
log4j λ₯Ό κΈ°λ°μΌλ‘ μλ, λ©λͺ¨λ¦¬ μ¬μ©λ₯ λ± μ±λ₯μ κ°μ νμ¬ κ°λ°ν λ‘κΉ λΌμ΄λΈλ¬λ¦¬
- Automatic Reloading Configuration file
μ€νμ€μΈ νλ‘κ·Έλ¨μ λ‘κ·Έ μ€μ μ λ³κ²½νκ³ μΆμ λ, κΈ°μ‘΄μ λ€λ₯Έ λΌμ΄λΈλ¬λ¦¬μ κ²½μ° μ€νμ€μΈ νλ‘κ·Έλ¨μ μ¬μμμ΄ νμνμ§λ§, LogBackμ κ²½μ° μ€μ νμΌμ μ€μΊνλ λ³λμ μ°λ λλ₯Ό λμ΄ μ§μ ν μκ°λ§λ€ μ€μ νμΌμ μ€μΊν΄ νλ‘κ·Έλ¨μ μ¬μμ μμ΄ μ€μ μ μ μ©μν¬ μ μλ€.
- Automatic Compression / Removal
λ‘κ·Έ νμΌμ μμ±ν λ λ³λμ νλ‘κ·Έλ¨μ ν΅ν΄ μμΆμ΄ νμ μλλ‘ μλ μμΆμ μ§μνλ©°, μκ° λλ κ°―μλ₯Ό μ€μ νμ¬ μ€μ ν μκ°μ΄λ κ°―μλ₯Ό μ΄κ³Όν κ²½μ° λ‘κ·Έ νμΌμ΄ μλμΌλ‘ μμ λλλ‘ ν μ μλ€.
- Graceful recovery from I/O failures
λ‘κ·ΈνμΌμ JDBC, Socket λ±μ Appenderλ₯Ό ν΅ν΄ μ격 μλ²μ μ μ₯μν¬ μ μλ€. νμ§λ§ λ§μ½ μ격μλ² λλ μ°κ²°μ μΌμμ μ₯μ κ° λ°μνμ¬ λ‘κ·ΈνμΌμ I/O Failureμ΄ λ°μ ν κ²½μ°, Log4J μ κ°μ κΈ°μ‘΄ λΌμ΄λΈλ¬λ¦¬μμλ μλ² λ³΅κ΅¬μμ κΉμ§μ νλ‘κ·Έλ¨ μ€λ¨ λ° μ¬μμμ΄ νμνμ§λ§, LogBackμ μλ² μ€μ§ μμ΄, μ₯μ λ°μμμ μΌλ‘λΆν°μ μλ볡ꡬλ₯Ό μ§μνλ€.
- Prudent mode
νλμ μλ²μμ λμνλ μ¬λ¬ JVMμ λ‘κ·Έκ° νλμ λ‘κ·ΈνμΌλ‘ κΈ°λ‘λκΈ°λ₯Ό μν κ²½μ° μ¬μ©ν μ μλ κΈ°λ₯
-
log4j2λ log4jμμ λ μ±λ₯μ κ°μ ν λΌμ΄λΈλ¬λ¦¬ μ΄λ€.
-
log4j2 λ λ©ν° μ€λ λ νκ²½μμ logback λ³΄λ€ μ±λ₯μ΄ λ°μ΄λλ€κ³ νλ€.
-
κ·Έλ μ§λ§, μ€νλ§λΆνΈ μμλ slf4j + logback μ κΈ°λ³Έμ μΌλ‘ μ±ννκ³ μλ€.
μΆμ² : https://logging.apache.org/log4j/2.x/performance.html
Error(μ€λ₯) λ 벨μ μλΉμ€ λμμ μ΄μμ΄ μμ μ λλ‘ λ¬Έμ κ° λ°μν κ²½μ°μ΄λ€. DB 컀λ₯μ μ€λ₯λ, λμ€ν¬ μ μ₯ κ³΅κ° λΆμ‘± λ±μ μν©μ΄ μ΄μ ν΄λΉ νλ€. Error λ‘κ·Έκ° λ±μ₯νλ©΄, λΉμΌ 근무μκ° λ΄μ μ΄μ λ΄λΉμκ° νμΈ μ‘°μΉνκ³ ν΄λΉ μ¬νμ λν΄ κ³΅μ ν΄μΌ νλ€. λμΌν Errorκ° λ°λ³΅ν΄μ λ°μνλ€λ©΄, 근무μκ° μΈλΌλ μ¦μ νμΈ μ‘°μΉν΄μ 곡μ ν΄μΌ νλ€.
Warning(κ²½κ³ ) λ 벨μ μλΉμ€ λμμλ μ΄μμ΄ μμ§λ§, μΆν μ₯μ λ‘ μ΄μ΄μ§ μ μλ λ¬Έμ κ° λ°μν κ²½μ°μ΄λ€. 컀λ₯μ μ¬μλ, λ°±μ μλ²λ‘ λ³κ²½ λ±μ μν©μ΄ μ΄μ ν΄λΉ νλ€. Warning λ‘κ·Έκ° λ±μ₯νλ©΄, λ°μλ μΆμ΄λ₯Ό νμΈν΄ 1~2μ£Ό λ΄λ‘ νμΈ μ‘°μΉλ₯Ό ν΄μΌ νλ€.
Info(μλ¦Ό) λ 벨μ μμ€ν
λμ μμμ νΉμ μμ
μ΄ μ μμ μΌλ‘ μνλμμ μλ €μ£Όλ κ²½μ°μ΄λ€. μ΄λ λ¨μ μμ
(Unit of Work)μ κ°μ΄ μλ €μ€μΌ νλ€. μ£Όλ‘ μλΉμ€ μμ λ° μ’
λ£λ νΉμ λ¨μ λ±λ‘ λ° μμ λ±μ μν©μ΄ μ΄μ ν΄λΉ,
Info λ‘κ·Έλ μ μμ μΌλ‘ μλ£ν μμ
μμ μΈ‘μ νκ±°λ, μμ€ν
νκ²½μ΄λ μ€μ μ 보λ₯Ό νμΈν λ μ¬μ©νλ€.
Debug(λλ²κ·Έ) λ 벨μ Info λ‘κ·Έμμ κΈ°λ‘λ λ¨μ μμ μ μμΈν λ¨κ³λ₯Ό κΈ°λ‘νλ€. μ£Όλ‘ κ°λ° λ° ν΅ν© ν μ€νΈ λ¨κ³μμ λλ²κΉ μ©λλ‘ μ¬μ©νκ±°λ, μ΄μ μ€ λ¬Έμ λ°μμ μμΈ νμ μ μν΄μ μ¬μ©νλ€.