์์คํ ์ ์๋ํ ๋ ์์คํ ์ ์๋ ์ํ์ ๊ธฐ๋ก๊ณผ ๋ณด์กด, ์ด์ฉ์์ ์ต์ฑ ์กฐ์ฌ ๋ฐ ์์คํ ๋์์ ๋ถ์ ๋ฑ์ ํ๊ธฐ ์ํด ์๋์ค์ ๊ฐ์ข ์ ๋ณด๋ฅผ ๊ธฐ๋กํด๋ ํ์๊ฐ ์๋ค. ์ด ๊ธฐ๋ก์ ๋ง๋๋ ๊ฒ์ ๋ก๊น ์ด๋ผ ํ๋ค. ์ฆ ๋ก๊ทธ ์์คํ ์ ์ฌ์ฉ์ ๊ด๊ณ๋ ์ผ๋ จ์ ์ฌ๊ฑด๋ค์ ์๊ฐ์ ๊ฒฝ๊ณผ์ ๋ฐ๋ผ ๊ธฐ๋กํ๋ ๊ฒ์ด๋ค.
- ๊ฐ๋ฐ ํ ๋, ๋๋ฒ๊น ์ ์ฌ์ฉํ ์ ์๋ค.
- ์ฌ์ฉ์์ ์ด๋ฒคํธ๋ฅผ ์ถ์ ํ ์ ์๋ค.
- ์๋ฌ ๋ฐ์ ์ ์ถ์ ํ ์ ์๋ ์ต์ํ์ ์ ๋ณด(๋ ์ง, ์๊ฐ, ํน์ ํด๋์ค, ๋ก๊ทธ ํ์ (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 ๋ก๊ทธ์์ ๊ธฐ๋ก๋ ๋จ์ ์์ ์ ์์ธํ ๋จ๊ณ๋ฅผ ๊ธฐ๋กํ๋ค. ์ฃผ๋ก ๊ฐ๋ฐ ๋ฐ ํตํฉ ํ ์คํธ ๋จ๊ณ์์ ๋๋ฒ๊น ์ฉ๋๋ก ์ฌ์ฉํ๊ฑฐ๋, ์ด์ ์ค ๋ฌธ์ ๋ฐ์์ ์์ธ ํ์ ์ ์ํด์ ์ฌ์ฉํ๋ค.