SSISO Community검색 |
|
SSISO Community메뉴 |
|
SSISO Community카페 |
|
블로그 카테고리 |
|
|
Log4j로 검색한 결과 |
|
등록일:2008-03-14 09:28:23 작성자: 제목:Log 콤포넌트의 제작(Logging의 필요성, Log4j) |
|
[23] Log 콤포넌트의 제작(Logging의 필요성, Log4j)
▩ Logging의 필요성
- 비정상적인 시스템 오작동으로 인한 정보를 특정 매체에 기록하는 것을 말합니다.
- 로그는 시스템적인 것 뿐만 아니라 특정 사용자의 무리한 로그인 시도, 해킹의도를
파악하는데 유용한 기록을 제공합니다.
- 개발과정에서는 발견되지 않았던 논리적인 에러나 문제점을 발견할 수 있습니다.
- 테스트 과정에서 발견되지 않았던 예외를 기록하는 것을 말합니다.
- 코드상의 에러는 개발과정에서 전부 수정되어야 합니다.
- 불필요한 로그 기록이나 많은 로깅은 시스템에 많은 부하를 줄 수 있습니다.
- 특정 사용자와 관련 있는 로그는 반드시 회원 정보가 기록이 되도록 해주어야 합니다.
- 모든 Exception은 Logging 해주세요.
- JDK 1.4에도 Logging API가 추가되었으나 Apache에서 진행하는 프로젝트인
Log4j가 많이 사용되고 있습니다.
▩ Log4j
- Apache Group에서 진행하는 Log Framework Project 입니다.
- http://logging.apache.org/Log4j/docs/index.html
- Download: http://logging.apache.org/site/binindex.cgi
- logging-Log4j-1.2.14/dist/lib안에 있는 Log4j-1.2.14.jar 파일을
Eclipse의 c:/eclipse/lib 폴더에 복사합니다.
- Tomcat에 배포는 WEB-INF/lib 폴더로 복사합니다.
1. Log Level
- Level.FATAL: 치명적인 시각한 에러 발생시 사용
- Level.ERROR: 어플리케이션이 수행 가능한 정도의 에러 발생시 사용
- Level.WARN: 시스템에 문제를 일으킬수 있는 정도의 에러 발생시 사용
- Level.INFO: 어플리케이션의 정보를 기록할때 사용
- Level.DEBUG: 어플리케이션의 상태에 대한 상세 정보를 나타낼 때 사용
2. 로그 기록 Method
- FATAL 로그 메시지 기록
. fatal(Object message)
. fatal(Object message, Throwable t)
- ERROR 로그 메시지 기록
. error(Object message)
. error(Object message, Throwable t)
- WARN 로그 메시지 기록
. warn(Object message)
. warn(Object message, Throwable t)
- INFO 로그 메시지 기록
. info(Object message)
. info(Object message, Throwable t)
- DEBUG 로그 메시지 기록
. debug(Object message)
. debug(Object message, Throwable t)
3. Console Log의 실습
- eclipse setting
. project name: logTest
. package name: www.log
- BasicConfigurator.configure()은 기본적으로 콘솔 로그를 포함함
>>>>> Log4jTest1.java
package test.log;
import org.apache.Log4j.Logger;
import org.apache.Log4j.Level;
import org.apache.Log4j.BasicConfigurator;
public class Log4jTest1 {
public static void main(String[] args) throws java.io.IOException {
//Log4j 초기화
//기본적으로 Console에 출력
BasicConfigurator.configure();
//Logger 생성
Logger www = Logger.getLogger("www");
//Logger Level 지정, INFO를 포함한 상위 Level만 저장
www.setLevel(Level.INFO);
//계층상 하위 Logger 생성
Logger logtest = Logger.getLogger("www.logtest");
//www Logger 기록
www.info("로그 테스트 시작.");
www.debug("DEBUG 레벨 로그.");
//www.logtest Logger에 기록
logtest.info("Log4jTest1 로그 기록");
logtest.debug("Log4jTest1 DEBUG 레벨 로그");
}
}
4. PatternLayout의 변환 캐릭터, 출력 형식
- %C: 로그 메시지를 기록하려는 클래스의 완전한 이름 출력
- %c: 로그이름
- %t: 스레드명
- %d: 로그 메시지를 기록한 시간을 기록한다.
- %p: 로깅 레벨
- %M: 로그메시지를 기록하려는 메소드의 이름
- %m: 로그메시지 자체
- %F: 파일명
- %L: 라인 번호
- %n: 개행 문자
- %r: 실행 경과 시간(millisecond)
- %%: '%'를 출력한다.
5. Appender의 종류, 출력 처리를 할 매체 지정
- Log의 출력 방향을 지정합니다.
- org.apache.Log4j.ConsoleAppender: 콘솔에 로그메시지를 출력한다.
- org.apache.Log4j.FileAppender: 파일에 로그메시지를 기록한다.
- org.apache.Log4j.RollingFileAppender: 파일에 로그메시지를 기록하고, 파일이 일정 크기가 되면 다른이름으로 저장하고
, 새롭게 로그 메시지를 기록하기 시작한다.
- org.apache.Log4j.DailyRollingFileAppender: 파일에 로그 메시지를 기록하며, 하루 단위로 로그 파일을 변경한다.
- org.apache.Log4j.net.SMTPAppender: 로그메시지를 이메일로 전송한다.
- org.apache.Log4j.nt.NTEventLogAppender: NT의 이벤트 로그 시스템에 로그메시지를 전송한다.
▩ 속성 파일을 이용한 로그의 기록
- Log4j.rootLogger=INFO, console, R
. rootLogger는 로깅 레벨이 INFO, Appender는 console과 R을 가지고 있습니다.
. R: RollingFileAppender
1. 속성
>>>>> Log4j.properties
#--------------------------------------------------
#File Name: Log4j.properties
#--------------------------------------------------
Log4j.rootLogger=DEBUG, console, R
Log4j.appender.console=org.apache.Log4j.ConsoleAppender
Log4j.appender.console.layout=org.apache.Log4j.SimpleLayout
Log4j.appender.R=org.apache.Log4j.RollingFileAppender
Log4j.appender.R.File=c:/ojt/eclipse/workspace/logTest/Log4j.log
Log4j.appender.R.MaxFileSize=64KB
Log4j.appender.R.MaxBackupIndex=3
Log4j.appender.R.layout=org.apache.Log4j.PatternLayout
Log4j.appender.R.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss} %C{1}.%M - %m%n
[참고]
# rootLogger는 로깅 레벨이 INFO, Appender는 console과 R을 가지고 있습니다.
# R: RollingFileAppender
Log4j.rootLogger=DEBUG, console, R
# 화면에 출력하는 console append의 정의
Log4j.appender.console=org.apache.Log4j.ConsoleAppender
Log4j.appender.console.layout=org.apache.Log4j.SimpleLayout
# 파일에 출력하는 RollingFileAppender 정의
Log4j.appender.R=org.apache.Log4j.RollingFileAppender
# Log4j.appender.R.File=c:/ojt/tomcat-5.5.15/webapps/www/log/Log4j.log
# 파일 생성 경로
Log4j.appender.R.File=c:/ojt/eclipse/workspace/logTest/Log4j.log
# 파일 사이즈
Log4j.appender.R.MaxFileSize=64KB
# 최대 파일 갯수
Log4j.appender.R.MaxBackupIndex=3
# 레이아웃 종류
Log4j.appender.R.layout=org.apache.Log4j.PatternLayout
# 패턴 지정
Log4j.appender.R.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss} %C{1}.%M - %m%n
2. 속성 파일을 이용한 경우
- 속성파일의 사용은 PropertyConfigurator.configure("Log4j.properties")을 추가한다.
>>>>> Log4jTest2.java
package test.log;
import org.apache.Log4j.Logger;
import org.apache.Log4j.PropertyConfigurator;
public class Log4jTest2 {
public static void main(String[] args) {
//속성 파일의 사용
PropertyConfigurator.configure("Log4j.properties");
Logger rootLogger = Logger.getRootLogger();
rootLogger.info("프로그램 시작");
Logger logger = Logger.getLogger("www.log");
logger.info("테스트 시작.");
logger.debug("DEBUG 레벨 로그.");
logger.info("테스트 로그 기록");
logger.debug("테스트 로그 DEBUG 레벨 로그");
rootLogger.info("프로그램 끝");
}
}
▩ 사용 예 실습
1. 속성 파일
>>>>> log.properties
#--------------------------------------------------
#File Name: log.properties
#--------------------------------------------------
Log4j.rootLogger=DEBUG, console, R
Log4j.appender.console=org.apache.Log4j.ConsoleAppender
Log4j.appender.console.layout=org.apache.Log4j.SimpleLayout
Log4j.appender.R=org.apache.Log4j.RollingFileAppender
Log4j.appender.R.File=c:/ojt/eclipse_cvs/workspace/logTest/Log4j.log
Log4j.appender.R.MaxFileSize=64KB
Log4j.appender.R.MaxBackupIndex=3
Log4j.appender.R.layout=org.apache.Log4j.PatternLayout
Log4j.appender.R.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss} / %m%n
2. 로그 기록 파일
>>>>> LogWriter.java
package bookshopcbd.utility;
import org.apache.Log4j.Level;
import org.apache.Log4j.Logger;
import org.apache.Log4j.PropertyConfigurator;
public class LogWriter {
public LogWriter(){
}
/**
* 로그 기록을 전담하는 메소드입니다.
* @param logName 로그이름
* @param level 로그 기록 레벨
* @param class_methodname 클래스, 메소드명
* @param msg 기록할 메시지
*/
public static void LogWrite(String logName, String level, String class_methodname, String msg, Throwable t){
//속성 파일의 사용
PropertyConfigurator.configure("log.properties");
//Logger rootLogger = Logger.getRootLogger();
//로그이름 지정
Logger www = Logger.getLogger(logName);
//Logger Level 지정, INFO를 포함한 상위 Level만 저장
www.setLevel(Level.DEBUG);
//기록할 메시지 조합
msg = logName + "/" + class_methodname + "/" + msg;
if ( level.toUpperCase().equals("FATAL")){
www.fatal(msg, t);
}
if ( level.toUpperCase().equals("ERROR")){
www.error(msg, t);
}
if ( level.toUpperCase().equals("WARN")){
www.warn(msg, t);
}
if ( level.toUpperCase().equals("INFO")){
www.info(msg, t);
}
if ( level.toUpperCase().equals("DEBUG")){
www.debug(msg, t);
}
}
}
3. 로그 테스트 파일
>>>>> Log4jTest3.java
package test.log;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Connection;
public class Log4jTest3 {
Connection con=null;
public Log4jTest3(){ }
public Connection oracleConnect(){
//데이터베이스 접속 연결 정보를 가지고 있는 객체입니다.
//Oracle 접속 정보
String driver="oracle.jdbc.driver.OracleDriver";
String conStr="jdbc:oracle:thin:@172.16.1.1:1521:ora91";
String userid="ojt1830_12_10";
String password="oracle";
try{
//JDBC드라이버를 로딩합니다.
Class.forName(driver);
//데이터베이스에 연결을 합니다. Oracle Server IP:Port:SID 계정명 패스워드
con=DriverManager.getConnection(conStr,userid,password);
System.out.println("Oracle ora91에 접속 했습니다.");
LogWriter.LogWrite("test", "info", "Log4jTest3.oracleConnect()", userid + "계정 데이터베이스 접속 성공",null);
}catch(SQLException e){
System.out.println("SQLException:"+e);
LogWriter.LogWrite("test", "error", "Log4jTest3.oracleConnect()", userid + "Oracle 접속 에러 발생", e);
}catch(Exception e){
System.out.println("Exception:"+e.toString());
LogWriter.LogWrite("test", "fatal", "Log4jTest3.oracleConnect()", userid + "JDBC Driver 로딩 실패, 기타 에러 발생", e);
}finally{
}
return con;
}
public static void main(String args[]){
Log4jTest3 dt = new Log4jTest3();
Connection con1 = null;
try{
con1 = dt.oracleConnect();
}catch(Exception e){
System.out.println(e.toString());
}finally{
try{
if ( con1 != null) con1.close();
}catch(Exception e){
System.out.println(e.toString());
}
}
}
}
출처 : http://cafe.naver.com/rurouni20000.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=500 |
|
|
|
|
|