2.1 ์ฒซ ๋ฒˆ์งธ ๋กœ๊ฑฐ - log4j

์ด๋ฏธ ์•Œ๊ณ  ์žˆ๋“ฏ์ด ๋กœ๊ทธ์˜ ํžˆ์Šคํ† ๋ฆฌ๋Š” System.err.println()๋ ˆ์ฝ”๋“œ๋ฅผ ์ฝ˜์†”์— ์ถœ๋ ฅํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์‹œ์ž‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Intellij IDEA๋Š” ์ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ˜์†”์— ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜์ด ์˜ต์…˜์—๋Š” ์„ค์ •์ด ์—†์œผ๋ฏ€๋กœ ๊ณ„์† ์ง„ํ–‰ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์ตœ์ดˆ์ด์ž ๊ฐ€์žฅ ์ธ๊ธฐ ์žˆ๋Š” ๋กœ๊ฑฐ๋Š” Log4j. ํ›Œ๋ฅญํ•˜๊ณ  ๊ณ ๋„๋กœ ์‚ฌ์šฉ์ž ์ •์˜ ๊ฐ€๋Šฅํ•œ ์†”๋ฃจ์…˜์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ ์ƒํ™ฉ์œผ๋กœ ์ธํ•ด ์ด ๊ฒฐ์ •์€ JDK์— ์ „๋‹ฌ๋˜์ง€ ์•Š์•˜๊ณ  ์ „์ฒด ์ปค๋ฎค๋‹ˆํ‹ฐ๋ฅผ ํฌ๊ฒŒ ํ™”๋‚˜๊ฒŒ ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด ๋กœ๊ฑฐ๋Š” ๋‹จ์ˆœํžˆ ๋กœ๊น…๋งŒ ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋ฅผ ์œ„ํ•ด ๋งŒ๋“ค์–ด์„œ ๋กœ๊น…๊ณผ ๊ด€๋ จํ•˜์—ฌ ๋Š์ž„์—†์ด ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฏธ ์•Œ๊ณ  ์žˆ๋“ฏ์ด ๋กœ๊ทธ๋Š” ๋งˆ์ง€๋ง‰์— ์ž‘์„ฑ๋˜๋ฏ€๋กœ ์–ด๋–ค ์‚ฌ๋žŒ์ด ๋กœ๊ทธ๋ฅผ ์ฝ๊ณ  ํ”„๋กœ๊ทธ๋žจ ์ž‘๋™ ์ค‘์— ๋ฐœ์ƒํ•œ ์ผ(์˜ˆ์ƒํ•œ ๋Œ€๋กœ ๋ฌด์—‡์ด ์–ธ์ œ ์ž˜๋ชป๋˜์—ˆ๋Š”์ง€)์„ ์ดํ•ดํ•˜๋ ค๊ณ  ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค.

log4j์ด๋ฅผ ์œ„ํ•ด ์„ธ ๊ฐ€์ง€๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค .

  • ์„œ๋ธŒํŒจํ‚ค์ง€ ๋กœ๊น…;
  • ์–ดํŽœ๋” ์„ธํŠธ(๊ฒฐ๊ณผ);
  • ํ•ซ ๋ฆฌ๋กœ๋“œ ์„ค์ •.

