์ฝ˜ํ…์ธ  ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ - ๐ŸŒณ ๋กœ๊น… ํ”„๋ ˆ์ž„์›Œํฌ: 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
๋Œ“๊ธ€์„ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ค‘์ž…๋‹ˆ๋‹ค.

์•„์ง ๋Œ“๊ธ€์ด ์—†์Šต๋‹ˆ๋‹ค.