Skip to content

Latest commit

 

History

History
148 lines (91 loc) Β· 8.56 KB

Logging.md

File metadata and controls

148 lines (91 loc) Β· 8.56 KB

logging

μ‹œμŠ€ν…œμ„ μž‘λ™ν•  λ•Œ μ‹œμŠ€ν…œμ˜ μž‘λ™ μƒνƒœμ˜ 기둝과 보쑴, 이용자의 μŠ΅μ„± 쑰사 및 μ‹œμŠ€ν…œ λ™μž‘μ˜ 뢄석 등을 ν•˜κΈ° μœ„ν•΄ μž‘λ™μ€‘μ˜ 각쒅 정보λ₯Ό κΈ°λ‘ν•΄λ‘˜ ν•„μš”κ°€ μžˆλ‹€. 이 기둝을 λ§Œλ“œλŠ” 것을 λ‘œκΉ…μ΄λΌ ν•œλ‹€. 즉 둜그 μ‹œμŠ€ν…œμ˜ μ‚¬μš©μ— κ΄€κ³„λœ 일련의 사건듀을 μ‹œκ°„μ˜ 경과에 따라 κΈ°λ‘ν•˜λŠ” 것이닀.

λ‘œκΉ…μ€ μ™œ ν•„μš”ν• κΉŒ?

  1. 개발 ν•  λ•Œ, 디버깅 μ‹œ μ‚¬μš©ν•  수 μžˆλ‹€.
  2. μ‚¬μš©μžμ˜ 이벀트λ₯Ό 좔적할 수 μžˆλ‹€.

System.out.println 으둜 λ‘œκΉ…μ„ ν•˜λ©΄ μ•ˆλ˜λŠ” 이유

  • μ—λŸ¬ λ°œμƒ μ‹œ 좔적할 수 μžˆλŠ” μ΅œμ†Œν•œμ˜ 정보(λ‚ μ§œ, μ‹œκ°„, νŠΉμ • 클래슀, 둜그 νƒ€μž…(error, info, warn, debug λ“±))κ°€ μ—†λ‹€.
  • 좜λ ₯된 둜그 λ‚΄μš©μ„ μ„œλ²„λ‘œ 전솑할 수 μ—†λ‹€.
  • 둜그 필터링을 ν•  μˆ˜κ°€ μ—†λ‹€. νŠΉμ • 둜그 μˆ˜μ€€μ— μ†ν•˜λŠ” λ©”μ‹œμ§€λ₯Ό λΉ„ν™œμ„±ν™”ν•  수 μžˆλŠ” κΈ°λŠ₯듀이 μ—†λ‹€.
  • μŠ€λ ˆλ“œμ— μ•ˆμ „ν•˜μ§€ μ•Šλ‹€.
  • println은 맀 μ‹€ν–‰μ‹œλ§ˆλ‹€ μŠ€νŠΈλ¦Όμ„ μƒμ„±ν•˜κ³ , IO μž‘μ—…μ„ μ‹€ν–‰ν•˜λŠ” Blocking 방식이닀. μ΄λŠ” μ„±λŠ₯상에 문제λ₯Ό μ•ΌκΈ°ν•˜μ—¬ 운영 쀑인 μ„œλ²„μ˜ μ‹€μ‹œκ°„ μ²˜λ¦¬λŸ‰μ— 큰 영ν–₯을 미치게 λœλ‹€.

SLF4J(Simple Logging Facade For Java)

λ‘œκΉ…μ— λŒ€ν•œ 좔상 λ ˆμ΄μ–΄λ₯Ό μ œκ³΅ν•˜λŠ” μΈν„°νŽ˜μ΄μŠ€μ˜ λͺ¨μŒ.

좔상 λ‘œκΉ… ν”„λ ˆμž„μ›Œν¬μ΄κΈ° λ•Œλ¬Έμ—, κ΅¬ν˜„μ²΄κ°€ 없이 λ‹¨λ…μœΌλ‘œ μ‚¬μš©ν•˜μ§€ μ•ŠλŠ”λ‹€.

API , Binding , Bridging λΌλŠ” μ„Έ 가지 λͺ¨λ“ˆμ„ μ œκ³΅ν•œλ‹€.

κ΅¬μ„±μš”μ†Œ 1. API

  • slf4j μ—μ„œ μ œκ³΅ν•˜λŠ” api 듀을 의미

κ΅¬μ„±μš”μ†Œ 2. Binding

  • λ‘œκΉ… κ΅¬ν˜„μ²΄μ™€ μ—°κ²°ν•˜λŠ” 것, 컴파일 νƒ€μž„μ— 였직 ν•˜λ‚˜μ˜ λ‘œκΉ… ν”„λ ˆμž„μ›Œν¬λ₯Ό μ‚¬μš©ν•˜λ„λ‘ 바인딩 ν•œλ‹€.