log4j์ฒซ์งธ, ํ•œ ํŒจํ‚ค์ง€์—์„œ๋Š” ๋กœ๊ทธ์ธ์„ ํ™œ์„ฑํ™”ํ•˜๊ณ  ๋‹ค๋ฅธ ํŒจํ‚ค์ง€์—์„œ๋Š” ๋น„ํ™œ์„ฑํ™”ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์„ค์ •์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. com.codegym.server์˜ˆ๋ฅผ ๋“ค์–ด ์—์„œ๋Š” ๋กœ๊ทธ์ธ์„ ํ™œ์„ฑํ™” ํ•˜๊ณ  ์—์„œ๋Š” ๋น„ํ™œ์„ฑํ™” ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค com.codegym.server.payment. ์ด๋ฅผ ํ†ตํ•ด ๋กœ๊ทธ์—์„œ ๋ถˆํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ๋น ๋ฅด๊ฒŒ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๋‘˜์งธ, log4jํ•œ ๋ฒˆ์— ์—ฌ๋Ÿฌ ๋กœ๊ทธ ํŒŒ์ผ์— ๋กœ๊น… ๊ฒฐ๊ณผ๋ฅผ ์“ธ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐ๊ฐ์— ๋Œ€ํ•œ ์ถœ๋ ฅ์„ ๊ฐœ๋ณ„์ ์œผ๋กœ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํ•œ ํŒŒ์ผ์—๋Š” ์‹ฌ๊ฐํ•œ ์˜ค๋ฅ˜์— ๋Œ€ํ•œ ์ •๋ณด๋งŒ ๊ธฐ๋กํ•  ์ˆ˜ ์žˆ์—ˆ๊ณ , ๋‹ค๋ฅธ ํŒŒ์ผ์—๋Š” ํŠน์ • ๋ชจ๋“ˆ์˜ ๋กœ๊ทธ, ์„ธ ๋ฒˆ์งธ ํŒŒ์ผ์—๋Š” ํŠน์ • ์‹œ๊ฐ„ ๋™์•ˆ์˜ ๋กœ๊ทธ๋ฅผ ๊ธฐ๋กํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๊ฐ ๋กœ๊ทธ ํŒŒ์ผ์€ ํŠน์ • ์œ ํ˜•์˜ ์˜ˆ์ƒ ๋ฌธ์ œ์— ๋งž๊ฒŒ ์กฐ์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ธฐ๊ฐ€๋ฐ”์ดํŠธ ๋กœ๊ทธ ํŒŒ์ผ์„ ์ˆ˜๋™์œผ๋กœ ์‚ดํŽด๋ณด๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•˜์ง€ ์•Š๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ์˜ ์‚ถ์„ ํฌ๊ฒŒ ๋‹จ์ˆœํ™”ํ•ฉ๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ ์„ธ ๋ฒˆ์งธ๋กœ log4jํ”„๋กœ๊ทธ๋žจ์„ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜์ง€ ์•Š๊ณ ๋„ ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜๋Š” ๋™์•ˆ ๋กœ๊ทธ ์„ค์ •์„ ์ง์ ‘ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํŠน์ • ์˜ค๋ฅ˜์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์ •๋ณด๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด ๋กœ๊ทธ ์ž‘์—…์„ ์ˆ˜์ •ํ•ด์•ผ ํ•  ๋•Œ ๋งค์šฐ ํŽธ๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.

์ค‘์š”ํ•œ! ๋กœ๊ทธ์—๋Š” 1.2.x์™€ 2.xx์˜ ๋‘ ๊ฐ€์ง€ ๋ฒ„์ „ log4j์ด ์žˆ์œผ๋ฉฐ ์„œ๋กœ ํ˜ธํ™˜ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค .

๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ๊ฑฐ๋ฅผ ํ”„๋กœ์ ํŠธ์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<dependencies>
  <dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.17.2</version>
  </dependency>
 
  <dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.17.2</version>
  </dependency>
</dependencies>

2.2 ์ตœ์ดˆ์˜ ๊ณต์‹ ๋กœ๊ฑฐ - 7์›”: java.util.logging

Java ์ปค๋ฎค๋‹ˆํ‹ฐ์— ๋กœ๊ฑฐ ๋™๋ฌผ์›์ด ๋“ฑ์žฅํ•œ ํ›„ ๊ฐœ๋ฐœ์ž๋Š” JDK๋ชจ๋‘๊ฐ€ ์‚ฌ์šฉํ•  ํ•˜๋‚˜์˜ ํ‘œ์ค€ ๋กœ๊ฑฐ๋ฅผ ๋งŒ๋“ค๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ๋กœ๊ฑฐ๊ฐ€ ๋‚˜ํƒ€๋‚œ ๋ฐฉ์‹ ์ž…๋‹ˆ๋‹ค JUL.java.util.logging

log4j๊ทธ๋Ÿฌ๋‚˜ ๊ฐœ๋ฐœ ๊ณผ์ •์—์„œ ๋กœ๊ฑฐ ์ž‘์„ฑ์ž๋Š” ๊ฐ€ ์•„๋‹ˆ๋ผ ๊ฐœ๋ฐœ์— ์˜ํ–ฅ์„ ์ค€ IBM์˜ ๋กœ๊ฑฐ ๋ณ€ํ˜•์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค . ์ข‹์€ ์†Œ์‹์€ ๋กœ๊ฑฐ๊ฐ€ JULํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค JDK. ๋‚˜์œ ์†Œ์‹์€ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ์ด ๊ฑฐ์˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

7์›”

