λ‘œκΉ…


λ‘œκΉ…μ΄λž€?

ν”„λ‘œκ·Έλž¨ λ™μž‘ μ‹œ λ°œμƒν•˜λŠ” λͺ¨λ“  일을 κΈ°λ‘ν•˜λŠ” ν–‰μœ„λ₯Ό λ§ν•œλ‹€.

μ—¬κΈ°μ„œ μ΄μ•ΌκΈ°ν•˜λŠ” λͺ¨λ“  일은 μ„œλΉ„μŠ€μ˜ λ™μž‘ μƒνƒœλ‚˜ μž₯μ•  등을 생각할 수 μžˆλ‹€.

μ„œλΉ„μŠ€μ˜ λ™μž‘ μƒνƒœλΌ ν•œλ‹€λ©΄, μ‹œμŠ€ν…œ λ‘œλ”©, HTTP 톡신, νŠΈλžœμž­μ…˜, DB μš”μ²­, μ˜λ„ν•œ μ˜ˆμ™Έ 등이 있고, μž₯애라 ν•œλ‹€λ©΄ μ˜λ„ν•˜μ§€ μ•Šμ€ μ˜ˆμ™Έ 정도가 μžˆλ‹€.

λ‘œκΉ…κ³Ό System.out.println()

코딩을 ν•˜λ©΄μ„œ System.out.println() 많이 찍어봀을 것이닀. 이것도 μΌμ’…μ˜ 기둝이라고 생각해볼 수 μžˆμ„ 것 같은데 이 λ‘˜μ€ μ–΄λ–€ 차이가 μžˆμ„κΉŒ?

λ‘œκΉ…μ€ 좜λ ₯ ν˜•μ‹μ„ 지정할 수 있고, 둜그 λ ˆλ²¨μ— 따라 남기고 싢은 둜그λ₯Ό 별도 지정할 수 있으며, μ½˜μ†”, 파일, λ„€νŠΈμ›Œν¬ λ“± 둜그λ₯Ό λ³„λ„μ˜ μœ„μΉ˜μ— 남길 수 μžˆλ‹€.

λ‘œκΉ…κ³Ό 디버깅

λ‘œκΉ…μ„ 톡해 κΈ°λ‘ν•˜λŠ” λ‹€μ–‘ν•œ μ΄μœ κ°€ μžˆκ² μ§€λ§Œ, κ·Έ μ€‘μ—μ„œλ„ λ¬Έμ œμ μ„ νŒŒμ•…ν•˜λŠ” 역할도 λΆ„λͺ… μˆ˜ν–‰ν•  것이닀.

κ°œλ°œκ³Όμ •μ€‘μ—” λ””λ²„κΉ…μ΄λΌλŠ” 과정이 μ‘΄μž¬ν•˜λŠ”λ° μ™œ λ‘œκΉ…μ΄ ν•„μš”ν• κΉŒ?

사싀 디버깅을 μ‚¬μš©ν•  수 μžˆλ‹€λ©΄ 디버깅을 μ΅œλŒ€ν•œ ν™œμš©ν•˜λŠ” 것이 νš¨κ³Όμ μ΄λ‹€. 사전에 문제λ₯Ό 차단할 수 있기 λ•Œλ¬Έμ΄λ‹€.

ν•˜μ§€λ§Œ 디버깅을 ν•  수 μ—†λŠ” μƒν™©μ—μ„œλŠ” 기둝을 톡해 λ¬Έμ œμ μ„ νŒŒμ•…ν•˜μ—¬ 좔후에 κ°œμ„ ν•˜λŠ” λ°©ν–₯을 도λͺ¨ν•΄μ•Όν•˜κΈ° λ•Œλ¬Έμ— λ‘œκΉ…μ΄ μ΅œμ„ μ˜ 선택이 λ˜λŠ” 것이닀.

Logback


Logback μ΄λž€?

Logback μ΄λž€ Log4J λ₯Ό 기반으둜 개발된 SLF4J 의 κ΅¬ν˜„μ²΄, λ‘œκΉ… λΌμ΄λΈŒλŸ¬λ¦¬λ‹€.

Log4J 에 λΉ„ν•΄ μ•½ 10λ°° 정도 λΉ λ₯Έ 퍼포먼슀λ₯Ό 보여주며, λ©”λͺ¨λ¦¬ 효율이 훨씬 μ’‹μ•„μ‘Œλ‹€.