IMAGES

κ΅¬μ„±μš”μ†Œ 3. Bridging

  • log4j, JCL, JUL κ³Ό 같은 λ‹€λ₯Έ λ‘œκΉ… API λ₯Ό μ‚¬μš©ν•˜λ”λΌλ„ λ‚΄λΆ€μ—μ„œλŠ” SLF4J API λ₯Ό ν˜ΈμΆœν•˜λ„λ‘(λ¦¬λ””λ ‰μ…˜) μ–΄λŒ‘ν„° 역할을 ν•΄μ£ΌλŠ” 라이브러리

Facade νŒ¨ν„΄

IMAGES

  • μ—¬λŸ¬ 개의 ν΄λž˜μŠ€κ°€ ν•˜λ‚˜μ˜ 역할을 μˆ˜ν–‰ν•  λ•Œ, λŒ€ν‘œμ μΈ μΈν„°νŽ˜μ΄μŠ€λ§Œμ„ λ‹€λ£¨λŠ” 클래슀λ₯Ό 두어 μ›ν•˜λŠ” κΈ°λŠ₯을 μ²˜λ¦¬ν• μˆ˜ 있게 λ„μ™€μ£ΌλŠ” νŒ¨ν„΄μ΄λ‹€.
  • ν΄λΌμ΄μ–ΈνŠΈλŠ” Facade에 μš”μ²­μ„ μ „μ†‘ν•˜μ—¬ Subsystemκ³Ό ν†΅μ‹ ν•˜λ©°, FacadeλŠ” ν•΄λ‹Ή μš”μ²­μ„ μ μ ˆν•œ Subsystem 객체둜 μ „λ‹¬ν•œλ‹€.
  • Subsystem 객체가 μ‹€μ œ μž‘μ—…μ„ μˆ˜ν–‰ν•˜μ§€λ§Œ FacadeλŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό Subsystem μΈν„°νŽ˜μ΄μŠ€λ‘œ λ³€ν™˜ν•˜κΈ° μœ„ν•΄ 자체 μž‘μ—…μ„ μˆ˜ν–‰ν•΄μ•Ό ν•  μˆ˜λ„ μžˆλ‹€. 즉, κ³΅ν†΅λœ Interfaceλ₯Ό μ μ ˆν•˜κ²Œ λ³€ν™˜ν•΄μ„œ μ—°κ²°ν•œλ‹€.
  • Facadeλ₯Ό μ‚¬μš©ν•˜λŠ” ν΄λΌμ΄μ–ΈνŠΈλŠ” Subsystem 객체에 직접 μ•‘μ„ΈμŠ€ν•  ν•„μš”κ°€ μ—†λ‹€. 즉, ν΄λΌμ΄μ–ΈνŠΈλŠ” Subsystem을 μ•Œ ν•„μš” 없이 Common Interfaceμ—λ§Œ μ ‘κ·Όν•œλ‹€.

SLF4J μ‚¬μš© μ‹œ μ£Όμ˜μ‚¬ν•­

  1. 클래슀λ₯Ό μ»΄νŒŒμΌν•˜κ³  μ‹€ν–‰ν•΄λ³΄μž. ( 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");   
    }
}
  1. μ‹€ν–‰ ν•˜λ©΄, 둜그 좜λ ₯은 μ œλŒ€λ‘œ λ˜μ§€ μ•Šκ³ , κ²½κ³ κ°€ λ°œμƒν•œλ‹€.
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둜 λ³€κ²½

Log4j

Java 기반 λ‘œκΉ… ν”„λ ˆμž„μ›Œν¬

κ΅¬μ„±μš”μ†Œ 1. Logger

메세지λ₯Ό κΈ°λ‘ν•˜λŠ”λ° μ‚¬μš©ν•œλ‹€.

κ΅¬μ„±μš”μ†Œ 2. Appender

파일, DB, Console λ“±κ³Ό 같은 λŒ€μƒμ— λ‘œκΉ… 정보λ₯Ό 좜λ ₯ν•˜λŠ” 데 μ‚¬μš©ν•œλ‹€.

κ΅¬μ„±μš”μ†Œ 3. Layout

λ‘œκΉ… μ •λ³΄μ˜ μŠ€νƒ€μΌμ„ μ •ν•˜λŠ”λ°μ— μ‚¬μš©ν•œλ‹€.

둜그 레벨 ( 우츑으둜 갈수둝 심각함 )