๊ฐœ๋ฐœ์ž๋Š” "๋˜ ๋‹ค๋ฅธ ๋ณดํŽธ์ ์ธ ํ‘œ์ค€"์„JUL ๋งŒ๋“ค์—ˆ์„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋‹น์‹œ ์ธ๊ธฐ ์žˆ๋Š” ๋กœ๊ฑฐ๊ฐ€ ํ—ˆ์šฉํ•œ ๊ฒƒ๊ณผ๋Š” ๋‹ค๋ฅธ ์ž์ฒด ๋กœ๊น… ์ˆ˜์ค€๋„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์€ ํฐ ๋ฌธ์ œ์˜€์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ ์ œํ’ˆ์€ Java์ข…์ข… ๋งŽ์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ˆ˜์ง‘๋˜๋ฉฐ ์ด๋Ÿฌํ•œ ๊ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—๋Š” ์ž์ฒด ๋กœ๊ฑฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์žˆ๋Š” ๋ชจ๋“  ๋กœ๊ฑฐ๋ฅผ ๊ตฌ์„ฑํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋กœ๊ฑฐ ์ž์ฒด๋Š” ๊ฝค ์ข‹์ง€๋งŒ. ๋กœ๊ฑฐ ์ƒ์„ฑ์€ ๊ฑฐ์˜ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ๊ฐ€์ ธ์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค.


java.util.logging.Logger log = java.util.logging.Logger.getLogger(LoggingJul.class.getName());

๋กœ๊น…์ด ์–ด๋””์„œ ์˜ค๋Š”์ง€ ์•Œ๊ธฐ ์œ„ํ•ด ํด๋ž˜์Šค ์ด๋ฆ„์ด ํŠน๋ณ„ํžˆ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.

๋ฆด๋ฆฌ์Šค์—์„œ๋งŒ ๊ฐœ๋ฐœ์ž๋Š” ์ค‘์š”ํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์œผ๋ฉฐ ๊ทธ ํ›„์—๋Š” JUL์‚ฌ์šฉํ•˜๊ธฐ๊ฐ€ ์ •๋ง ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์ „์—๋Š” ์ผ์ข…์˜ ์ด๋ฅ˜ ๋กœ๊ฑฐ์˜€์Šต๋‹ˆ๋‹ค.

์ด ๋กœ๊ฑฐ๋Š” ๋žŒ๋‹ค ์‹๊ณผ ์ง€์—ฐ ํ‰๊ฐ€๋„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๋กœ ์‹œ์ž‘ํ•˜๋ฉด Java 8ํ†ต๊ณผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค Supplier<String>. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ด์ „๊ณผ ๊ฐ™์ด ๋งค๋ฒˆ์ด ์•„๋‹ˆ๋ผ ์‹ค์ œ๋กœ ํ•„์š”ํ•œ ์ˆœ๊ฐ„์—๋งŒ ๋ฌธ์ž์—ด์„ ์ฝ๊ณ  ์ƒ์„ฑํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

์ธ์ˆ˜๊ฐ€ ์žˆ๋Š” ๋ฉ”์„œ๋“œ๋Š” Supplier<String> msgSupplier๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

public void info(Supplier msgSupplier) {
   log(Level.INFO, msgSupplier);
}

2.3 ์ฒซ ๋ฒˆ์งธ ๋กœ๊ฑฐ ๋ž˜ํผ - JCL: jakarta commons ๋กœ๊น…

์˜ค๋žซ๋™์•ˆ ๋กœ๊ฑฐ๋“ค ์‚ฌ์ด์— ๋‹จ์ผ ํ‘œ์ค€์ด ์—†์—ˆ๊ณ  JULํ•˜๋‚˜๊ฐ€ ๋˜์–ด์•ผ ํ–ˆ์ง€๋งŒ ๋” ๋‚˜๋นด์Šต๋‹ˆ๋‹ค log4j. ๊ทธ๋ž˜์„œ ๋‹จ์ผ ํ‘œ์ค€์€ ๋‚˜ํƒ€๋‚˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ฐ๊ฐ ๋™์ผ ํ•ด์ง€๊ณ  ์‹ถ์–ดํ•˜๋Š” ๋กœ๊ฑฐ ๋™๋ฌผ์› ์ „์ฒด๊ฐ€ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค.

์ œ์ด์”จ์—˜