μ΄λŸ¬ν•œ νŠΉμ„± λ•Œλ¬Έμ— Spring μ—μ„œλ„ SLF4J 와 Logback 을 μ±„νƒν•˜κ³  μžˆλ‹€.

Logback νŠΉμ§•

Logback 은 λ‘œκ·Έμ— νŠΉμ • λ ˆλ²¨μ„ μ„€μ •ν•  수 μžˆλŠ”λ°, μ‹€μš΄μ˜κ³Ό ν…ŒμŠ€νŠΈ μƒν™©μ—μ„œ 각각 λ‹€λ₯Έ 좜λ ₯ λ ˆλ²¨μ„ μ„€μ •ν•˜μ—¬ 둜그λ₯Ό 확인할 수 μžˆλ‹€.

특히 ν…ŒμŠ€νŠΈμ—μ„œ μ‚¬μš©ν•  경우 μžμ„Έν•œ λ‚΄μš©μ„ νŒŒμ•…ν•΄μ„œ κ°œλ°œμ„ μˆ˜μ • 보완해야 ν•˜κΈ° λ•Œλ¬Έμ— Debug λ ˆλ²¨μ„ 자주 μ‚¬μš©ν•œλ‹€.

λ˜ν•œ, 좜λ ₯ 방식에 λŒ€ν•΄ μ„€μ •ν•  수 μžˆλ‹€. μ½˜μ†”, 파일, 메일, DB λ“± μ €μž₯ν•˜κ³ μž ν•˜λŠ” μœ„μΉ˜λ₯Ό μ§€μ •ν•˜μ—¬ 둜그 νŒŒμΌμ„ μ €μž₯ν•  수 μžˆλ‹€.

λ³„λ„μ˜ ν”„λ‘œκ·Έλž¨ 없이 자체적으둜 둜그 압좕을 μ§€μ›ν•˜λ©°, 둜그 보관 기간을 μ„€μ •ν•  수 μžˆλ‹€.

뿐만 μ•„λ‹ˆλΌ, μ„€μ • νŒŒμΌμ„ 일정 μ‹œκ°„λ§ˆλ‹€ μŠ€μΊ”ν•˜μ—¬ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 쀑단 없이 μ„€μ • λ³€κ²½ κ°€λŠ₯ν•˜λ‹€λŠ” μž₯점도 μ‘΄μž¬ν•œλ‹€.

둜그 레벨

λ‘œκΉ…μ—μ„  둜그 λ ˆλ²¨μ„ 톡해 남기고 싢은 둜그의 단계λ₯Ό 지정할 수 μžˆλ‹€.

μ΄λŠ” 크게 6κ°€μ§€λ‘œ 이루어져 있으며 μ‹€μ œλ‘œ ν”„λ‘œλ•μ…˜μ—μ„œ 많이 찾을 수 μžˆλŠ” λ ˆλ²¨μ€ Error Warn Info 정도가 μžˆλ‹€.

λ ˆλ²¨μ„€λͺ…
Fatal맀우 μ‹¬κ°ν•œ μ—λŸ¬. ν”„λ‘œκ·Έλž¨μ΄ μ’…λ£Œλ˜λŠ” κ²½μš°κ°€ 많음.
Errorμ˜λ„ν•˜μ§€ μ•Šμ€ μ—λŸ¬κ°€ λ°œμƒν•œ 경우. ν”„λ‘œκ·Έλž¨μ΄ μ’…λ£Œλ˜μ§„ μ•ŠμŒ.
Warnμ—λŸ¬κ°€ 될 수 μžˆλŠ” 잠재적 κ°€λŠ₯성이 μžˆλŠ” 경우.
Infoλͺ…ν™•ν•œ μ˜λ„κ°€ μžˆλŠ” μ—λŸ¬. μš”κ΅¬μ‚¬ν•­μ— 따라 μ‹œμŠ€ν…œ λ™μž‘μ„ 보여쀄 λ•Œ.
DebugInfo λ ˆλ²¨λ³΄λ‹€ 더 μžμ„Έν•œ 정보가 ν•„μš”ν•œ 경우. Dev ν™˜κ²½μ—μ„œ μ‚¬μš©.
TraceDebug λ ˆλ²¨λ³΄λ‹€ 더 μžμ„Έν•¨. Dev ν™˜κ²½μ—μ„œ 버그λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ μ‚¬μš©.

Logback ꡬ쑰


logback-core

