๐ณ ๋ก๊น ํ๋ ์์ํฌ: Log4j์ SLF4J ์ฌ์ฉ๋ฒ ๐ณ

๐ณ ๋ก๊น ํ๋ ์์ํฌ: Log4j์ SLF4J ์ฌ์ฉ๋ฒ ๐ณ
์๋ ํ์ธ์, ์ฌ๋ฌ๋ถ! ์ค๋์ ์๋ฐ ๊ฐ๋ฐ์๋ค์ ํ์ ์์ดํ ์ธ ๋ก๊น ํ๋ ์์ํฌ์ ๋ํด ์์๋ณผ ๊ฑฐ์์. ํนํ Log4j์ SLF4J๋ผ๋ ๋ ๊ฐ์ง ๊ฐ๋ ฅํ ๋๊ตฌ๋ฅผ ์ง์ค์ ์ผ๋ก ํํค์ณ๋ณผ ๊ฑฐ๋๊น ์ค๋น๋์ จ๋์? ๐
๋ก๊น ์ด ๋ญ๊ธธ๋ ์ด๋ ๊ฒ ์ค์ํ๋๊ณ ์? ใ ใ ใ ์ ๊น๋ง์, ์ฌ๋ฌ๋ถ! ๋ก๊น ์ ๊ฐ๋ฐ์์ ์ถ๊ณผ ๋ผ๋ ค์ผ ๋ ์ ์๋ ๊ด๊ณ๋๋๋ค. ์ฝ๋์์ ๋ญ๊ฐ ์๋ชป๋์ ๋, ๋ก๊ทธ๊ฐ ์๋ค๋ฉด ์ฐ๋ฆฌ๋ ๊ทธ๋ฅ '๋ฉ๋ถ' ์ํ์ ๋น ์ง ๋ฟ์ด์ฃ . ๐ฑ
๊ทธ๋์ ์ค๋์ ์ฌ๋ฌ๋ถ์ ์ฝ๋ฉ ๋ผ์ดํ๋ฅผ ํ์ธต ์ ๊ทธ๋ ์ด๋์์ผ์ค Log4j์ SLF4J์ ๋ํด ์์ฃผ ์์ธํ ์์๋ณผ ๊ฑฐ์์. ๋ง์น ์ฌ๋ฅ๋ท์์ ๊ณ ์ํํ 1:1๋ก ๋ฐฐ์ฐ๋ ๊ฒ์ฒ๋ผ ๋ง์ด์ฃ ! ๐
๐ก Pro Tip: ๋ก๊น ์ ๋จ์ํ ์๋ฌ๋ฅผ ์ฐพ๋ ๊ฒ ์ด์์ ๊ฐ์น๊ฐ ์์ด์. ์ฌ์ฉ์ ํ๋ ๋ถ์, ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง, ๋ณด์ ๊ฐ์ฌ ๋ฑ ๋ค์ํ ์ฉ๋๋ก ํ์ฉํ ์ ์๋ต๋๋ค!
์, ์ด์ ๋ณธ๊ฒฉ์ ์ผ๋ก ์์ํด๋ณผ๊น์? ์ฌ๋ฌ๋ถ์ ์๋ฐ ์ค๋ ฅ์ ํ ๋จ๊ณ ๋์ด์ฌ๋ฆด ์ค๋น๊ฐ ๋์ จ๋์? ๊ทธ๋ผ ๊ณ ๊ณ ์ฝ! ๐โโ๏ธ๐จ
๐ ๋ก๊น ์ ๊ธฐ์ด: ์ ํ์ํ๊ณ ์ด๋ป๊ฒ ์ฐ๋ ๊ฑธ๊น?
์ฌ๋ฌ๋ถ, ๋ก๊น ์ด ๋ญ์ง ์์๋์? ๊ทธ๋ฅ System.out.println()์ผ๋ก ์ฝ์์ ์ถ๋ ฅํ๋ฉด ๋๋ ๊ฑฐ ์๋๋๊ณ ์? ใ ใ ใ ์๋์์, ์ ๋ ์๋์์! ๋ก๊น ์ ๊ทธ๊ฒ๋ณด๋ค ํจ์ฌ ๋ ๊ฐ๋ ฅํ๊ณ ์ ์ฉํ ๋๊ตฌ๋๋๋ค. ๐
๋ก๊น ์ ๊ฐ๋จํ ๋งํด์ ํ๋ก๊ทธ๋จ์ด ์คํ๋๋ ๋์ ๋ฐ์ํ๋ ๋ค์ํ ์ด๋ฒคํธ๋ฅผ ๊ธฐ๋กํ๋ ๊ณผ์ ์ด์์. ์ด๊ฒ ์ ์ค์ํ๋๊ณ ์? ์, ์์ํด๋ณด์ธ์. ์ฌ๋ฌ๋ถ์ด ๋ง๋ ์ฑ์ด ๊ฐ์๊ธฐ ํฌ๋์๊ฐ ๋ฌ์ด์. ๊ทผ๋ฐ ๋ก๊ทธ๊ฐ ์๋ค๋ฉด? ๊ทธ๋ฅ '์ ๋งํ๋ค'๋ง ์ธ์น๊ณ ์๊ฒ ์ฃ . ๐ฑ
ํ์ง๋ง ๋ก๊น ์ด ์๋ค๋ฉด? ๋ง์น ํ์ ์ฒ๋ผ ๋ฌธ์ ์ ์์ธ์ ์ถ์ ํ ์ ์์ด์! ์ด๋ค ๋ฉ์๋์์, ์ด๋ค ๋ฐ์ดํฐ๋ก ์ธํด ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋์ง ๋ช ํํ๊ฒ ์ ์ ์์ฃ . ์ด๊ฒ ๋ฐ๋ก ๋ก๊น ์ ํ์ด์์!
๐ ์์๋์ธ์: ๋ก๊น ์ ๋จ์ํ ์๋ฌ ์ถ์ ์ ์ํ ๊ฒ๋ง์ด ์๋๋๋ค. ์ฌ์ฉ์์ ํ๋ ํจํด์ ๋ถ์ํ๊ฑฐ๋, ์์คํ ์ ์ฑ๋ฅ์ ๋ชจ๋ํฐ๋งํ๋ ๋ฐ์๋ ์์ฃผ ์ ์ฉํ๊ฒ ์ฌ์ฉ๋ผ์!
๊ทธ๋ผ ์ด์ ๋ก๊น ์ ๊ธฐ๋ณธ์ ์ธ ๊ฐ๋ ์ ๋ํด ์ข ๋ ์์ธํ ์์๋ณผ๊น์? ๐ค
1. ๋ก๊ทธ ๋ ๋ฒจ ๐ก
๋ก๊ทธ์๋ ์ฌ๋ฌ ๊ฐ์ง ๋ ๋ฒจ์ด ์์ด์. ๊ฐ ๋ ๋ฒจ์ ๋ก๊ทธ ๋ฉ์์ง์ ์ค์๋๋ฅผ ๋ํ๋ด์ฃ . ๋ณดํต ๋ค์๊ณผ ๊ฐ์ ๋ ๋ฒจ๋ค์ด ์ฌ์ฉ๋ฉ๋๋ค:
- TRACE: ๊ฐ์ฅ ์์ธํ ์ ๋ณด๋ฅผ ๋ด๋ ๋ ๋ฒจ์ด์์. ๊ฐ๋ฐ ์ค์ ์์๋ก ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ฃ .
- DEBUG: ๋๋ฒ๊น ๋ชฉ์ ์ผ๋ก ์ฌ์ฉ๋๋ ์ ๋ณด๋ฅผ ๋ด์์.
- INFO: ์ผ๋ฐ์ ์ธ ์ ๋ณด๋ฅผ ๋ํ๋ด์. ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ ๋ณํ ๊ฐ์ ๊ฒ๋ค์ด์ฃ .
- WARN: ์ ์ฌ์ ์ธ ๋ฌธ์ ๊ฐ ๋ ์ ์๋ ์ํฉ์ ๋ํ๋ด์. ๋น์ฅ์ ๊ด์ฐฎ์ง๋ง ์ฃผ์๊ฐ ํ์ํ ๊ฒฝ์ฐ์ฃ .
- ERROR: ์ค์ ๋ก ์๋ฌ๊ฐ ๋ฐ์ํ ์ํฉ์ ๋ํ๋ด์. ํ์ง๋ง ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ์ ํ ๋์ ์ค์ด์์.
- FATAL: ๊ฐ์ฅ ์ฌ๊ฐํ ์๋ฌ์์. ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ ์ด์ ๋์ํ ์ ์๋ ์ํฉ์ด์ฃ .
์ด๋ ๊ฒ ๋ ๋ฒจ์ ๋๋๋ฉด ๋ญ๊ฐ ์ข๋๊ณ ์? ์, ์๋ฅผ ๋ค์ด๋ณผ๊ฒ์. ์ฌ๋ฌ๋ถ์ด ์ด์ ์ค์ธ ์๋น์ค์์ ๋ชจ๋ ๋ก๊ทธ๋ฅผ ๋ค ๋ณด๊ณ ์์ผ๋ฉด ์ด๋จ๊น์? ์ ์ ์๊ฒ ์ฃ ? ใ ใ ใ ๊ทธ๋์ ๋ณดํต์ ์ด์ ํ๊ฒฝ์์๋ INFO ๋ ๋ฒจ ์ด์๋ง ๋ก๊น ํ๋๋ก ์ค์ ํด์. ๊ทธ๋ฌ๋ค๊ฐ ๋ฌธ์ ๊ฐ ์๊ธฐ๋ฉด DEBUG ๋ ๋ฒจ๋ก ๋ฎ์ถฐ์ ๋ ์์ธํ ์ ๋ณด๋ฅผ ์ป์ ์ ์๋ ๊ฑฐ์ฃ ! ๐
2. ๋ก๊ทธ ํฌ๋งท ๐
๋ก๊ทธ๋ฅผ ์ด๋ค ํ์์ผ๋ก ๋จ๊ธธ์ง๋ ์ค์ํด์. ๋ณดํต์ ๋ค์๊ณผ ๊ฐ์ ์ ๋ณด๋ค์ ํฌํจ์ํค์ฃ :
- ํ์์คํฌํ: ์ธ์ ๋ฐ์ํ ๋ก๊ทธ์ธ์ง
- ๋ก๊ทธ ๋ ๋ฒจ: ์์์ ๋งํ ๊ทธ ๋ ๋ฒจ์ด์!
- ํด๋์ค ์ด๋ฆ: ์ด๋ค ํด๋์ค์์ ๋ฐ์ํ ๋ก๊ทธ์ธ์ง
- ๋ฉ์์ง: ์ค์ ๋ก๊ทธ ๋ด์ฉ
- ์คํ ํธ๋ ์ด์ค: ์๋ฌ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ, ์ด๋์ ๋ฐ์ํ๋์ง ์ถ์ ํ ์ ์๋ ์ ๋ณด
์ด๋ ๊ฒ ํฌ๋งท์ ์ ์ ํด๋๋ฉด, ๋์ค์ ๋ก๊ทธ๋ฅผ ๋ถ์ํ ๋ ํจ์ฌ ํธํด์ ธ์. ๋ง์น ์ ์ ๋ฆฌ๋ ์๋์ฅ์ ๋ณด๋ ๊ฒ์ฒ๋ผ์! ๐
3. ๋ก๊ทธ ์ถ๋ ฅ ๋์ ๐ฏ
๋ก๊ทธ๋ฅผ ์ด๋์ ๋จ๊ธธ์ง๋ ์ค์ํ ๊ฒฐ์ ์ด์์. ์ฝ์์ ์ถ๋ ฅํ ์๋ ์๊ณ , ํ์ผ์ ์ ์ฅํ ์๋ ์๊ณ , ์ฌ์ง์ด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ ์๋ ์์ด์. ๊ฐ๊ฐ์ ์ฅ๋จ์ ์ด ์์ฃ :
- ์ฝ์ ์ถ๋ ฅ: ๊ฐ๋ฐ ์ค์ ๋ฐ๋ก๋ฐ๋ก ํ์ธํ ์ ์์ด ํธ๋ฆฌํด์. ํ์ง๋ง ์๊ตฌ์ ์ผ๋ก ์ ์ฅ๋์ง ์์ฃ .
- ํ์ผ ์ ์ฅ: ๋ก๊ทธ๋ฅผ ์๊ตฌ์ ์ผ๋ก ๋ณด๊ดํ ์ ์์ด์. ํ์ง๋ง ํ์ผ์ด ๋๋ฌด ์ปค์ง๋ฉด ๊ด๋ฆฌ๊ฐ ํ๋ค ์ ์์ฃ .
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ์ฅ: ๊ตฌ์กฐํ๋ ํํ๋ก ์ ์ฅ๋ผ์ ๋์ค์ ๋ถ์ํ๊ธฐ ์ข์์. ํ์ง๋ง ์ค์ ์ด ์ข ๋ณต์กํ๊ณ DB ๋ถํ๊ฐ ๋์ด๋ ์ ์์ด์.
์ฌ๋ฌ๋ถ์ ํ๋ก์ ํธ ํน์ฑ์ ๋ง๊ฒ ์ ํํ๋ฉด ๋ผ์. ์์ ํ๋ก์ ํธ๋ผ๋ฉด ํ์ผ ๋ก๊น ์ผ๋ก๋ ์ถฉ๋ถํ๊ฒ ์ง๋ง, ๋๊ท๋ชจ ์๋น์ค๋ผ๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ก๊น ๋ ๊ณ ๋ คํด๋ณผ ๋งํ์ฃ !
๐ก ๊ฟํ: ๋ก๊ทธ ๋กํ ์ด์ ์ ์ค์ ํด๋ณด์ธ์! ๋ก๊ทธ ํ์ผ์ด ํน์ ํฌ๊ธฐ๋ ๊ธฐ๊ฐ์ ๋์ด๊ฐ๋ฉด ์๋์ผ๋ก ์ ํ์ผ์ ๋ง๋ค์ด ๊ด๋ฆฌ๋ฅผ ํธํ๊ฒ ํด์ค์. Log4j๋ Logback ๊ฐ์ ํ๋ ์์ํฌ์์ ์ฝ๊ฒ ์ค์ ํ ์ ์๋ต๋๋ค!
์, ์ด์ ๋ก๊น ์ ๊ธฐ์ด์ ๋ํด ์์๋ดค์ด์. ์ด๋์, ์๊ฐ๋ณด๋ค ๊น์ด๊ฐ ์์ฃ ? ใ ใ ใ ํ์ง๋ง ๊ฑฑ์ ๋ง์ธ์. ์ด์ ๋ถํฐ Log4j์ SLF4J๋ผ๋ ๊ฐ๋ ฅํ ๋๊ตฌ๋ฅผ ์ฌ์ฉํด์ ์ด ๋ชจ๋ ๊ฑธ ์ฝ๊ฒ ๊ด๋ฆฌํ ์ ์๋ ๋ฐฉ๋ฒ์ ์์๋ณผ ๊ฑฐ์์! ๐
๋ค์ ์น์ ์์๋ Log4j์ ๋ํด ์์ธํ ์์๋ณผ ๊ฑฐ์์. Log4j๊ฐ ์ด๋ป๊ฒ ์ด ๋ชจ๋ ๋ก๊น ๊ธฐ๋ฅ์ ์ฝ๊ณ ํจ์จ์ ์ผ๋ก ๋ง๋ค์ด์ฃผ๋์ง, ๊ทธ๋ฆฌ๊ณ ์ด๋ป๊ฒ ์ฌ์ฉํ๋์ง step by step์ผ๋ก ์ค๋ช ํด๋๋ฆด๊ฒ์. ์ฌ๋ฅ๋ท์์ ๊ณ ๊ธ Java ๊ฐ์๋ฅผ ๋ฃ๋ ๊ฒ์ฒ๋ผ ์์ธํ๊ฒ ์ค๋ช ํด๋๋ฆด ํ ๋ ๊ธฐ๋ํ์ธ์! ๐
์, ๊ทธ๋ผ Log4j์ ์ธ๊ณ๋ก ๋ค์ด๊ฐ๋ณผ๊น์? ๊ณ ๊ณ ์ฝ! ๐โโ๏ธ๐จ
๐ Log4j: ์๋ฐ ๊ฐ๋ฐ์์ ๋ ๋ ํ ์น๊ตฌ
์๋ ํ์ธ์, ์ฌ๋ฌ๋ถ! ์ด์ ๋ณธ๊ฒฉ์ ์ผ๋ก Log4j์ ๋ํด ์์๋ณผ ์๊ฐ์ด์์. Log4j๋ ๋ญ๊ธธ๋ ์ด๋ ๊ฒ ์ ๋ช ํ ๊ฑธ๊น์? ๐ค
Log4j๋ Apache Software Foundation์์ ๊ฐ๋ฐํ ์๋ฐ ๊ธฐ๋ฐ์ ๋ก๊น ํ๋ ์์ํฌ์์. ์ด๋ฆ์์ ์ ์ ์๋ฏ์ด, 'Logging for Java'์ ์ค์๋ง์ด์ฃ . ใ ใ ใ ๊ฐ๋จํ์ฃ ? ํ์ง๋ง ๊ทธ ๊ธฐ๋ฅ์ ์ ๋ง ๊ฐ๋ ฅํด์!
๐ก ์์๋์ธ์: Log4j๋ ํ์ฌ Log4j 2 ๋ฒ์ ์ด ์ฃผ๋ก ์ฌ์ฉ๋๊ณ ์์ด์. ์ด์ ๋ฒ์ ์ธ Log4j 1.x์ ๋นํด ์ฑ๋ฅ์ด ํฌ๊ฒ ๊ฐ์ ๋์๊ณ , ๋ ๋ง์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ต๋๋ค!
์, ์ด์ Log4j์ ์ฃผ์ ํน์ง๋ค์ ํ๋์ฉ ์ดํด๋ณผ๊น์? ๐
1. ๋ค์ํ ์ถ๋ ฅ ๋์ ์ง์ ๐ฏ
Log4j๋ ์ ๋ง ๋ค์ํ ๊ณณ์ ๋ก๊ทธ๋ฅผ ๋จ๊ธธ ์ ์์ด์. ์ฝ์, ํ์ผ, ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ๊ธฐ๋ณธ์ด๊ณ , ์ฌ์ง์ด ์ด๋ฉ์ผ๋ก ๋ณด๋ด๊ฑฐ๋ JMS๋ก ์ ์กํ ์๋ ์์ฃ . ์ด๋ฐ ์ถ๋ ฅ ๋์์ Log4j์์๋ 'Appender'๋ผ๊ณ ๋ถ๋ฌ์.
์๋ฅผ ๋ค์ด, ๋ค์๊ณผ ๊ฐ์ Appender๋ค์ด ์์ด์:
- ConsoleAppender: ์ฝ์์ ๋ก๊ทธ๋ฅผ ์ถ๋ ฅํด์.
- FileAppender: ํ์ผ์ ๋ก๊ทธ๋ฅผ ์ ์ฅํด์.
- RollingFileAppender: ํ์ผ์ ๋ก๊ทธ๋ฅผ ์ ์ฅํ๋, ํ์ผ ํฌ๊ธฐ๋ ์๊ฐ์ ๋ฐ๋ผ ์ ํ์ผ์ ๋ง๋ค์ด์.
- JDBCAppender: ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ก๊ทธ๋ฅผ ์ ์ฅํด์.
- SMTPAppender: ์ด๋ฉ์ผ๋ก ๋ก๊ทธ๋ฅผ ๋ณด๋ด์. (์ฌ๊ฐํ ์๋ฌ๊ฐ ๋ฐ์ํ์ ๋ ์ ์ฉํ์ฃ !)
์ด๋ ๊ฒ ๋ค์ํ Appender๋ฅผ ์ ๊ณตํ๋๊น, ์ฌ๋ฌ๋ถ์ ํ๋ก์ ํธ ์ํฉ์ ๋ง๊ฒ ๋ก๊ทธ๋ฅผ ๊ด๋ฆฌํ ์ ์์ด์. ๋ฉ์ง์ฃ ? ๐
2. ๋ก๊ทธ ๋ ๋ฒจ ๊ด๋ฆฌ ๐ก
Log4j๋ ์์ ์ค๋ช ํ ๋ก๊ทธ ๋ ๋ฒจ์ ์์ฃผ ์ ์ง์ํด์. TRACE, DEBUG, INFO, WARN, ERROR, FATAL ๋ฑ์ ๋ ๋ฒจ์ ์ฌ์ฉํ ์ ์์ฃ . ๊ทธ๋ฆฌ๊ณ ์ด ๋ ๋ฒจ์ ์ค์ ํ์ผ์์ ์ฝ๊ฒ ์กฐ์ ํ ์ ์์ด์.
์๋ฅผ ๋ค์ด, ๊ฐ๋ฐ ์ค์๋ DEBUG ๋ ๋ฒจ๋ก ์ค์ ํด์ ์์ธํ ์ ๋ณด๋ฅผ ๋ณผ ์ ์๊ณ , ์ด์ ํ๊ฒฝ์์๋ INFO๋ WARN ๋ ๋ฒจ๋ก ์ฌ๋ ค์ ์ค์ํ ์ ๋ณด๋ง ๋ก๊น ํ ์ ์์ด์. ์ด๋ ๊ฒ ํ๋ฉด ๋ก๊ทธ ํ์ผ ํฌ๊ธฐ๋ ๊ด๋ฆฌํ๊ธฐ ์ฝ๊ณ , ํ์ํ ์ ๋ณด๋ง ๋น ๋ฅด๊ฒ ์ฐพ์ ์ ์์ฃ !
3. ์ ์ฐํ ๋ก๊ทธ ํฌ๋งท ๐
Log4j๋ ๋ก๊ทธ ๋ฉ์์ง์ ํ์์ ์์ฃผ ์ ์ฐํ๊ฒ ์ง์ ํ ์ ์์ด์. 'Layout'์ด๋ผ๋ ๊ฐ๋ ์ ์ฌ์ฉํด์ ๋ก๊ทธ ๋ฉ์์ง์ ํ์์ ์ ์ํ์ฃ . ์๋ฅผ ๋ค์ด:
- SimpleLayout: ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ํ์์ด์์. ๋ก๊ทธ ๋ ๋ฒจ๊ณผ ๋ฉ์์ง๋ง ์ถ๋ ฅํด์.
- PatternLayout: ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ ๋ ์ด์์์ด์์. ์ํ๋ ํ์์ ์ง์ ์ง์ ํ ์ ์์ฃ .
- HTMLLayout: HTML ํ์์ผ๋ก ๋ก๊ทธ๋ฅผ ์ถ๋ ฅํด์. ์น ๋ธ๋ผ์ฐ์ ์์ ๋ณด๊ธฐ ์ข์ฃ !
- XMLLayout: XML ํ์์ผ๋ก ๋ก๊ทธ๋ฅผ ์ถ๋ ฅํด์. ๊ตฌ์กฐํ๋ ๋ฐ์ดํฐ๊ฐ ํ์ํ ๋ ์ ์ฉํด์.
ํนํ PatternLayout์ ์ฌ์ฉํ๋ฉด ์ ๋ง ๋ค์ํ ์ ๋ณด๋ฅผ ๋ก๊ทธ์ ํฌํจ์ํฌ ์ ์์ด์. ์๊ฐ, ํด๋์ค ์ด๋ฆ, ๋ฉ์๋ ์ด๋ฆ, ๋ผ์ธ ๋ฒํธ ๋ฑ๋ฑ... ๋ง์น ์๋ฆฌ์ฌ๊ฐ ๋ ์ํผ๋ฅผ ๋ง๋๋ ๊ฒ์ฒ๋ผ ์ฌ๋ฌ๋ถ๋ง์ ๋ก๊ทธ ํฌ๋งท์ ๋ง๋ค ์ ์์ฃ ! ๐จโ๐ณ
4. ์ค์ ์ ์ ์ฐ์ฑ ๐
Log4j์ ๋ ๋ค๋ฅธ ๊ฐ์ ์ ์ค์ ์ ์ ์ฐ์ฑ์ด์์. XML, JSON, YAML, ํ๋กํผํฐ ํ์ผ ๋ฑ ๋ค์ํ ํ์์ผ๋ก ์ค์ ์ ํ ์ ์์ฃ . ๊ทธ๋ฆฌ๊ณ ์ด ์ค์ ์ ๋ฐํ์์ ๋์ ์ผ๋ก ๋ณ๊ฒฝํ ์๋ ์์ด์!
์๋ฅผ ๋ค์ด, ์๋น์ค ์ด์ ์ค์ ๊ฐ์๊ธฐ ๋ก๊ทธ ๋ ๋ฒจ์ DEBUG๋ก ๋ฎ์ถ๊ณ ์ถ๋ค๋ฉด? ์ค์ ํ์ผ๋ง ์์ ํ๋ฉด ๋ผ์. ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ์์ํ ํ์๋ ์์ฃ . ์ด๋ฐ ์ ์ฐ์ฑ์ด ๋ฐ๋ก Log4j์ ๋งค๋ ฅ์ด์์! ๐
5. ๋น๋๊ธฐ ๋ก๊น ์ง์ โก
Log4j 2๋ถํฐ๋ ๋น๋๊ธฐ ๋ก๊น ์ ์ง์ํด์. ์ด๊ฒ ๋ญ๊ฐ ์ข๋๊ณ ์? ๋ก๊น ์์ ์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฃผ ์์ ์ ๋ฐฉํดํ์ง ์๊ฒ ํด์ค์. ๋ก๊ทธ๋ฅผ ์ฐ๋ ๋์ ๋ค๋ฅธ ์์ ์ ๋ฉ์ถ์ง ์๊ณ ๊ณ์ ์งํ๋๋ ๊ฑฐ์ฃ .
์ด๋ ๊ฒ ํ๋ฉด ๋ก๊น ์ผ๋ก ์ธํ ์ฑ๋ฅ ์ ํ๋ฅผ ์ต์ํํ ์ ์์ด์. ํนํ ๊ณ ์ฑ๋ฅ์ด ํ์ํ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์์ฃผ ์ ์ฉํ์ฃ !
๐ ์ฑ๋ฅ ํ: ๋น๋๊ธฐ ๋ก๊น ์ ์ฌ์ฉํ๋ฉด ๋ก๊น ์ฑ๋ฅ์ด ํฌ๊ฒ ํฅ์๋ผ์. ํ์ง๋ง ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ์กฐ๊ธ ๋์ด๋ ์ ์์ผ๋ ์ฃผ์ํ์ธ์!
6. ์๋ ๋ฆฌ๋ก๋ ๊ธฐ๋ฅ ๐
Log4j 2์์๋ ์ค์ ํ์ผ์ ์๋ ๋ฆฌ๋ก๋ ๊ธฐ๋ฅ์ ์ ๊ณตํด์. ์ด๊ฒ ๋ฌด์จ ๋ป์ด๋๊ณ ์? ์ค์ ํ์ผ์ ๋ณ๊ฒฝํ๋ฉด ์๋์ผ๋ก ๊ทธ ๋ณ๊ฒฝ์ฌํญ์ ์ ์ฉํ๋ค๋ ๊ฑฐ์์!
์๋ฅผ ๋ค์ด, ์ด์ ์ค์ธ ์๋น์ค์์ ๊ฐ์๊ธฐ ๋ก๊ทธ ๋ ๋ฒจ์ ๋ณ๊ฒฝํด์ผ ํ๋ค๋ฉด? ๊ทธ๋ฅ ์ค์ ํ์ผ๋ง ์์ ํ๋ฉด ๋ผ์. Log4j๊ฐ ์์์ ๋ณ๊ฒฝ์ฌํญ์ ๊ฐ์งํ๊ณ ์ ์ฉํด์ค ๊ฑฐ์์. ์ ๋ง ํธํ์ฃ ? ใ ใ ใ
7. ํํฐ๋ง ๊ธฐ๋ฅ ๐
Log4j๋ ๊ฐ๋ ฅํ ํํฐ๋ง ๊ธฐ๋ฅ๋ ์ ๊ณตํด์. ๋ก๊ทธ ๋ ๋ฒจ๋ฟ๋ง ์๋๋ผ ๋ค์ํ ์กฐ๊ฑด์ผ๋ก ๋ก๊ทธ๋ฅผ ํํฐ๋งํ ์ ์์ฃ . ์๋ฅผ ๋ค์ด:
- ํน์ ํจํค์ง๋ ํด๋์ค์ ๋ก๊ทธ๋ง ์ถ๋ ฅ
- ํน์ ๋ฌธ์์ด์ ํฌํจํ ๋ก๊ทธ๋ง ์ถ๋ ฅ
- ํน์ ์๊ฐ๋์ ๋ก๊ทธ๋ง ์ถ๋ ฅ
์ด๋ฐ ํํฐ๋ง ๊ธฐ๋ฅ์ ์ ํ์ฉํ๋ฉด, ์ ๋ง ํ์ํ ๋ก๊ทธ๋ง ๊ณจ๋ผ์ ๋ณผ ์ ์์ด์. ๋ง์น ๋ฐ๋์์ ์ค์ ์ฐพ๋ ๊ฒ์ฒ๋ผ ์ด๋ ค์ด ๋๋ฒ๊น ์์ ๋ ํจ์ฌ ์ฌ์์ง์ฃ ! ๐
8. ํ๋ฌ๊ทธ์ธ ์ํคํ ์ฒ ๐
Log4j 2๋ ํ๋ฌ๊ทธ์ธ ์ํคํ ์ฒ๋ฅผ ์ฑํํ์ด์. ์ด๊ฒ ๋ฌด์จ ๋ง์ด๋๊ณ ์? ๊ธฐ์กด ๊ธฐ๋ฅ์ ํ์ฅํ๊ฑฐ๋ ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ธฐ ์ฝ๋ค๋ ๊ฑฐ์์!
์๋ฅผ ๋ค์ด, ์๋ก์ด ํํ์ Appender๋ Layout์ด ํ์ํ๋ค๋ฉด? ์ง์ ๋ง๋ค์ด์ ํ๋ฌ๊ทธ์ธ์ผ๋ก ์ถ๊ฐํ ์ ์์ด์. ๋ง์น ๋ ๊ณ ๋ธ๋ก์ ์กฐ๋ฆฝํ๋ ๊ฒ์ฒ๋ผ ์ฌ๋ฌ๋ถ๋ง์ ๋ก๊น ์์คํ ์ ๋ง๋ค ์ ์๋ ๊ฑฐ์ฃ ! ๐งฑ
์, ์ฌ๊ธฐ๊น์ง๊ฐ Log4j์ ์ฃผ์ ํน์ง์ด์์. ์ด๋์? ์๊ฐ๋ณด๋ค ํจ์ฌ ๊ฐ๋ ฅํ๊ณ ์ ์ฐํ์ฃ ? ใ ใ ใ
์ด์ ์ด ๊ฐ๋ ฅํ ๋๊ตฌ๋ฅผ ์ด๋ป๊ฒ ์ฌ์ฉํ๋์ง ์์๋ณผ ์ฐจ๋ก์์. ๋ค์ ์น์ ์์๋ Log4j๋ฅผ ์ค์ ๋ก ํ๋ก์ ํธ์ ์ ์ฉํ๋ ๋ฐฉ๋ฒ์ step by step์ผ๋ก ์์๋ณผ ๊ฑฐ์์. ๋ง์น ์ฌ๋ฅ๋ท์์ ์ ๋ฌธ๊ฐ์ ๊ฐ์๋ฅผ ๋ฃ๋ ๊ฒ์ฒ๋ผ ์์ธํ ์ค๋ช ํด๋๋ฆด๊ฒ์! ๐
์ค๋น๋์ จ๋์? ๊ทธ๋ผ Log4j์ ์ค์ ์ฌ์ฉ๋ฒ์ผ๋ก ๊ณ ๊ณ ์ฝ! ๐
๐ Log4j ์ค์ ์ฌ์ฉ๋ฒ: ์ด๋ณด์๋ ์ฝ๊ฒ ๋ฐ๋ผํ๋ ๊ฐ์ด๋
์๋ ํ์ธ์, ์ฌ๋ฌ๋ถ! ์ด์ ๋๋์ด Log4j๋ฅผ ์ค์ ๋ก ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์์๋ณผ ์๊ฐ์ด์์. ๊ธด์ฅ๋๋์? ๊ฑฑ์ ๋ง์ธ์! ๋ง์น ์ฌ๋ฅ๋ท์์ 1:1 ๊ณผ์ธ๋ฅผ ๋ฐ๋ ๊ฒ์ฒ๋ผ ์ฐจ๊ทผ์ฐจ๊ทผ ์ค๋ช ํด๋๋ฆด๊ฒ์. ๐
1. Log4j ์์กด์ฑ ์ถ๊ฐํ๊ธฐ ๐ฆ
๋จผ์ Log4j๋ฅผ ํ๋ก์ ํธ์ ์ถ๊ฐํด์ผ ํด์. Maven์ ์ฌ์ฉํ๋ค๋ฉด pom.xml ํ์ผ์ ๋ค์ ์์กด์ฑ์ ์ถ๊ฐํ์ธ์:
<dependencies>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.14.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.14.1</version>
</dependency>
</dependencies>
Gradle์ ์ฌ์ฉํ๋ค๋ฉด build.gradle ํ์ผ์ ์ด๋ ๊ฒ ์ถ๊ฐํ์ธ์:
dependencies {
implementation 'org.apache.logging.log4j:log4j-api:2.14.1'
implementation 'org.apache.logging.log4j:log4j-core:2.14.1'
}
์ด๋ ๊ฒ ํ๋ฉด Log4j๋ฅผ ์ฌ์ฉํ ์ค๋น๊ฐ ๋๋ฌ์ด์! ์ฝ์ฃ ? ใ ใ ใ
2. Log4j ์ค์ ํ๊ธฐ โ๏ธ
Log4j๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ์ค์ ํ์ผ์ด ํ์ํด์. ๋ณดํต log4j2.xml ์ด๋ผ๋ ์ด๋ฆ์ผ๋ก ๋ง๋ค์ด์. ์ด ํ์ผ์ src/main/resources ํด๋์ ๋ง๋ค์ด์ฃผ์ธ์.
๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ์ค์ ํ์ผ์ ์ด๋ ๊ฒ ์๊ฒผ์ด์:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
์ด ์ค์ ์ ๋ญ ์๋ฏธํ๋ ๊ฑธ๊น์? ๊ฐ๋จํ ์ค๋ช ํด๋๋ฆด๊ฒ์:
- Appenders: ๋ก๊ทธ๋ฅผ ์ด๋์ ์ถ๋ ฅํ ์ง ์ ์ํด์. ์ฌ๊ธฐ์๋ ์ฝ์์ ์ถ๋ ฅํ๋๋ก ์ค์ ํ์ด์.
- PatternLayout: ๋ก๊ทธ ๋ฉ์์ง์ ํ์์ ์ ์ํด์. ์ฌ๊ธฐ์๋ ์๊ฐ, ์ค๋ ๋, ๋ก๊ทธ ๋ ๋ฒจ, ๋ก๊ฑฐ ์ด๋ฆ, ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํ๋๋ก ํ์ด์.
- Loggers: ์ด๋ค ๋ก๊ทธ๋ฅผ ์ถ๋ ฅํ ์ง ์ ์ํด์. ์ฌ๊ธฐ์๋ ๋ชจ๋ ๋ก๊ทธ(Root)๋ฅผ INFO ๋ ๋ฒจ ์ด์์ผ๋ก ์ค์ ํ์ด์.
์ด ์ค์ ๋ง์ผ๋ก๋ ์ถฉ๋ถํ ๋ก๊น ์ ์์ํ ์ ์์ด์! ๋ฉ์ง์ฃ ? ๐
3. ์ฝ๋์์ Log4j ์ฌ์ฉํ๊ธฐ ๐ป >
์, ์ด์ ์ค์ ์ฝ๋์์ Log4j๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์์๋ณผ๊น์? ์ ๋ง ๊ฐ๋จํด์! ๐
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class MyApp {
private static final Logger logger = LogManager.getLogger(MyApp.class);
public static void main(String[] args) {
logger.info("์ ํ๋ฆฌ์ผ์ด์
์ด ์์๋์์ต๋๋ค.");
logger.debug("์ด๊ฒ์ ๋๋ฒ๊ทธ ๋ฉ์์ง์
๋๋ค.");
logger.warn("์ฃผ์! ์ด๊ฒ์ ๊ฒฝ๊ณ ๋ฉ์์ง์
๋๋ค.");
logger.error("์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค!");
}
}
์ด๋ ๊ฒ ํ๋ฉด ๋์ด์์! ์ ๋ง ์ฝ์ฃ ? ใ ใ ใ
๊ฐ ์ค์ ์์ธํ ์ดํด๋ณผ๊น์?
private static final Logger logger = LogManager.getLogger(MyApp.class);
์ด ์ค์์ Logger ๊ฐ์ฒด๋ฅผ ์์ฑํด์. ์ด ๊ฐ์ฒด๋ฅผ ํตํด ๋ก๊ทธ๋ฅผ ๋จ๊ธฐ๊ฒ ๋ฉ๋๋ค.logger.info("์ ํ๋ฆฌ์ผ์ด์ ์ด ์์๋์์ต๋๋ค.");
INFO ๋ ๋ฒจ์ ๋ก๊ทธ๋ฅผ ๋จ๊น๋๋ค. ์ผ๋ฐ์ ์ธ ์ ๋ณด๋ฅผ ๋ก๊น ํ ๋ ์ฌ์ฉํด์.logger.debug("์ด๊ฒ์ ๋๋ฒ๊ทธ ๋ฉ์์ง์ ๋๋ค.");
DEBUG ๋ ๋ฒจ์ ๋ก๊ทธ๋ฅผ ๋จ๊น๋๋ค. ๊ฐ๋ฐ ์ค์ ์์ธํ ์ ๋ณด๋ฅผ ๋ก๊น ํ ๋ ์ฌ์ฉํด์.logger.warn("์ฃผ์! ์ด๊ฒ์ ๊ฒฝ๊ณ ๋ฉ์์ง์ ๋๋ค.");
WARN ๋ ๋ฒจ์ ๋ก๊ทธ๋ฅผ ๋จ๊น๋๋ค. ์ ์ฌ์ ์ธ ๋ฌธ์ ๊ฐ ์์ ๋ ์ฌ์ฉํด์.logger.error("์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค!");
ERROR ๋ ๋ฒจ์ ๋ก๊ทธ๋ฅผ ๋จ๊น๋๋ค. ์ค์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ ๋ ์ฌ์ฉํด์.
๐ก Pro Tip: ๋ก๊ทธ ๋ฉ์์ง์ ๋ณ์๋ฅผ ํฌํจ์ํค๊ณ ์ถ๋ค๋ฉด ์ด๋ ๊ฒ ํ์ธ์:
String userName = "ํ๊ธธ๋";
int userAge = 30;
logger.info("์ฌ์ฉ์ ์ด๋ฆ: {}, ๋์ด: {}", userName, userAge);
์ด๋ ๊ฒ ํ๋ฉด ๋ฌธ์์ด ์ฐ๊ฒฐ๋ณด๋ค ์ฑ๋ฅ์ด ์ข๊ณ , ๊ฐ๋ ์ฑ๋ ๋์์ ธ์!
4. ํ์ผ์ ๋ก๊ทธ ๋จ๊ธฐ๊ธฐ ๐
์ฝ์์ ๋ก๊ทธ๋ฅผ ์ถ๋ ฅํ๋ ๊ฒ๋ ์ข์ง๋ง, ํ์ผ์ ๋ก๊ทธ๋ฅผ ๋จ๊ธฐ๋ฉด ๋์ค์ ๋ถ์ํ๊ธฐ ๋ ์ข๊ฒ ์ฃ ? log4j2.xml ํ์ผ์ ์กฐ๊ธ๋ง ์์ ํ๋ฉด ๋ผ์:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
<File name="File" fileName="app.log">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</File>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="Console"/>
<AppenderRef ref="File"/>
</Root>
</Loggers>
</Configuration>
์ด๋ ๊ฒ ํ๋ฉด ์ฝ์๊ณผ ํ์ผ ์์ชฝ์ ๋ชจ๋ ๋ก๊ทธ๊ฐ ๋จ๊ฒ ๋ผ์. 'app.log'๋ผ๋ ํ์ผ์ด ํ๋ก์ ํธ ๋ฃจํธ ํด๋์ ์์ฑ๋ ๊ฑฐ์์. ๋ฉ์ง์ฃ ? ๐
5. ๋ก๊ทธ ๋ ๋ฒจ ์กฐ์ ํ๊ธฐ ๐ง
๋๋ก๋ ํน์ ํจํค์ง๋ ํด๋์ค์ ๋ก๊ทธ ๋ ๋ฒจ๋ง ๋ค๋ฅด๊ฒ ์ค์ ํ๊ณ ์ถ์ ์ ์์ด์. ๊ทธ๋ด ๋๋ ์ด๋ ๊ฒ ํด๋ณด์ธ์:
<Loggers>
<Logger name="com.mycompany.myapp" level="debug"/>
<Root level="info">
<AppenderRef ref="Console"/>
<AppenderRef ref="File"/>
</Root>
</Loggers>
์ด๋ ๊ฒ ํ๋ฉด 'com.mycompany.myapp' ํจํค์ง์ ๋ก๊ทธ๋ DEBUG ๋ ๋ฒจ๋ถํฐ ์ถ๋ ฅ๋๊ณ , ๋๋จธ์ง๋ INFO ๋ ๋ฒจ๋ถํฐ ์ถ๋ ฅ๋ผ์. ๊ผญ ํ์ํ ๊ณณ๋ง ์์ธํ ๋ค์ฌ๋ค๋ณผ ์ ์๋ ๊ฑฐ์ฃ ! ๐
6. ๋ก๊ทธ ํ์ผ ๋กค๋งํ๊ธฐ ๐
๋ก๊ทธ ํ์ผ์ด ๋๋ฌด ์ปค์ง๋ฉด ๊ด๋ฆฌํ๊ธฐ ํ๋ค์ด์ ธ์. ๊ทธ๋์ ๋ณดํต์ ํ์ผ ํฌ๊ธฐ๋ ์๊ฐ์ ๋ฐ๋ผ ์ ํ์ผ์ ๋ง๋๋ '๋กค๋ง'์ด๋ผ๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํด์. RollingFileAppender๋ฅผ ์ฌ์ฉํ๋ฉด ๋ผ์:
<RollingFile name="RollingFile" fileName="logs/app.log"
filePattern="logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
<Policies>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="10 MB"/>
</Policies>
<DefaultRolloverStrategy max="20"/>
</RollingFile>
์ด ์ค์ ์ ๋ค์๊ณผ ๊ฐ์ ์๋ฏธ์์:
- ๋งค์ผ ์์ ์ ์ ๋ก๊ทธ ํ์ผ์ ๋ง๋ค์ด์.
- ๋ก๊ทธ ํ์ผ์ด 10MB๋ฅผ ๋์ผ๋ฉด ์ ํ์ผ์ ๋ง๋ค์ด์.
- ์ต๋ 20๊ฐ์ ๋ก๊ทธ ํ์ผ์ ์ ์งํด์.
- ์ค๋๋ ๋ก๊ทธ ํ์ผ์ gzip์ผ๋ก ์์ถํด์.
์ด๋ ๊ฒ ํ๋ฉด ๋ก๊ทธ ํ์ผ ๊ด๋ฆฌ๊ฐ ํ๊ฒฐ ์ฌ์์ง ๊ฑฐ์์! ๐
๐ ์ฑ๋ฅ ํ: ๋ก๊ทธ ํ์ผ ์ฐ๊ธฐ๋ I/O ์์ ์ด๋ผ ์ฑ๋ฅ์ ์ํฅ์ ์ค ์ ์์ด์. ์ค์ํ ์์ ์ ํ ๋๋ AsyncAppender๋ฅผ ์ฌ์ฉํด ๋น๋๊ธฐ๋ก ๋ก๊ทธ๋ฅผ ์ฐ๋ ๊ฒ๋ ์ข์ ๋ฐฉ๋ฒ์ด์์!
์, ์ฌ๊ธฐ๊น์ง๊ฐ Log4j์ ๊ธฐ๋ณธ์ ์ธ ์ฌ์ฉ๋ฒ์ด์์. ์ด๋์? ์๊ฐ๋ณด๋ค ์ฝ์ฃ ? ใ ใ ใ
์ด์ ์ฌ๋ฌ๋ถ์ Log4j๋ฅผ ์ฌ์ฉํด ํ๋กํ์ ๋ํ ๋ก๊น ์์คํ ์ ๊ตฌ์ถํ ์ ์์ด์. ๋ฒ๊ทธ ์ถ์ ๋ถํฐ ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง๊น์ง, ๋ก๊ทธ๋ ์ฌ๋ฌ๋ถ์ ๋ ๋ ํ ์กฐ๋ ฅ์๊ฐ ๋ ๊ฑฐ์์! ๐
๋ค์ ์น์ ์์๋ SLF4J์ ๋ํด ์์๋ณผ ๊ฑฐ์์. SLF4J๋ Log4j์ ์ด๋ป๊ฒ ๋ค๋ฅด๊ณ , ์ ์ฌ์ฉํ๋์ง ์์ธํ ์ค๋ช ํด๋๋ฆด๊ฒ์. ์ฌ๋ฅ๋ท์์ ๊ณ ๊ธ ๊ฐ์๋ฅผ ๋ฃ๋ ๊ฒ์ฒ๋ผ ๊น์ด ์๊ฒ ๋ค๋ค๋ณผ ๊ฑฐ๋๊น ๊ธฐ๋ํ์ธ์! ๐
์ค๋น๋์ จ๋์? ๊ทธ๋ผ SLF4J์ ์ธ๊ณ๋ก ๊ณ ๊ณ ์ฝ! ๐โโ๏ธ๐จ
๐ SLF4J: ๋ก๊น ์ ์ ์ฐํ ๋ค๋ฆฌ
์๋ ํ์ธ์, ์ฌ๋ฌ๋ถ! ์ด์ SLF4J(Simple Logging Facade for Java)์ ๋ํด ์์๋ณผ ์๊ฐ์ด์์. SLF4J๊ฐ ๋ญ๊ธธ๋ ์ด๋ ๊ฒ ์ ๋ช ํ ๊ฑธ๊น์? ๐ค
SLF4J๋ ๋ค์ํ ๋ก๊น ํ๋ ์์ํฌ์ ๋ํ ์ถ์ํ ๊ณ์ธต์ ์ ๊ณตํ๋ ์ธํฐํ์ด์ค์์. ์ฝ๊ฒ ๋งํด, ์ฌ๋ฌ ๋ก๊น ํ๋ ์์ํฌ๋ฅผ ์ฝ๊ฒ ๋ฐ๊ฟ ์ธ ์ ์๊ฒ ํด์ฃผ๋ '๋ค๋ฆฌ' ์ญํ ์ ํ๋ค๊ณ ๋ณด๋ฉด ๋ผ์. ใ ใ ใ
๐ก ์์๋์ธ์: SLF4J๋ ๋ก๊น ํ๋ ์์ํฌ๊ฐ ์๋์์! ๊ทธ์ ๋ค๋ฅธ ๋ก๊น ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ํด์ฃผ๋ ์ธํฐํ์ด์ค์ผ ๋ฟ์ด์ฃ . ์ค์ ๋ก๊น ์ Log4j, Logback ๋ฑ์ ๊ตฌํ์ฒด๊ฐ ๋ด๋นํด์.
์, ์ด์ SLF4J์ ์ฃผ์ ํน์ง๋ค์ ํ๋์ฉ ์ดํด๋ณผ๊น์? ๐
1. ๋ค์ํ ๋ก๊น ํ๋ ์์ํฌ ์ง์ ๐
SLF4J๋ ๋ค์๊ณผ ๊ฐ์ ๋ค์ํ ๋ก๊น ํ๋ ์์ํฌ๋ฅผ ์ง์ํด์:
- Log4j
- JUL (java.util.logging)
- Logback
- Simple logger
์ด๋ ๊ฒ ๋ค์ํ ํ๋ ์์ํฌ๋ฅผ ์ง์ํ๋๊น, ๋์ค์ ํ๋ ์์ํฌ๋ฅผ ๋ฐ๊พธ๊ณ ์ถ์ด๋ ์ฝ๋๋ฅผ ํฌ๊ฒ ์์ ํ ํ์๊ฐ ์์ด์. ์ ๋ง ํธ๋ฆฌํ์ฃ ? ๐
2. ๊ฐ๋จํ API ๐
SLF4J์ API๋ ์ ๋ง ๊ฐ๋จํด์. ์ฃผ์ ๋ฉ์๋๋ ๋ค์๊ณผ ๊ฐ์์:
debug()info()warn()error()
์ด๊ฒ ์ ๋ถ์์! ์ฌ์ฉํ๊ธฐ ์ฝ๊ณ , ๊ธฐ์ตํ๊ธฐ๋ ์ฝ์ฃ ? ใ ใ ใ
3. ๋งค๊ฐ๋ณ์ํ๋ ๋ก๊ทธ ๋ฉ์์ง ๐
SLF4J๋ ๋งค๊ฐ๋ณ์ํ๋ ๋ก๊ทธ ๋ฉ์์ง๋ฅผ ์ง์ํด์. ์ด๊ฒ ๋ญ๋๊ณ ์? ์๋ฅผ ๋ค์ด๋ณผ๊ฒ์:
logger.debug("The value of x is {}.", x);
์ฌ๊ธฐ์ {}๋ ๋์ค์ x์ ๊ฐ์ผ๋ก ๋์ฒด๋ผ์. ์ด๋ ๊ฒ ํ๋ฉด ๋ฌธ์์ด ์ฐ๊ฒฐ๋ณด๋ค ์ฑ๋ฅ์ด ์ข๊ณ , ์ฝ๋๋ ๋ ๊น๋ํด์ ธ์!
4. ๋ก๊น ์ฑ๋ฅ ํฅ์ โก
SLF4J๋ ๋ก๊น ์ฑ๋ฅ์ ํฅ์์ํค๋ ๋ช ๊ฐ์ง ๊ธฐ๋ฅ์ ์ ๊ณตํด์:
- Lazy Evaluation: ๋ก๊ทธ ๋ ๋ฒจ์ด ๋นํ์ฑํ๋์ด ์์ผ๋ฉด ๋ก๊ทธ ๋ฉ์์ง๋ฅผ ์์ฑํ์ง ์์์. ์ด๋ ๊ฒ ํ๋ฉด ๋ถํ์ํ ๋ฌธ์์ด ์ฐ์ฐ์ ํผํ ์ ์์ฃ .
- Null ์์ ์ฑ: ๋ก๊ทธ ์ธ์๊ฐ null์ด์ด๋ NullPointerException์ด ๋ฐ์ํ์ง ์์์.
์ด๋ฐ ๊ธฐ๋ฅ๋ค ๋๋ถ์ SLF4J๋ฅผ ์ฌ์ฉํ๋ฉด ๋ก๊น ์ผ๋ก ์ธํ ์ฑ๋ฅ ์ ํ๋ฅผ ์ต์ํํ ์ ์์ด์!
5. ๋ง์ปค ๊ธฐ๋ฅ ๐ฉ
SLF4J๋ '๋ง์ปค'๋ผ๋ ๊ฐ๋ ์ ์ ๊ณตํด์. ๋ง์ปค๋ฅผ ์ฌ์ฉํ๋ฉด ๋ก๊ทธ ๋ฉ์์ง์ ์ถ๊ฐ์ ์ธ ์ ๋ณด๋ฅผ ํ๊ทธํ ์ ์์ฃ . ์๋ฅผ ๋ค๋ฉด:
Marker confidential = MarkerFactory.getMarker("CONFIDENTIAL");
logger.info(confidential, "This is a confidential message");
์ด๋ ๊ฒ ํ๋ฉด ํน์ ์ ํ์ ๋ก๊ทธ ๋ฉ์์ง๋ฅผ ์ฝ๊ฒ ํํฐ๋งํ๊ฑฐ๋ ํน๋ณํ ์ฒ๋ฆฌํ ์ ์์ด์. ๋ฉ์ง์ฃ ? ๐
6. MDC (Mapped Diagnostic Context) ์ง์ ๐บ
SLF4J๋ MDC๋ฅผ ์ง์ํด์. MDC๋ฅผ ์ฌ์ฉํ๋ฉด ๋ก๊ทธ ๋ฉ์์ง์ ์ฝ๊ฒ ์ปจํ ์คํธ ์ ๋ณด๋ฅผ ์ถ๊ฐํ ์ ์์ฃ . ์๋ฅผ ๋ค์ด, ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ๊ฐ ์์ฒญ์ ์ฌ์ฉ์ ID๋ฅผ ๋ก๊ทธ์ ์๋์ผ๋ก ํฌํจ์ํฌ ์ ์์ด์:
MDC.put("userId", user.getId());
logger.info("User profile updated");
MDC.clear();
์ด๋ ๊ฒ ํ๋ฉด ๋ชจ๋ ๋ก๊ทธ ๋ฉ์์ง์ ์ฌ์ฉ์ ID๊ฐ ์๋์ผ๋ก ํฌํจ๋ผ์. ๋ก๊ทธ ๋ถ์์ด ํจ์ฌ ์ฌ์์ง๊ฒ ์ฃ ? ๐
๐ Pro Tip: MDC๋ฅผ ์ฌ์ฉํ ๋๋ ๋ฐ๋์ clear() ๋ฉ์๋๋ฅผ ํธ์ถํด ์ฃผ์ธ์. ๊ทธ๋ ์ง ์์ผ๋ฉด ๋ค๋ฅธ ์์ฒญ์ ์ํฅ์ ์ค ์ ์์ด์!
7. ๋ฐ์ธ๋ฉ ์๋ ๋ก๊น ๐
SLF4J๋ '๋ฐ์ธ๋ฉ ์๋ ๋ก๊น '์ด๋ผ๋ ๊ฐ๋ ์ ์ ๊ณตํด์. ์ด๊ฒ ๋ญ๋๊ณ ์? SLF4J API๋ง ์ฌ์ฉํด์ ๋ก๊ทธ๋ฅผ ๋จ๊ธธ ์ ์๋ค๋ ๊ฑฐ์์. ๋์ค์ ์ค์ ๋ก๊น ๊ตฌํ์ฒด๋ฅผ ๊ฒฐ์ ํ๋ฉด ๋ผ์.
์ด๋ ๊ฒ ํ๋ฉด ๊ฐ๋ฐ ์ด๊ธฐ ๋จ๊ณ์์ ๋ก๊น ํ๋ ์์ํฌ ์ ํ์ ๋ฏธ๋ฃฐ ์ ์์ด์. ๋์ค์ ํ๋ก์ ํธ ์๊ตฌ์ฌํญ์ ๋ง๋ ๋ก๊น ํ๋ ์์ํฌ๋ฅผ ์ ํํ๋ฉด ๋๋๊น ์ ์ฐ์ฑ์ด ๋์์ง์ฃ !
8. ๋ก๊น ํ๋ ์์ํฌ ๋ง์ด๊ทธ๋ ์ด์ ์ง์ ๐
SLF4J๋ ๋ค๋ฅธ ๋ก๊น ํ๋ ์์ํฌ์์ SLF4J๋ก ์ฝ๊ฒ ๋ง์ด๊ทธ๋ ์ด์ ํ ์ ์๋๋ก ๋ธ๋ฆฌ์ง ๋ชจ๋์ ์ ๊ณตํด์. ์๋ฅผ ๋ค์ด, log4j-over-slf4j๋ฅผ ์ฌ์ฉํ๋ฉด ๊ธฐ์กด์ Log4j ์ฝ๋๋ฅผ ๊ทธ๋๋ก ๋ ์ฑ๋ก SLF4J๋ก ์ ํํ ์ ์์ด์.
์ด๋ฐ ๊ธฐ๋ฅ ๋๋ถ์ ๋ ๊ฑฐ์ ํ๋ก์ ํธ์์๋ SLF4J๋ฅผ ์ฝ๊ฒ ๋์ ํ ์ ์์ฃ . ์ ๋ง ํธ๋ฆฌํ์ง ์๋์? ๐
์, ์ฌ๊ธฐ๊น์ง๊ฐ SLF4J์ ์ฃผ์ ํน์ง์ด์์. ์ด๋์? ์๊ฐ๋ณด๋ค ํจ์ฌ ๊ฐ๋ ฅํ๊ณ ์ ์ฐํ์ฃ ? ใ ใ ใ
SLF4J๋ ๋ก๊น ์ '์ค์์ค ์๋ฏธ ๋์ดํ' ๊ฐ์ ์กด์ฌ์์. ๋ค์ํ ์ํฉ์ ์ ์ฐํ๊ฒ ๋์ํ ์ ์๊ณ , ์ฑ๋ฅ๋ ์ข๊ณ , ์ฌ์ฉํ๊ธฐ๋ ์ฝ์ฃ . ๊ทธ๋์ ๋ง์ ์๋ฐ ๊ฐ๋ฐ์๋ค์ด SLF4J๋ฅผ ์ ์ฉํ๋ ๊ฑฐ์์! ๐
๋ค์ ์น์ ์์๋ SLF4J๋ฅผ ์ค์ ๋ก ์ด๋ป๊ฒ ์ฌ์ฉํ๋์ง step by step์ผ๋ก ์์๋ณผ ๊ฑฐ์์. ๋ง์น ์ฌ๋ฅ๋ท์์ ์ ๋ฌธ๊ฐ์ 1:1 ๊ฐ์๋ฅผ ๋ฃ๋ ๊ฒ์ฒ๋ผ ์์ธํ ์ค๋ช ํด๋๋ฆด๊ฒ์! ๐
์ค๋น๋์ จ๋์? ๊ทธ๋ผ SLF4J์ ์ค์ ์ฌ์ฉ๋ฒ์ผ๋ก ๊ณ ๊ณ ์ฝ! ๐
๐ SLF4J ์ค์ ์ฌ์ฉ๋ฒ: ์ด๋ณด์๋ ์ฝ๊ฒ ๋ฐ๋ผํ๋ ๊ฐ์ด๋
์๋ ํ์ธ์, ์ฌ๋ฌ๋ถ! ์ด์ ๋๋์ด SLF4J๋ฅผ ์ค์ ๋ก ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์์๋ณผ ์๊ฐ์ด์์. ๊ธด์ฅ๋๋์? ๊ฑฑ์ ๋ง์ธ์! ๋ง์น ์ฌ๋ฅ๋ท์์ 1:1 ๊ณผ์ธ๋ฅผ ๋ฐ๋ ๊ฒ์ฒ๋ผ ์ฐจ๊ทผ์ฐจ๊ทผ ์ค๋ช ํด๋๋ฆด๊ฒ์. ๐
1. SLF4J ์์กด์ฑ ์ถ๊ฐํ๊ธฐ ๐ฆ
๋จผ์ SLF4J๋ฅผ ํ๋ก์ ํธ์ ์ถ๊ฐํด์ผ ํด์. Maven์ ์ฌ์ฉํ๋ค๋ฉด pom.xml ํ์ผ์ ๋ค์ ์์กด์ฑ์ ์ถ๊ฐํ์ธ์:
<dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.30</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
</dependencies>
์ฌ๊ธฐ์ logback-classic์ SLF4J์ ๊ตฌํ์ฒด์์. SLF4J๋ ์ธํฐํ์ด์ค์ผ ๋ฟ์ด๋๊น ์ค์ ๋ก๊น ์ ์ํํ ๊ตฌํ์ฒด๊ฐ ํ์ํ์ฃ . Logback์ SLF4J์ ์ฐฝ์์๊ฐ ๋ง๋ ๊ตฌํ์ฒด๋ผ ํธํ์ฑ์ด ๊ฐ์ฅ ์ข์์. ๐
2. ๋ก๊ฑฐ ์์ฑํ๊ธฐ ๐ง
์ด์ ์ฝ๋์์ ๋ก๊ฑฐ๋ฅผ ์์ฑํด๋ณผ๊น์? ์ ๋ง ๊ฐ๋จํด์!
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class MyApp {
private static final Logger logger = LoggerFactory.getLogger(MyApp.class);
public static void main(String[] args) {
logger.info("Hello, SLF4J!");
}
}
์ด๋ ๊ฒ ํ๋ฉด ๋์ด์์! ์ ๋ง ์ฝ์ฃ ? ใ ใ ใ
3. ๋ก๊ทธ ๋ ๋ฒจ ์ฌ์ฉํ๊ธฐ ๐
SLF4J๋ ์ฌ๋ฌ ๋ก๊ทธ ๋ ๋ฒจ์ ์ ๊ณตํด์. ์ํฉ์ ๋ง๊ฒ ์ ์ ํ ๋ ๋ฒจ์ ์ฌ์ฉํ๋ฉด ๋ผ์:
logger.trace("๊ฐ์ฅ ์์ธํ ๋ก๊ทธ");
logger.debug("๋๋ฒ๊น
์ ์ํ ๋ก๊ทธ");
logger.info("์ผ๋ฐ์ ์ธ ์ ๋ณด๋ฅผ ๋ํ๋ด๋ ๋ก๊ทธ");
logger.warn("๊ฒฝ๊ณ ๋ฅผ ๋ํ๋ด๋ ๋ก๊ทธ");
logger.error("์๋ฌ๋ฅผ ๋ํ๋ด๋ ๋ก๊ทธ");
๊ฐ ๋ ๋ฒจ์ ์ค์๋ ์์ผ๋ก TRACE < DEBUG < INFO < WARN < ERROR ์์. ์ค์ ๋ ๋ ๋ฒจ ์ด์์ ๋ก๊ทธ๋ง ์ถ๋ ฅ๋๋ ์ฐธ๊ณ ํ์ธ์!
4. ๋งค๊ฐ๋ณ์ํ๋ ๋ฉ์์ง ์ฌ์ฉํ๊ธฐ ๐
SLF4J์ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ ์ค ํ๋๋ ๋งค๊ฐ๋ณ์ํ๋ ๋ฉ์์ง์์. ์ด๋ ๊ฒ ์ฌ์ฉํ๋ฉด ๋ผ์:
String name = "ํ๊ธธ๋";
int age = 30;
logger.info("์ฌ์ฉ์ ์ด๋ฆ: {}, ๋์ด: {}", name, age);
์ด๋ ๊ฒ ํ๋ฉด ๋ฌธ์์ด ์ฐ๊ฒฐ๋ณด๋ค ์ฑ๋ฅ์ด ์ข๊ณ , ์ฝ๋๋ ๋ ๊น๋ํด์ ธ์!
5. ์์ธ ๋ก๊น ํ๊ธฐ โ ๏ธ
์์ธ๊ฐ ๋ฐ์ํ์ ๋ ๋ก๊ทธ๋ฅผ ๋จ๊ธฐ๋ ๊ฒ์ ์ ๋ง ์ค์ํด์. SLF4J๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๋ ๊ฒ ํ ์ ์์ด์:
try {
// ๋ญ๊ฐ ์ํํ ์์
} catch (Exception e) {
logger.error("์์
์ค ์ค๋ฅ ๋ฐ์", e);
}
์ด๋ ๊ฒ ํ๋ฉด ์์ธ ๋ฉ์์ง์ ํจ๊ป ์คํ ํธ๋ ์ด์ค๋ ๋ก๊ทธ์ ๋จ๊ฒ ๋ผ์. ๋๋ฒ๊น ์ด ํ๊ฒฐ ์ฌ์์ง๊ฒ ์ฃ ? ๐
6. ๋ก๊ทธ ์ค์ ํ๊ธฐ โ๏ธ
SLF4J๋ ์ธํฐํ์ด์ค์ผ ๋ฟ์ด๋, ์ค์ ๋ก๊ทธ ์ค์ ์ ์ฌ์ฉํ๋ ๊ตฌํ์ฒด์ ๋ฐ๋ผ ๋ฌ๋ผ์ ธ์. ์ฌ๊ธฐ์๋ Logback์ ์ฌ์ฉํ๋ค๊ณ ๊ฐ์ ํ ๊ฒ์.
src/main/resources ํด๋์ logback.xml ํ์ผ์ ๋ง๋ค๊ณ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํด๋ณด์ธ์:
<configuration>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="info">
<appender-ref ref="CONSOLE" />
</root>
</configuration>
์ด ์ค์ ์ ๋ก๊ทธ๋ฅผ ์ฝ์์ ์ถ๋ ฅํ๊ณ , ๊ธฐ๋ณธ ๋ก๊ทธ ๋ ๋ฒจ์ INFO๋ก ์ค์ ํด์.
7. ๋ง์ปค ์ฌ์ฉํ๊ธฐ ๐ฉ
ํน์ ๋ก๊ทธ์ ํ๊ทธ๋ฅผ ๋ฌ๊ณ ์ถ๋ค๋ฉด ๋ง์ปค๋ฅผ ์ฌ์ฉํด๋ณด์ธ์:
import org.slf4j.Marker;
import org.slf4j.MarkerFactory;
Marker confidential = MarkerFactory.getMarker("CONFIDENTIAL");
logger.info(confidential, "์ด ๋ฉ์์ง๋ ๊ธฐ๋ฐ์ด์์!");
์ด๋ ๊ฒ ํ๋ฉด ๋์ค์ 'CONFIDENTIAL' ๋ง์ปค๊ฐ ๋ถ์ ๋ก๊ทธ๋ง ๋ฐ๋ก ์ฒ๋ฆฌํ ์ ์์ด์.
8. MDC ์ฌ์ฉํ๊ธฐ ๐บ
์ฌ๋ฌ ์ค๋ ๋์์ ๋์์ ๋ก๊ทธ๋ฅผ ๋จ๊ธธ ๋, ๊ฐ ๋ก๊ทธ์ ์ปจํ ์คํธ ์ ๋ณด๋ฅผ ์ถ๊ฐํ๊ณ ์ถ๋ค๋ฉด MDC๋ฅผ ์ฌ์ฉํด๋ณด์ธ์:
import org.slf4j.MDC;
MDC.put("userId", "12345");
logger.info("์ฌ์ฉ์ ๋ก๊ทธ์ธ");
MDC.clear();
์ด๋ ๊ฒ ํ๋ฉด ๋ชจ๋ ๋ก๊ทธ ๋ฉ์์ง์ ์ฌ์ฉ์ ID๊ฐ ์๋์ผ๋ก ํฌํจ๋ผ์. ๋ก๊ทธ ๋ถ์์ด ํจ์ฌ ์ฌ์์ง๊ฒ ์ฃ ? ๐
๐ Pro Tip: MDC๋ฅผ ์ฌ์ฉํ ๋๋ ๋ฐ๋์ clear() ๋ฉ์๋๋ฅผ ํธ์ถํด ์ฃผ์ธ์. ๊ทธ๋ ์ง ์์ผ๋ฉด ๋ค๋ฅธ ์์ฒญ์ ์ํฅ์ ์ค ์ ์์ด์!
9. ๋ก๊ทธ ๋ ๋ฒจ ํ์ธํ๊ธฐ ๐
๋ก๊ทธ๋ฅผ ๋จ๊ธฐ๊ธฐ ์ ์ ํด๋น ๋ ๋ฒจ์ด ํ์ฑํ๋์ด ์๋์ง ํ์ธํ๋ฉด ์ฑ๋ฅ์ ๋ ํฅ์์ํฌ ์ ์์ด์:
if (logger.isDebugEnabled()) {
logger.debug("์ด ๋ฉ์์ง๋ ๋ณต์กํ ์ฐ์ฐ์ด ํ์ํด์: {}", expensiveOperation());
}
์ด๋ ๊ฒ ํ๋ฉด DEBUG ๋ ๋ฒจ์ด ๋นํ์ฑํ๋์ด ์์ ๋ ๋ถํ์ํ ์ฐ์ฐ์ ํผํ ์ ์์ด์.
์, ์ฌ๊ธฐ๊น์ง๊ฐ SLF4J์ ๊ธฐ๋ณธ์ ์ธ ์ฌ์ฉ๋ฒ์ด์์. ์ด๋์? ์๊ฐ๋ณด๋ค ์ฝ์ฃ ? ใ ใ ใ
๋ค, ๊ณ์ํด์ SLF4J์ ๊ณ ๊ธ ์ฌ์ฉ๋ฒ์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค. ์ด์ ์ฌ๋ฌ๋ถ์ SLF4J์ ๊ธฐ๋ณธ์ ๋ง์คํฐํ์ผ๋, ๋ ๊น์ด ๋ค์ด๊ฐ ๋ณผ ์ฐจ๋ก์์! ๐
10. ๋ก๊ฑฐ ์ด๋ฆ ๊ณ์ธต ๊ตฌ์กฐ ํ์ฉํ๊ธฐ ๐ณ
SLF4J์ ๋ก๊ฑฐ๋ ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์์ด์. ์ด๋ฅผ ์ ํ์ฉํ๋ฉด ๋ก๊ทธ ๊ด๋ฆฌ๊ฐ ํจ์ฌ ์ฌ์์ง๋๋ค:
Logger rootLogger = LoggerFactory.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME);
Logger appLogger = LoggerFactory.getLogger("com.myapp");
Logger moduleLogger = LoggerFactory.getLogger("com.myapp.module");
์ด๋ ๊ฒ ํ๋ฉด 'com.myapp.module'์ ๋ก๊ทธ ๋ ๋ฒจ์ ๋ฐ๋ก ์ค์ ํ ์ ์๊ณ , ๊ทธ ์์ ๋ก๊ฑฐ์ ์ค์ ์ ์์๋ฐ์ ์๋ ์์ด์.
11. ๋ก๊ทธ ํฌ๋งท ์ปค์คํฐ๋ง์ด์ง ๐จ
Logback์ ์ฌ์ฉํ๋ค๋ฉด, logback.xml ํ์ผ์์ ๋ก๊ทธ ํฌ๋งท์ ์์ ๋กญ๊ฒ ์ปค์คํฐ๋ง์ด์งํ ์ ์์ด์:
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
์ฌ๊ธฐ์ %d๋ ๋ ์ง, %thread๋ ์ค๋ ๋ ์ด๋ฆ, %-5level์ ๋ก๊ทธ ๋ ๋ฒจ, %logger{36}์ ๋ก๊ฑฐ ์ด๋ฆ(์ต๋ 36์), %msg๋ ์ค์ ๋ก๊ทธ ๋ฉ์์ง, %n์ ์ค๋ฐ๊ฟ์ ์๋ฏธํด์.
12. ๋ก๊ทธ ํ์ผ ๋กค๋ง ์ค์ ๐
๋ก๊ทธ ํ์ผ์ด ๋๋ฌด ์ปค์ง๋ ๊ฑธ ๋ฐฉ์งํ๊ธฐ ์ํด ํ์ผ ๋กค๋ง์ ์ค์ ํ ์ ์์ด์:
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/myapp.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logs/myapp.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
์ด ์ค์ ์ ๋งค์ผ ์๋ก์ด ๋ก๊ทธ ํ์ผ์ ์์ฑํ๊ณ , ์ต๋ 30์ผ์น์ ๋ก๊ทธ๋ฅผ ์ ์งํด์.
13. ์กฐ๊ฑด๋ถ ๋ก๊น ์ฒ๋ฆฌ ๐
ํน์ ์กฐ๊ฑด์ ๋ฐ๋ผ ๋ก๊ทธ๋ฅผ ๋ค๋ฅด๊ฒ ์ฒ๋ฆฌํ๊ณ ์ถ๋ค๋ฉด Logback์ ํํฐ๋ฅผ ์ฌ์ฉํ ์ ์์ด์:
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.core.filter.EvaluatorFilter">
<evaluator>
<expression>return message.contains("password");</expression>
</evaluator>
<OnMismatch>NEUTRAL</OnMismatch>
<OnMatch>DENY</OnMatch>
</filter>
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
์ด ์ค์ ์ "password"๋ผ๋ ๋จ์ด๊ฐ ํฌํจ๋ ๋ก๊ทธ ๋ฉ์์ง๋ฅผ ํํฐ๋งํด์ ์ถ๋ ฅํ์ง ์์์. ๋ณด์์ ๋์์ด ๋๊ฒ ์ฃ ? ๐
14. ๋น๋๊ธฐ ๋ก๊น ์ค์ โก
๋ก๊น ์ผ๋ก ์ธํ ์ฑ๋ฅ ์ ํ๋ฅผ ์ต์ํํ๊ณ ์ถ๋ค๋ฉด ๋น๋๊ธฐ ๋ก๊น ์ ์ฌ์ฉํด๋ณด์ธ์:
<appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="FILE" />
<queueSize>512</queueSize>
<discardingThreshold>0</discardingThreshold>
</appender>
<root level="info">
<appender-ref ref="ASYNC" />
</root>
์ด ์ค์ ์ ๋ก๊ทธ ๋ฉ์์ง๋ฅผ ๋น๋๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌํด์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฃผ ์ค๋ ๋๊ฐ ๋ธ๋กํน๋์ง ์๋๋ก ํด์ค์.
15. ๋ก๊ทธ ๋ ๋ฒจ ๋์ ๋ณ๊ฒฝ ๐ง
์ ํ๋ฆฌ์ผ์ด์ ์คํ ์ค์ ๋ก๊ทธ ๋ ๋ฒจ์ ๋์ ์ผ๋ก ๋ณ๊ฒฝํ๊ณ ์ถ๋ค๋ฉด JMX๋ฅผ ํ์ฉํ ์ ์์ด์. Logback ์ค์ ์ ๋ค์์ ์ถ๊ฐํ์ธ์:
<jmxConfigurator />
์ด์ JConsole ๊ฐ์ JMX ํด๋ผ์ด์ธํธ๋ฅผ ์ฌ์ฉํด ๋ฐํ์์ ๋ก๊ทธ ๋ ๋ฒจ์ ๋ณ๊ฒฝํ ์ ์์ด์. ์ด์ ์ค์ธ ์์คํ ์ ๋ก๊ทธ ๋ ๋ฒจ์ ์กฐ์ ํ ๋ ์ ์ฉํ์ฃ !
16. ๋ก๊ทธ ์์ถ ์ค์ ๐๏ธ
์ค๋๋ ๋ก๊ทธ ํ์ผ์ ์๋์ผ๋ก ์์ถํ๊ณ ์ถ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ค์ ํ ์ ์์ด์:
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/myapp.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logs/myapp.%d{yyyy-MM-dd}.log.gz</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
์ด ์ค์ ์ ๋งค์ผ ์๋ก์ด ๋ก๊ทธ ํ์ผ์ ์์ฑํ๊ณ , ์ค๋๋ ๋ก๊ทธ ํ์ผ์ gzip ํ์์ผ๋ก ์์ถํด์. ๋์คํฌ ๊ณต๊ฐ์ ์ ์ฝํ ์ ์์ฃ ! ๐พ
๐ก Pro Tip: ๋ก๊ทธ ํ์ผ ์์ถ์ ๋์คํฌ ๊ณต๊ฐ์ ์ ์ฝํ ์ ์์ง๋ง, CPU ์ฌ์ฉ๋์ด ์ฆ๊ฐํ ์ ์์ด์. ์๋ฒ ๋ฆฌ์์ค ์ํฉ์ ๊ณ ๋ คํด์ ์ฌ์ฉํ์ธ์!
์, ์ฌ๊ธฐ๊น์ง๊ฐ SLF4J์ Logback์ ํ์ฉํ ๊ณ ๊ธ ๋ก๊น ๊ธฐ๋ฒ์ด์์. ์ด๋ ์ ๊ฐ์? ์ด์ ์ฌ๋ฌ๋ถ์ ๋ก๊น ์ ์ง์ ํ ๊ณ ์๊ฐ ๋ ๊ฒ ๊ฐ์์! ๐จโ๐๐ฉโ๐
์ด๋ฐ ๊ณ ๊ธ ๊ธฐ๋ฅ๋ค์ ์ ์ ํ ํ์ฉํ๋ฉด, ์ฌ๋ฌ๋ถ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋์ฑ ์์ ์ ์ด๊ณ ๊ด๋ฆฌํ๊ธฐ ์ฌ์์ง ๊ฑฐ์์. ๋ก๊ทธ๋ ๋จ์ํ ์๋ฌ๋ฅผ ์ฐพ๋ ๋๊ตฌ๊ฐ ์๋๋ผ, ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฑด๊ฐ ์ํ๋ฅผ ๋ชจ๋ํฐ๋งํ๊ณ ์ฑ๋ฅ์ ์ต์ ํํ๋ ๋ฐ ํฐ ๋์์ ์ฃผ๋ ๊ฐ๋ ฅํ ๋๊ตฌ๋๋๋ค. ๐
๋ก๊น ์ ์ธ๊ณ๋ ์ ๋ง ๊น๊ณ ๋์ด์. ์ฌ๋ฌ๋ถ์ด ๋ฐฐ์ด ์ด ์ง์๋ค์ ์ค์ ํ๋ก์ ํธ์ ์ ์ฉํด๋ณด๋ฉด์, ๋ ๋ง์ ๊ฒฝํ์ ์์๊ฐ์๊ธธ ๋ฐ๋๊ฒ์. ํ์ดํ ! ๐
๊ด๋ จ ํค์๋
๋๊ธ ์์ฑ
์ด ๊ธ์ ๋ํ ์ฌ๋ฌ๋ถ์ ์๊ฐ์ ๋ค๋ ค์ฃผ์ธ์
๋ก๊ทธ์ธ์ด ํ์ํฉ๋๋ค
๋๊ธ์ ์์ฑํ๋ ค๋ฉด ๋จผ์ ๋ก๊ทธ์ธํด์ฃผ์ธ์.
๋๊ธ 0
์ง์์ธ์ ์ฒ - ์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
- ์ ์๊ถ ๋ฐ ์์ ๊ถ: ๋ณธ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ๋ ์ AI ๊ธฐ์ ๋ก ์์ฑ๋์์ผ๋ฉฐ, ๋ํ๋ฏผ๊ตญ ์ ์๊ถ๋ฒ ๋ฐ ๊ตญ์ ์ ์๊ถ ํ์ฝ์ ์ํด ๋ณดํธ๋ฉ๋๋ค.
- AI ์์ฑ ์ปจํ ์ธ ์ ๋ฒ์ ์ง์: ๋ณธ AI ์์ฑ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ์ง์ ์ฐฝ์๋ฌผ๋ก ์ธ์ ๋๋ฉฐ, ๊ด๋ จ ๋ฒ๊ท์ ๋ฐ๋ผ ์ ์๊ถ ๋ณดํธ๋ฅผ ๋ฐ์ต๋๋ค.
- ์ฌ์ฉ ์ ํ: ์ฌ๋ฅ๋ท์ ๋ช ์์ ์๋ฉด ๋์ ์์ด ๋ณธ ์ปจํ ์ธ ๋ฅผ ๋ณต์ , ์์ , ๋ฐฐํฌ, ๋๋ ์์ ์ ์ผ๋ก ํ์ฉํ๋ ํ์๋ ์๊ฒฉํ ๊ธ์ง๋ฉ๋๋ค.
- ๋ฐ์ดํฐ ์์ง ๊ธ์ง: ๋ณธ ์ปจํ ์ธ ์ ๋ํ ๋ฌด๋จ ์คํฌ๋ํ, ํฌ๋กค๋ง, ๋ฐ ์๋ํ๋ ๋ฐ์ดํฐ ์์ง์ ๋ฒ์ ์ ์ฌ์ ๋์์ด ๋ฉ๋๋ค.
- AI ํ์ต ์ ํ: ์ฌ๋ฅ๋ท์ AI ์์ฑ ์ปจํ ์ธ ๋ฅผ ํ AI ๋ชจ๋ธ ํ์ต์ ๋ฌด๋จ ์ฌ์ฉํ๋ ํ์๋ ๊ธ์ง๋๋ฉฐ, ์ด๋ ์ง์ ์ฌ์ฐ๊ถ ์นจํด๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
์์ง ๋๊ธ์ด ์์ต๋๋ค.