๊ทธ๋Ÿฌ๋‚˜ ์ผ๋ฐ˜ Java ๊ฐœ๋ฐœ์ž๋Š” ๊ฑฐ์˜ ๋ชจ๋“  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์ž์ฒด ๋กœ๊ฑฐ๊ฐ€ ์žˆ๊ณ  ํŠน๋ณ„ํ•œ ๋ฐฉ์‹์œผ๋กœ ๊ตฌ์„ฑํ•ด์•ผ ํ•˜๋Š” ์ ์„ ์ข‹์•„ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ปค๋ฎค๋‹ˆํ‹ฐ๋Š” ๋‹ค๋ฅธ ๋กœ๊ฑฐ ์œ„์— ํŠน์ˆ˜ ๋ž˜ํผ๋ฅผ ๋งŒ๋“ค๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.JCL: jakarta commons logging

๊ทธ๋ฆฌ๊ณ  ๋‹ค์‹œ, ๋ฆฌ๋”๊ฐ€ ๋˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ ํ”„๋กœ์ ํŠธ๋Š” ํ•˜๋‚˜๊ฐ€ ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์Šน์ž๋ฅผ ๋งŒ๋“ค ์ˆ˜๋Š” ์—†๊ณ  ์Šน์ž๊ฐ€ ๋  ์ˆ˜๋งŒ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋Šฅ์ด JCL๋งค์šฐ ์—ด์•…ํ–ˆ๊ณ  ์•„๋ฌด๋„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์–ดํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. JUL๋ชจ๋“  ๋กœ๊ฑฐ๋ฅผ ๋Œ€์ฒดํ•˜๋„๋ก ์„ค๊ณ„๋œ ๋กœ๊ฑฐ๋Š” ์‚ฌ์šฉ๋˜์ง€ ์•Š์€ ๊ฒƒ๊ณผ ๊ฐ™์€ ์šด๋ช…์„ ๋งž์ดํ–ˆ์Šต๋‹ˆ๋‹ค .

Apache ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ์ถœ์‹œํ•œ ๋งŽ์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์ถ”๊ฐ€๋˜์—ˆ์ง€๋งŒ ๋กœ๊ฑฐ์˜ ๋™๋ฌผ์›์€ ์„ฑ์žฅํ–ˆ์Šต๋‹ˆ๋‹ค.

2.4 ์ฒซ ๋ฒˆ์งธ ๋งˆ์ง€๋ง‰ ๋กœ๊ฑฐ - ๋กœ๊ทธ๋ฐฑ

ํ•˜์ง€๋งŒ ๊ทธ๊ฒŒ ๋‹ค๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” log4j์ž์‹ ์ด ๊ฐ€์žฅ ๋˜‘๋˜‘ํ•˜๋‹ค๊ณ  ํŒ๋‹จํ•˜๊ณ (๊ฒฐ๊ตญ ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์ด ๊ทธ์˜ ๋กœ๊ฑฐ๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค) log4j๋‹ค๋ฅธ ๋กœ๊ฑฐ์˜ ์žฅ์ ์„ ๊ฒฐํ•ฉํ•œ ์ƒˆ๋กœ์šด ๊ฐœ์„ ๋œ ๋กœ๊ฑฐ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ƒˆ ๋กœ๊ฑฐ๋Š” Logback. ๋ชจ๋‘๊ฐ€ ์‚ฌ์šฉํ•  ๋ฏธ๋ž˜์˜ ๋‹จ์ผ ๋กœ๊ฑฐ๊ฐ€ ๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋˜๋Š” ๊ฒƒ์€ ๋ฐ”๋กœ ์ด ๋กœ๊ฑฐ์˜€์Šต๋‹ˆ๋‹ค. ์—์„œ์™€ ๋™์ผํ•œ ์•„์ด๋””์–ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค log4j.

๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด ๋กœ๊ฑฐ๋ฅผ ํ”„๋กœ์ ํŠธ์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.6</version>
</dependency>

์ฐจ์ด์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค Logback.

  • ํ–ฅ์ƒ๋œ ์„ฑ๋Šฅ;
  • ๊ธฐ๋ณธ ์ง€์› ์ถ”๊ฐ€ slf4j;
  • ํ™•์žฅ๋œ ํ•„ํ„ฐ๋ง ์˜ต์…˜.

์ด ๋กœ๊ฑฐ์˜ ๋˜ ๋‹ค๋ฅธ ์žฅ์ ์€ ๋งค์šฐ ์ข‹์€ ๊ธฐ๋ณธ ์„ค์ •์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋กœ๊ฑฐ์—์„œ ๋ฌด์–ธ๊ฐ€๋ฅผ ๋ณ€๊ฒฝํ•˜๋ ค๋Š” ๊ฒฝ์šฐ์—๋งŒ ๋กœ๊ฑฐ๋ฅผ ๊ตฌ์„ฑํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์„ค์ • ํŒŒ์ผ์€ ๊ธฐ์—… ์†Œํ”„ํŠธ์›จ์–ด์— ๋” ์ž˜ ์ ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ตฌ์„ฑ์ด xml/.

