romworld

Log4j 본문

JAVA/개념정리

Log4j

inderrom 2022. 12. 6. 02:14

- Log4j란

 java application에서 로깅을 할 수 있도록 도와주는 Open Source Project

 

Log4j 구성요소

  • Logger (Category): Log4j의 핵심 클래스로 로그파일을 작성하고 관리하는 역할.
  • Appender : Logger로 부터 전달된 Logging 메세지를 어디에 출력 또는 저장할 것인지 결 정하는 역할
  • Layout : Logging 메시지를 어떤 형식으로 출 력할 것인지 출력 Layout을 결정한다.

Log4j 로그의 레벨

  • 로그 레벨 (Priority)
    • –  FATAL : 가장 심각한 상황의 에러가 났을 경우 사용한다.
    • –  ERROR : 일반적인 에러가 났을 때 사용한다.
    • –  WARN : 에러는 아니나 주의가 필요한 경우 사용한다.
    • –  INFO : 일반 정보를 나타낼 때 사용한다.
    • –  DEBUG:개발시프로그램디버깅용메시지를출력해야하는 경우 사용한다.
    • –  TRACE : DEBUG 보다 낮은 레벨의 메시지 출력시 사용
  • 우선순위는 FATAL이 가장 높고 TRACE가 가장 낮다.
  • 로그레벨로 선택된 것 이상의 로그레벨 메시지가 모두 출력된 다.
  • Ex : INFO로 설정한 경우 -> FATAL, ERROR, WARN, INFO로 설정 된 메시지가 모두 출력된다.

Log4j 로그 출력 설정

출력설정

  • –  출력패턴, 로그 레벨등의 사항을 정의한다.
  • –  설정파일을 이용, 프로그램 내에 직접 명시하는 두 가지 방법이 있다.
  • –  파일명을 log4j.properties 로 하여 classpath내에 저장한다.
  • –  Web application의 경우 WEB-INF/classes 밑에 저장 한다.
  • –  작성형식은 자바 프로퍼티 형식으로 name=value 형 식으로 작성한다.

Log4j 설정파일의 예

log4j.rootLogger=INFO, stdout, rolling

log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d %-5p [%t] %-17c{2} (%13F:%L) %3x - %m%n

log4j.appender.rolling=org.apache.log4j.DailyRollingFileAppender log4j.appender.rolling.File=logfile.log log4j.appender.rolling.Append=true log4j.appender.rolling.DatePattern='.'yyyy-MM-dd log4j.appender.rolling.layout=org.apache.log4j.PatternLayout log4j.appender.rolling.layout.ConversionPattern=%d %-5p [%t] %-17c{2} (%13F:%L) %3x - %m%n

 

Log4j 설정파일

log4j.rootLogger=DEBUG,stdout, rolling

  • –  로그의 레벨과 아래에서 설정할 Appender들의 이름을 지정한다.
  • –  레벨은 DEBUG이고 Appenderstdout, rolling 두개를 지정했다.
  • 이 두 값을 이용해 각각의 Appender에 대한 설정을 하게된다.
    • –  stdoutAppender종류를 세팅 한다.
    • –  ConsoleAppender :표준 출력 AppenderSystem.out 이나 System.err을 이용해 출력한다.
    • –  DailyRollingFileAppender : FileAppender의 하위로 날짜별로 로그 파일을 만들어 그 파일에 출력한다.
    • –  그외 Appender : RollingFileAppender, WriterAppender, AsyncAppender, FileAppender
    • log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    • –  출력 Layout을 설정한다.
    • –  PatternLayout : Cprintf에서 사용하는 전환 패턴(conversion pattern)을 사용하여 출력 Layout을 정의 한다. (다음 페이지 참고)
    • –  그외 Layout : HTMLLayout, SimpleLayout, XMLLayout
  • log4j.appender.stdout=org.apache.log4j.ConsoleAppender

 

Log4j 설정파일