λ‹€λ₯Έ 두 λͺ¨λ“ˆμ„ μœ„ν•œ 기반 역할을 ν•˜λŠ” λͺ¨λ“ˆμ΄λ©°, Appender 와 Layout μΈν„°νŽ˜μ΄μŠ€κ°€ 이 λͺ¨λ“ˆμ— μ†ν•œλ‹€.

μœ„ 사진은 Appender 의 ꡬ쑰λ₯Ό λ„μ‹ν™”ν•œ 것이닀.

logback-classic

logback-core μ—μ„œ ν™•μž₯된 λͺ¨λ“ˆλ €λ‘œ logback-core 와 SLF4J API λ₯Ό 가지고 μžˆλ‹€.

Logger ν΄λž˜μŠ€κ°€ 이 λͺ¨λ“ˆμ— μ†ν•œλ‹€.

logback-access

Servlet Container 와 ν†΅ν•©λ˜μ–΄ HTTP μ—‘μ„ΈμŠ€μ— λŒ€ν•œ λ‘œκΉ… κΈ°λŠ₯을 μ œκ³΅ν•œλ‹€.

μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 레벨이 μ•„λ‹Œ μ»¨ν…Œμ΄λ„ˆ λ ˆλ²¨μ—μ„œ μ„€μΉ˜ λ˜μ–΄μ•Όν•œλ‹€.

Logback μ„€μ •


Logback μ„€μ • 파일 ν˜•μ‹

일반적으둜 Classpath 에 μžˆλŠ” logback μ„€μ • νŒŒμΌμ„ μ°Έμ‘°ν•˜κ²Œ λœλ‹€.

  • Java Legacy, Spring 같은 경우 logback.xml μ°Έμ‘°
  • Spring Boot 의 경우 logback-spring.xml μ°Έμ‘°

Logback μ„€μ • μš”μ†Œ

Logback 의 μ„€μ • μš”μ†ŒλŠ” 크게 3κ°€μ§€λ‘œ λΆ„λ₯˜λœλ‹€.

  • Logger μ–΄λ–»κ²Œ κΈ°λ‘ν• κΉŒ?
    • μ‹€μ œ λ‘œκΉ…μ„ μˆ˜ν–‰ν•˜λŠ” κ΅¬μ„±μš”μ†Œμ΄λ©°, 좜λ ₯ 레벨 쑰정이 κ°€λŠ₯ν•˜λ‹€.
  • Appender 어디에 κΈ°λ‘ν• κΉŒ?
    • 둜그 λ©”μ‹œμ§€κ°€ 좜λ ₯ν•  λŒ€μƒ κ²°μ •ν•œλ‹€.
  • Layout μ–΄λ–»κ²Œ 좜λ ₯ν• κΉŒ?
    • Encoder(Layout) λ‘œλ„ 뢈리며, Appender 에 ν¬ν•¨λœλ‹€.
    • μ‚¬μš©μžκ°€ μ§€μ •ν•œ ν˜•μ‹μœΌλ‘œ ν‘œν˜„λ  둜그 λ©”μ‹œμ§€λ₯Ό λ³€ν™˜ν•˜λŠ” 역할을 μˆ˜ν–‰ν•œλ‹€.

Appender

Log 의 ν˜•νƒœ 및 좜λ ₯ μœ„μΉ˜λ₯Ό μ„€μ •ν•˜κΈ° μœ„ν•œ μ˜μ—­μ΄λ‹€. Logback 은 총 5κ°€μ§€μ˜ Appender λ₯Ό μ§€μ›ν•˜λŠ”λ° μ΄λŠ” μ•„λž˜μ™€ κ°™λ‹€.

  • ConsoleAppender μ½˜μ†”μ— 둜그 좜λ ₯
  • FileAppender νŒŒμΌμ— 둜그 μ €μž₯
  • RollingFileAppender μ—¬λŸ¬ 개의 νŒŒμΌμ„ μˆœνšŒν•˜λ©° 둜그 μ €μž₯
  • SMTPAppender 둜그λ₯Ό λ©”μΌλ‘œ 보냄
  • DBAppender DB 에 둜그 μ €μž₯

Encoder

Appender 내에 ν¬ν•¨λ˜λŠ” ν•­λͺ©μ΄λ©°, pattern 을 μ‚¬μš©ν•˜μ—¬ μ›ν•˜λŠ” ν˜•μ‹μœΌλ‘œ 둜그λ₯Ό ν‘œν˜„ν•  수 μžˆλ‹€.