๊ธฐ๋ณธ์ ์œผ๋กœ Logback์„ค์ •์ด ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ˆ˜์ค€ ์ด์ƒ์˜ ๋ชจ๋“  ๋กœ๊ทธ๋ฅผ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค DEBUG. ๋‹ค๋ฅธ ๋™์ž‘์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ xml๊ตฌ์„ฑ์„ ํ†ตํ•ด ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<configuration>
    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>app.log</file>
        <encoder>
            <pattern>%d{HH:mm:ss,SSS} %-5p [%c] - %m%n</pattern>
        </encoder>
    </appender>
    <logger name="org.hibernate.SQL" level="DEBUG" />
    <logger name="org.hibernate.type.descriptor.sql" level="TRACE" />
    <root level="info">
        <appender-ref ref="FILE" />
    </root>
</configuration>

2.5 ์ตœ์‹  ๋ฒ”์šฉ ๋กœ๊ฑฐ - SLF4J: Java์šฉ ๋‹จ์ˆœ ๋กœ๊น… ํŒŒ์‚ฌ๋“œ

ํ™ฉ๊ธˆ๋ฅ ์„ ์ฐพ๋Š”๋ฐ ์–ผ๋งˆ๋‚˜ ๊ฑธ๋ฆด๊นŒ์š”...

2006๋…„์— ์ œ์ž‘์ž ์ค‘ ํ•œ ๋ช…์ด log4jํ”„๋กœ์ ํŠธ๋ฅผ ๋– ๋‚˜ ๋ฒ”์šฉ ๋กœ๊ฑฐ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ๋‹ค์‹œ ์‹œ๋„ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋ฒˆ์—๋Š” ์ƒˆ๋กœ์šด ๋กœ๊ฑฐ๊ฐ€ ์•„๋‹ˆ๋ผ ์„œ๋กœ ๋‹ค๋ฅธ ๋กœ๊ฑฐ๊ฐ€ ํ•จ๊ป˜ ์ƒํ˜ธ ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ์ƒˆ๋กœ์šด ๋ฒ”์šฉ ํ‘œ์ค€(๋ž˜ํผ)์ด์—ˆ์Šต๋‹ˆ๋‹ค.

์ด ๋กœ๊ฑฐ๋Š” , , ๋ฅผ slf4j โ€” Simple Logging Facade for Java๋‘˜๋Ÿฌ์‹ผ ๋ž˜ํผ์˜€์Šต๋‹ˆ๋‹ค . ์ด ๋กœ๊ฑฐ๋Š” ๋กœ๊ฑฐ ๋™๋ฌผ์›์„ ๊ด€๋ฆฌํ•˜๋Š” ์‹ค์ œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์—ฌ ๋ชจ๋‘๊ฐ€ ์ฆ‰์‹œ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.log4jJULcommon-loggins and logback

์šฐ๋ฆฌ๋Š” ์Šค์Šค๋กœ ๋งŒ๋“  ๋ฌธ์ œ๋ฅผ ์˜์›…์ ์œผ๋กœ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ๋ณด์‹œ๋‹ค์‹œํ”ผ ๋ž˜ํผ ์œ„์— ๋ž˜ํผ๋ฅผ ์ƒ์„ฑํ•œ ์ง€์ ๊นŒ์ง€ ์ง„ํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค...

๋žฉ ์ž์ฒด๋Š” ๋‘ ๋ถ€๋ถ„์œผ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

  • API, ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ๊ฐ ๋กœ๊ฑฐ์— ๋Œ€ํ•ด ๋ณ„๋„์˜ ์ข…์†์„ฑ์œผ๋กœ ์ถ”๊ฐ€๋˜๋Š” ๊ตฌํ˜„์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ๊ฑฐ๋ฅผ ํ”„๋กœ์ ํŠธ์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.17.2</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.17.2</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-slf4j-impl</artifactId>
    <version>2.17.2</version>
</dependency>

์˜ฌ๋ฐ”๋ฅธ ๊ตฌํ˜„์„ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ถฉ๋ถ„ํ•˜๋ฉฐ ๊ทธ๊ฒŒ ์ „๋ถ€์ž…๋‹ˆ๋‹ค. ์ „์ฒด ํ”„๋กœ์ ํŠธ๊ฐ€ ํ•จ๊ป˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