log4j.appender.stdout.layout.ConversionPattern=%d %-5p [%t] %-17c{2} (%13F:%L) - %m%n

  • –  PatternLayout일 경우 출력 될 패턴을 정의 한다.
  • –  시간 로그레벨 [발생쓰레드] 클래스명 (파일명:라인) – 내용
  • log4j.appender.rolling=org.apache.log4j.DailyRollingFileAppender
  • –  log4j.appender.rolling.File=logfile.log : 로그를 남길 파일명(절대, 상대경로 다 됨)
  • –  log4j.appender.rolling.Append=true : 서버의 종료 여부와 상관없이 파일이 리셋되지 않는다.
  • –  log4j.appender.rolling.DatePattern='.'yyyy-MM-dd : 파일명 포맷 (당일이 지나면 백업파일 을 만드는데 그때의 파일명 뒤에 날짜가 붙는다. )

 

 

로깅 프로그램 작성

  1. org.apache.log4j.Logger.getLogger(String name 또는 Class clazz) 메소드를 통해 Logger객체를 가져 온다.
  2. Ex) Logger logger = Logger.getLogger(Abc.class); -> Abc.class는 로거의 이름이 된다.
  3. Logger객체의 로깅 메소드를 통해 로그메세지를 출력 한다.

(예시)

import org.apache.log4j.Logger;

public class Abc{
private static Logger logger =

Logger.getLogger(Abc.class); public static void main(String[] args) {

logger.debug("[DEBUG]모드 로그^^");

logger.info ("[INFO] 모드 로그^^");

logger.warn ("[WARN] 모드 로그^^", new Exception("aaa"));

logger.error("[ERROR] 모드 로그^^");

logger.fatal("[FATAL] 모드 로그^^"); }

}

 

 

 

log4j.properties

# Root logger option

# 1. 로그 출력 Level은 INFO부터 할것임.
# 2. rootLogger 에 사용할 로깅 Appender로 stdout이라는것과 
#    logfile이라는 것 두가지를 사용하겠다
#log4j.rootLogger=debug, stdout, logfile
log4j.rootLogger=trace, stdout,

# Direct log messages to stdout
# ConversionPattern은 로그가 어떠한 형식으로 출력될것인지 
# 그 포맷을 정의하는 것.
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p (%C{2}:%L) - %m%n

# Direct log message to log file
# logfile이라는 appender는 로그를 파일로 출력해주는 놈인데, 
# 파일path를 정의 할 수 있다.
log4j.appender.logfile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.logfile.DatePattern='.'yyyy-MM-dd
log4j.appender.logfile.File=D:/application.log  
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss}] %5p (%C{2} - %M:%L) - %m%n
log4j.appender.logfile.Append=true

# Sql log
# 이곳이 java.sql.* 을 사용하는 쿼리를 보여주는 설정.
log4j.logger.java.sql.Connection=DEBUG, logfile
log4j.logger.java.sql.Statement=DEBUG, logfile
log4j.logger.java.sql.PreparedStatement=DEBUG, logfile
log4j.logger.java.sql.ResultSet=DEBUG, logfile

LogMessageTest

package kr.or.ddit.basic;

import org.apache.log4j.Level;
import org.apache.log4j.Logger;

public class LogMessageTest {
	// Logger 클래스의 인스턴스를 받아온다.(로그기록을 남기는 Class파일)
	static Logger logger = Logger.getLogger(LogMessageTest.class);
	
	public static void main(String[] args) {
		// 메시지 출력하기 (사용하는 메서드명이 Logger의 레벨명과 같다.)
		// 형식1) Logger 객체변수.출력할레벨명(출력할 메시지)
		logger.trace("이것은 log4j의 [TRACE]레벨의 출력입니다.");
		logger.debug("이것은 log4j의 [DEBUG]레벨의 출력입니다.");
		logger.info("이것은 log4j의 [INFO]레벨의 출력입니다.");
		logger.warn("이것은 log4j의 [WARN]레벨의 출력입니다.");
		logger.error("이것은 log4j의 [ERROR]레벨의 출력입니다.");
		logger.fatal("이것은 log4j의 [FATAL]레벨의 출력입니다.");
		
		// 형식2) Logger 객체변수.log( Level.레벨명 "출력할메시지")
		logger.log(Level.INFO, "log()메서드를 이용한 INFO레벨 출력입니다.");
		
	}

}

'JAVA > 개념정리' 카테고리의 다른 글

Servlet 2  (0) 2022.12.06
Servlet  (0) 2022.12.06
Ibatis(2)  (1) 2022.12.06
Ibatis  (0) 2022.12.06
MVC패턴 - JDBC , CRUD  (1) 2022.11.27
Comments