Root

μ„€μ •ν•œ Appender λ₯Ό μ°Έμ‘°ν•΄μ„œ 둜그 λ ˆλ²¨μ„ μ„€μ •ν•  수 있음

root λŠ” μ „μ—­ μ„€μ •, 지역 섀정을 ν•˜κΈ° μœ„ν•΄μ„  logger λ₯Ό μ‚¬μš©

Pattern

<pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%thread] %logger %msg%n</patern>
  • %Logger{length} Logger Name
  • %-5level 둜그 레벨, -5 λŠ” 좜λ ₯의 고정폭 κ°’
  • %msg 둜그 λ©”μ‹œμ§€ μ˜μ—­ (==%message)
  • {PID:-} ν”„λ‘œμ„ΈμŠ€ Id
  • %d 둜그 기둝 μ‹œκ°„
  • %p λ‘œκΉ… 레벨
  • %F λ‘œκΉ…μ΄ λ°œμƒν•œ ν”„λ‘œκ·Έλž¨ 파일λͺ…
  • %M λ‘œκΉ…μ΄ λ°œμƒν•œ λ©”μ„œλ“œμ˜ 이름
  • %I λ‘œκΉ…μ΄ λ°œμƒν•œ ν˜ΈμΆœμ§€μ˜ 정보
  • %L λ‘œκΉ…μ΄ λ°œμƒν•œ ν˜ΈμΆœμ§€μ˜ 라인 수
  • %thread ν˜„μž¬ Thread λͺ…
  • %t λ‘œκΉ…μ΄ λ°œμƒν•œ Thread λͺ…
  • %c λ‘œκΉ…μ΄ λ°œμƒν•œ μΉ΄ν…Œκ³ λ¦¬
  • %C λ‘œκΉ…μ΄ λ°œμƒν•œ 클래슀 λͺ…
  • %m 둜그 λ©”μ‹œμ§€
  • %n μ€„λ°”κΏˆ
  • %% % 좜λ ₯
  • %r μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜ μ‹€ν–‰ ν›„ λ‘œκΉ…μ΄ λ°œμƒν•œ μ‹œμ κΉŒμ§€μ˜ μ‹œκ°„

ν”„λ‘œμ νŠΈ 적용


μ™œ λ‘œκΉ…μ„ ν•΄μ•Όν• κΉŒ?

λ‘œκΉ…μ„ μ μš©ν•˜κΈ°μ— μ•žμ„œ λ‘œκΉ…μ„ μ™œ μ μš©ν•΄μ•Ό ν•˜λŠ”κ°€μ— λŒ€ν•œ μ˜λ…Όμ΄ ν•„μš”ν–ˆλ‹€.

λ‘œκΉ…μ€ 말 κ·ΈλŒ€λ‘œ 기둝을 λ‚¨κΈ°λŠ” ν–‰μœ„μ΄λ‹€. κ·Έλ ‡λ‹€λ©΄ μš°λ¦¬λŠ” 무엇을 이루어내기 μœ„ν•΄ 기둝을 ν•˜λŠ” κ²ƒμΌκΉŒ?

λ¨Όμ € κ°œλ°œμ€ μ²˜μŒλΆ€ν„° μ™„λ²½ν•  수 μ—†λ‹€λŠ” 것을 μΈμ •ν•˜λŠ” κ²ƒμ—μ„œ μ‹œμž‘ν•œλ‹€.

μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ°œλ°œν•˜κ³  λ°°ν¬ν•œ λ’€ μš΄μ˜ν•˜λŠ” κ³Όμ •μ—μ„œ 무엇을 더 κ°œμ„ ν•΄μ•Ό ν•  지 λ…Όμ˜ν•˜κΈ° μœ„ν•΄μ„  μš΄μ˜ν•˜λŠ” λ™μ•ˆμ˜ 기둝이 ν•„μš”ν•˜λ‹€.

이 λ•Œ μ‚¬μš©λ˜λŠ” 것이 μš΄μ˜ν•˜λ©° μŒ“μΈ μˆ˜λ§Žμ€ λ‘œκ·Έλ“€μ΄ 될 것이닀.

기둝된 λ‘œκ·Έλ“€μ„ ν† λŒ€λ‘œ μ„œλ²„λ₯Ό μ¦μ„€ν•˜κ±°λ‚˜ λ‘œμ§μ„ κ°œμ„ ν•˜λŠ” λ“± μΆ”ν›„ λ°©ν–₯성이 κ²°μ •λ˜λŠ” 것이닀.