Trace < Debug < Info < Warn < Error < Fatal

LogBack

log4j λ₯Ό 기반으둜 속도, λ©”λͺ¨λ¦¬ μ‚¬μš©λ₯  λ“± μ„±λŠ₯을 κ°œμ„ ν•˜μ—¬ κ°œλ°œν•œ λ‘œκΉ… 라이브러리

  1. Automatic Reloading Configuration file

싀행쀑인 ν”„λ‘œκ·Έλž¨μ˜ 둜그 섀정을 λ³€κ²½ν•˜κ³  싢을 λ•Œ, 기쑴의 λ‹€λ₯Έ 라이브러리의 경우 싀행쀑인 ν”„λ‘œκ·Έλž¨μ˜ μž¬μ‹œμž‘μ΄ ν•„μš”ν•˜μ§€λ§Œ, LogBack의 경우 μ„€μ •νŒŒμΌμ„ μŠ€μΊ”ν•˜λŠ” λ³„λ„μ˜ μ“°λ ˆλ“œλ₯Ό 두어 μ§€μ •ν•œ μ‹œκ°„λ§ˆλ‹€ μ„€μ •νŒŒμΌμ„ μŠ€μΊ”ν•΄ ν”„λ‘œκ·Έλž¨μ˜ μž¬μ‹œμž‘ 없이 섀정을 μ μš©μ‹œν‚¬ 수 μžˆλ‹€.

  1. Automatic Compression / Removal

둜그 νŒŒμΌμ„ 생성할 λ•Œ λ³„λ„μ˜ ν”„λ‘œκ·Έλž¨μ„ 톡해 압좕이 ν•„μš” 없도둝 μžλ™ 압좕을 μ§€μ›ν•˜λ©°, μ‹œκ°„ λ˜λŠ” 갯수λ₯Ό μ„€μ •ν•˜μ—¬ μ„€μ •ν•œ μ‹œκ°„μ΄λ‚˜ 갯수λ₯Ό μ΄ˆκ³Όν•  경우 둜그 파일이 μžλ™μœΌλ‘œ μ‚­μ œ λ˜λ„둝 ν•  수 μžˆλ‹€.

  1. Graceful recovery from I/O failures

λ‘œκ·ΈνŒŒμΌμ€ JDBC, Socket λ“±μ˜ Appenderλ₯Ό 톡해 원격 μ„œλ²„μ— μ €μž₯μ‹œν‚¬ 수 μžˆλ‹€. ν•˜μ§€λ§Œ λ§Œμ•½ μ›κ²©μ„œλ²„ λ˜λŠ” 연결에 μΌμ‹œμ  μž₯μ• κ°€ λ°œμƒν•˜μ—¬ 둜그파일의 I/O Failure이 λ°œμƒ ν•  경우, Log4J 와 같은 κΈ°μ‘΄ λΌμ΄λΈŒλŸ¬λ¦¬μ—μ„œλŠ” μ„œλ²„ λ³΅κ΅¬μ‹œμ κΉŒμ§€μ˜ ν”„λ‘œκ·Έλž¨ 쀑단 및 μž¬μ‹œμž‘μ΄ ν•„μš”ν•˜μ§€λ§Œ, LogBack은 μ„œλ²„ 쀑지 없이, μž₯μ•  λ°œμƒμ‹œμ μœΌλ‘œλΆ€ν„°μ˜ μžλ™λ³΅κ΅¬λ₯Ό μ§€μ›ν•œλ‹€.

  1. Prudent mode

ν•˜λ‚˜μ˜ μ„œλ²„μ—μ„œ λ™μž‘ν•˜λŠ” μ—¬λŸ¬ JVM의 λ‘œκ·Έκ°€ ν•˜λ‚˜μ˜ 둜그파일둜 기둝되기λ₯Ό 원할 경우 μ‚¬μš©ν•  수 μžˆλŠ” κΈ°λŠ₯

μ°Έκ³ ) Log4j2 vs Logback

  • log4j2λŠ” log4jμ—μ„œ 더 μ„±λŠ₯을 κ°œμ„ ν•œ 라이브러리 이닀.

  • log4j2 λŠ” λ©€ν‹° μŠ€λ ˆλ“œ ν™˜κ²½μ—μ„œ logback 보닀 μ„±λŠ₯이 λ›°μ–΄λ‚˜λ‹€κ³  ν•œλ‹€.

  • κ·Έλ ‡μ§€λ§Œ, μŠ€ν”„λ§λΆ€νŠΈ μ—μ„œλŠ” slf4j + logback 을 기본적으둜 μ±„νƒν•˜κ³  μžˆλ‹€.