2.6 slf4j์˜ ์ตœ์ ํ™”

Slf4j๋กœ๊น…์„ ์œ„ํ•œ ๋ฌธ์ž์—ด ํ˜•์‹ ๊ณผ ๊ฐ™์€ ๋ชจ๋“  ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค . ๊ทธ ์ „์— ์ด๋Ÿฐ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋กœ๊ทธ์— ๋ฉ”์‹œ์ง€๋ฅผ ์ธ์‡„ํ•˜๊ณ  ์‹ถ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

log.debug("User " + user + " connected from " + request.getRemoteAddr());

์ด ์ฝ”๋“œ์— ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด ์ž‘๋™ํ•˜๊ณ  production๋กœ๊ทธ์— ์•„๋ฌด๊ฒƒ๋„ ์“ฐ์ง€ ์•Š๋Š”๋‹ค๊ณ  ๊ฐ€์ • DEBUG-messagesํ•˜์ง€๋งŒ ๋ฉ”์„œ๋“œ๋Š” log.debug()๊ณ„์† ํ˜ธ์ถœ๋˜๋ฉฐ ํ˜ธ์ถœ ์‹œ ๋‹ค์Œ ๋ฉ”์„œ๋“œ๋„ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

  • user.toString();
  • request.getRemoteAddr();

์ด๋Ÿฌํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์†๋„๊ฐ€ ๋Š๋ ค์ง‘๋‹ˆ๋‹ค. ํ•ด๋‹น ํ˜ธ์ถœ์€ ๋””๋ฒ„๊น… ์ค‘์—๋งŒ ํ•„์š”ํ•˜์ง€๋งŒ ์–ด์จŒ๋“  ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

๋…ผ๋ฆฌ์˜ ๊ด€์ ์—์„œ ์ด ๋ฌธ์ œ๋Š” ๋กœ๊น… ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž์ฒด์—์„œ ํ•ด๊ฒฐํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  log4j์˜ ์ฒซ ๋ฒˆ์งธ ๋ฒ„์ „์—์„œ ์†”๋ฃจ์…˜์ด ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค.

if (log.isDebugEnabled()) {
    log.debug("User " + user + " connected from " + request.getRemoteAddr());
}

๋กœ๊ทธ์— ๋Œ€ํ•œ ํ•œ ์ค„ ๋Œ€์‹  ์ด์ œ ์„ธ ์ค„์„ ์ž‘์„ฑํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์„ ๊ทน์ ์œผ๋กœ ์•…ํ™”์‹œํ‚ค๊ณ  log4j.

๋กœ๊ฑฐ๋Š” slf4j์Šค๋งˆํŠธ ๋กœ๊น…์„ ์ œ๊ณตํ•˜์—ฌ ์ƒํ™ฉ์„ ์•ฝ๊ฐ„ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค.

log.debug("User {} connected from {}", user, request.getRemoteAddr());

์—ฌ๊ธฐ์„œ ๋Š” {}๋ฉ”์„œ๋“œ์— ์ „๋‹ฌ๋œ ์ธ์ˆ˜์˜ ์‚ฝ์ž…์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ฆ‰, ์ฒซ ๋ฒˆ์งธ๋Š” {}์‚ฌ์šฉ์ž์— ํ•ด๋‹นํ•˜๊ณ  ๋‘ ๋ฒˆ์งธ๋Š” {}์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค request.getRemoteAddr().

์ด๋Ÿฌํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๋กœ๊น… ์ˆ˜์ค€์ด ๋กœ๊น…์„ ํ—ˆ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ๋‹จ์ผ ๋ฉ”์‹œ์ง€๋กœ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค. ์™„๋ฒฝํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ๋‹ค๋ฅธ ๋ชจ๋“  ์˜ต์…˜๋ณด๋‹ค ๋‚ซ์Šต๋‹ˆ๋‹ค.

๊ทธ ํ›„ SLF4J์ธ๊ธฐ๊ฐ€ ๊ธ‰๊ฒฉํžˆ ๋†’์•„์ง€๊ธฐ ์‹œ์ž‘ํ–ˆ์œผ๋ฉฐ ํ˜„์žฌ ์ด๊ฒƒ์ด ์ตœ์ƒ์˜ ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋ฒˆ๋“ค์„ ์˜ˆ๋กœ ๋“ค์–ด ๋กœ๊น…์„ ๊ณ ๋ คํ•ด ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค slf4j-log4j12.