μ–΄λ–€ 것을 둜그둜 λ‚¨κ²¨μ•Όν• κΉŒ?

ν”„λ‘œμ νŠΈμ— Logback 을 μ μš©ν•˜λ©΄μ„œ μ–΄λ–€ 뢀뢄에 둜그λ₯Ό λ‚¨κ²¨μ•Όν•˜λŠ”κ°€μ— λŒ€ν•΄ 많이 κ³ λ―Όν•˜κ²Œ λ˜μ—ˆλ‹€.

결둠적으둠 μ•„λž˜μ™€ 같은 것듀을 λ‘œκΉ…ν•˜κΈ°λ‘œ κ²°μ •ν–ˆλ‹€.

  • μš”μ²­κ³Ό 응닡에 λŒ€ν•œ λ‘œκΉ…
  • μ˜λ„ν•œ μ˜ˆμ™Έλ“€μ— λŒ€ν•œ λ‘œκΉ…
  • μ˜λ„ν•˜μ§€ μ•Šμ€ μ˜ˆμ™Έλ“€μ— λŒ€ν•œ λ‘œκΉ…

μš”μ²­κ³Ό 응닡에 λŒ€ν•œ λ‘œκΉ…κ³Ό μ˜λ„ν•œ μ˜ˆμ™Έλ“€μ— λŒ€ν•œ λ‘œκΉ…μ„ 톡해 μ‚¬μš©μžκ°€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‚¬μš©ν•˜λ©΄μ„œ κ²ͺ을 수 μžˆλŠ” μ‹œμŠ€ν…œ νλ¦„μ˜ 톡계λ₯Ό 뢄석할 수 μžˆλ‹€. 이λ₯Ό λ°”νƒ•μœΌλ‘œ μ–΄λ–€ 뢀뢄을 κ°œμ„ ν•΄μ•Ό ν•  지 확인할 수 μžˆλ‹€.

λ˜ν•œ, μ™ΈλΆ€ API λ₯Ό μ‚¬μš©ν•˜λŠ” λ“± μ˜ˆμƒν•  수 μ—†λŠ” μ˜ˆμ™Έλ“€μ„ λ‘œκΉ…ν•˜μ—¬ μ§€μ†μ μœΌλ‘œ μ™ΈλΆ€ API λ₯Ό μ‚¬μš©ν•  것인가, λ˜λŠ” μ–΄λ””μ—μ„œ λ†“μΉœ 뢀뢄이 μžˆλŠ”μ§€ 확인할 수 μžˆλ‹€.

둜그 레벨의 기쀀은?

둜그 레벨의 기쀀은 νŒ€ 바이 νŒ€, μ‚¬λžŒ 바이 μ‚¬λžŒμΌ 것이닀. λ¬Όλ‘  κ³΅μ‹ν™”λœ λ¬Έμ„œλ„ μ‘΄μž¬ν•˜μ§€λ§Œ, 의견이 λΆ„λΆ„ν•  수 μžˆλŠ” 뢀뢄이닀.

μ΄λŠ” κ²°κ΅­ μ‚¬μš©ν•˜λŠ” μͺ½μ—μ„œ μ–΄λ–»κ²Œ ꡬ뢄할 것인가에 λŒ€ν•΄ μ •ν•˜λŠ” 것이기 λ•Œλ¬Έμ— μ•Œλ§žκ²Œ μ»€μŠ€ν…€ν•˜μ—¬ μ‚¬μš©ν•˜λŠ” 것이 쒋을 것이라 μƒκ°ν–ˆλ‹€.

우리 νŒ€μ€ μ•„λž˜λŠ” 우리 νŒ€μ—μ„œ μ •ν•œ 둜그 레벨의 기쀀이닀.

  • Error μ™ΈλΆ€ 라이브러리 μ˜ˆμ™Έ ν˜Ήμ€ μ˜ˆμƒν•˜μ§€ λͺ»ν•œ μ˜ˆμ™Έ
  • Warn νŒ€μ—μ„œ μ˜ˆμƒν•˜λŠ” μ‚¬μš©μž ν”Œλ‘œμš°μ—μ„œ λ²—μ–΄λ‚œ μ˜ˆμ™Έ (Postman, curl λ“±)
  • Info 정상적인 μ‚¬μš© μ‹œ λ°œμƒν•  수 μžˆλŠ” μ˜ˆμ™Έ

References