좜처 : https://logging.apache.org/log4j/2.x/performance.html

ꢌμž₯ 둜그레벨 ( feat. λ„·λ§ˆλΈ” )

Error

Error(였λ₯˜) λ ˆλ²¨μ€ μ„œλΉ„μŠ€ λ™μž‘μ— 이상이 μžˆμ„ μ •λ„λ‘œ λ¬Έμ œκ°€ λ°œμƒν•œ κ²½μš°μ΄λ‹€. DB 컀λ„₯μ…˜ 였λ₯˜λ‚˜, λ””μŠ€ν¬ μ €μž₯ 곡간 λΆ€μ‘± λ“±μ˜ 상황이 이에 ν•΄λ‹Ή ν•œλ‹€. Error λ‘œκ·Έκ°€ λ“±μž₯ν•˜λ©΄, 당일 κ·Όλ¬΄μ‹œκ°„ 내에 운영 λ‹΄λ‹Ήμžκ°€ 확인 μ‘°μΉ˜ν•˜κ³  ν•΄λ‹Ή 사항에 λŒ€ν•΄ κ³΅μœ ν•΄μ•Ό ν•œλ‹€. λ™μΌν•œ Errorκ°€ λ°˜λ³΅ν•΄μ„œ λ°œμƒν•œλ‹€λ©΄, κ·Όλ¬΄μ‹œκ°„ 외라도 μ¦‰μ‹œ 확인 μ‘°μΉ˜ν•΄μ„œ κ³΅μœ ν•΄μ•Ό ν•œλ‹€.

Warning

Warning(κ²½κ³ ) λ ˆλ²¨μ€ μ„œλΉ„μŠ€ λ™μž‘μ—λŠ” 이상이 μ—†μ§€λ§Œ, μΆ”ν›„ μž₯μ• λ‘œ μ΄μ–΄μ§ˆ 수 μžˆλŠ” λ¬Έμ œκ°€ λ°œμƒν•œ κ²½μš°μ΄λ‹€. 컀λ„₯μ…˜ μž¬μ‹œλ„, λ°±μ—… μ„œλ²„λ‘œ λ³€κ²½ λ“±μ˜ 상황이 이에 ν•΄λ‹Ή ν•œλ‹€. Warning λ‘œκ·Έκ°€ λ“±μž₯ν•˜λ©΄, λ°œμƒλŸ‰ 좔이λ₯Ό 확인해 1~2μ£Ό λ‚΄λ‘œ 확인 쑰치λ₯Ό ν•΄μ•Ό ν•œλ‹€.

Info

Info(μ•Œλ¦Ό) λ ˆλ²¨μ€ μ‹œμŠ€ν…œ λ™μž‘ μƒμ—μ„œ νŠΉμ • μž‘μ—…μ΄ μ •μƒμ μœΌλ‘œ μˆ˜ν–‰λμŒμ„ μ•Œλ €μ£ΌλŠ” κ²½μš°μ΄λ‹€. μ΄λ•Œ λ‹¨μœ„ μž‘μ—…(Unit of Work)을 같이 μ•Œλ €μ€˜μ•Ό ν•œλ‹€. 주둜 μ„œλΉ„μŠ€ μ‹œμž‘ 및 μ’…λ£Œλ‚˜ νŠΉμ • λ‹¨μœ„ 등둝 및 μ‚­μ œ λ“±μ˜ 상황이 이에 ν•΄λ‹Ή,
Info λ‘œκ·ΈλŠ” μ •μƒμ μœΌλ‘œ μ™„λ£Œν•œ μž‘μ—…μ–‘μ„ μΈ‘μ •ν•˜κ±°λ‚˜, μ‹œμŠ€ν…œ ν™˜κ²½μ΄λ‚˜ μ„€μ • 정보λ₯Ό 확인할 λ•Œ μ‚¬μš©ν•œλ‹€.

Debug

Debug(디버그) λ ˆλ²¨μ€ Info λ‘œκ·Έμ—μ„œ 기둝된 λ‹¨μœ„ μž‘μ—…μ˜ μƒμ„Έν•œ 단계λ₯Ό κΈ°λ‘ν•œλ‹€. 주둜 개발 및 톡합 ν…ŒμŠ€νŠΈ λ‹¨κ³„μ—μ„œ 디버깅 μš©λ„λ‘œ μ‚¬μš©ν•˜κ±°λ‚˜, 운영 쀑 문제 λ°œμƒμ‹œ 원인 νŒŒμ•…μ„ μœ„ν•΄μ„œ μ‚¬μš©ν•œλ‹€.

Reference