'TDD'에 해당되는 글 2건

  1. 2009.11.16 Log4j 설치및 사용법
  2. 2009.11.16 SVN 사용법 기초

Log4j 설치및 사용법

TDD 2009.11.16 10:53

Log4j 설치및 사용법


Log4j는 한번의 로깅을 호출함으로 로그메세지를 콘솔,텍스트파일,html 파일,xml 파일, 소켓이나 심지어는 Windosws NT Event Log,이메일 등으로 전송 할수있다.
오픈 소스 프로젝트인 Log4j는 개발자들이 매우 손쉽고 다양한 형태로 로깅을 할 수 있도록 도와줍니다.
성능또한 우수해 더이상 System.out.println을 사용하지 말자구 하네요~ http://logging.apache.org/log4j/1.2/publications.html 에 가보면 여러 Articles 이 있다.
다른 내용보단 영문이라도 쫄지말구 함 가서 보면 별거 아니다.
정 힘들다면.. 그곳에 있는 Sample source는 볼수 있을 것이다.

1.Log4j의 중요 컴포넌트

 a. Logger(Category) : 로그 파일을 작성하는 클래스이고, Appender 에 메세지를 전달하는기능
 b. Appender : 로그를 출력하는 위치
    Log4J API문서의 XXXAppender로 끝나는 클래스들의 이름을 보면, 출력위치를 짐작할 수 있다.
   http://logging.apache.org/log4j/docs/api/index.html
   ex) ConsoleAppender,FileAppender.....
 c. Layout : Appender의 출력, Appender로 로그를 생성하기 전에 메세지 형식을 만드는 클래스.
     ex) DateLayout, HTMLLayout, PatternLayout,SimpleLayout, XMLLayout 

ex) SAMPLE SOURCE

import java.io.IOException;

import org.apache.log4j.DailyRollingFileAppender;
import org.apache.log4j.Logger;
import org.apache.log4j.PatternLayout;

public class DailyLog {
 
  static Logger logger = Logger.getLogger(DailyLog.class);
 
  public static void main(String[] args) {
    String pattern = "[%d{yyyy-MM-dd HH:mm:ss}] %-5p [%l] - %m%n";
    PatternLayout layout = new PatternLayout(pattern);
   
    // 처음 생성될 로그 파일의 이름
    String filename = "DailyLog.log";
   
    // 날짜 패턴에 따라 추가될 파일 이름
    String datePattern = ".yyyy-MM-dd";
   
    DailyRollingFileAppender appender = null;
    try {
      appender = new DailyRollingFileAppender(layout, filename, datePattern);
    } catch (IOException ioe) {
      ioe.printStackTrace();
    }
   
    logger.addAppender(appender);
   
    logger.debug("Hello log4j.");
  }
}

2. Log4j.properties 설정

Log4j 를 설정하는 기본파일은 log4j.properties 이네요~ log4j.properties를 만들어 /WEB-INF/classes 밑에 놓으면 되구,Log4j를 설정하는 것은 Category(logger)에 Appender (목적지/대상/핸들러)를 더하고 각각의 Appender 에게 Layout(구성)을 저정하는 것이다.

애플리케이션에서 각 클래스는 각각의 로거를 가지거나 공통의 로거를 가질 수 있다.
Log4j는 모든 로거가 상속할 수 있는 루트 로거를 제공한다.
log4j.properties를 만들때도 맨 위에 필요한 것이 루트로거에 대한 내용이다.
Ex) 로깅 레벨
DEDUG < INFO < WARN < ERROR < FATAL

Ex) 표현식
%m : 로그내용이 출력
%p : debug, info, warn, error, fatal 등의 priority 출력
%r : 어플리케이션이 시작되어 로깅이벤트가 발생하는 시점까지의 경과시간을 밀리세컨드로 출력
%c : 예) 카테고리가 a.b.c 처럼 되어있다면 %c{2}는 b.c가 출력됩니다.
%n :  플랫폼 종속적인 개행문자가 출력된다. \r\n 또는 \n 일것이다
%d : 로깅이벤트가 일어나 날짜 출력 ( 프로그램의 실행속도를 느리게 한다.)
  예) %d{HH:mm:ss} 또는 %d{dd MMMM yyyy HH:mm:ss}
%C : 호출자의 클래스명 출력
  예) 클래스구조가 org.apache.xyz.SomeClass 처럼 되어있다면 %C{2}는 xyz.SomeClass 가 출력됩니다
%M : 로깅이 발생한 method 이름을 나타냅니다.
%F : 로깅이 발생한 프로그램 파일명을 나타냅니다.
%l : 로깅이 발생한 caller의 정보를 나타냅니다
%L : 로깅이 발생한 caller의 라인수를 나타냅니다
%x : 로깅이 발생한 thread와 관련된 NDC(nested diagnostic context)를 출력합니다.
%X : 로깅이 발생한 thread와 관련된 MDC(mapped diagnostic context)를 출력합니다.
%% : % 표시를 출력하기 위해 사용한다. 
%t : 로그이벤트가 발생된 쓰레드의 이름을 출력합니다
다음 포맷으로 출력해본다면

ex) [%c] [%C] [%d] [%F] [%l] [%L] [%m] [%M] [%n] [%p] [%r] [%t]
[test.jsp] [org.apache.jsp.test_jsp] [2005-03-10 12:37:23,561] [test_jsp.java] [org.apache.jsp.test_jsp._jspService(test_jsp.java:64)] [64] [fatal!!] [_jspService] [개행] [FATAL] [765567] [http-8080-Processor25]

Ex)Appender  Sample properties
=> ConsoleAppender 옵션
Threadhole=WARN : category 의 priority가 더 낮게 지정되어 있더라도 여기 명시된 priority 보다 낮은 메세지들은 로깅하지 않는다.
ImmediateFlush=true : 기본값은 true 로그메세지가 버퍼되지 않는다.
Target=System.err : 기본값은 System.out

log4j.rootLogger=DEBUG, A1
#log4j.rootLogger=OFF, A1
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss}] - %m%n

=> FileAppender 옵션
Threadhole=WARN : category 의 priority가 더 낮게 지정되어 있더라도 여기 명시된 priority 보다 낮은 메세지들은 로깅하지 않는다.
ImmediateFlush=true : 기본값은 true 로그메세지가 버퍼되지 않는다.
File=testlog.txt : 로깅할 파일명
Append=false : 기본값은 true이며, 파일끝에 추가하는 것을 의미한다.

=> RollingFileAppender 옵션
Threadhole=WARN : category 의 priority가 더 낮게 지정되어 있더라도 여기 명시된 priority 보다 낮은 메세지들은 로깅하지 않는다.
ImmediateFlush=true : 기본값은 true 로그메세지가 버퍼되지 않는다.
File=testlog.txt : 로깅할 파일명
Append=false : 기본값은 true이며, 파일끝에 추가하는 것을 의미한다.
MaxFileSize=100KB : KB, MB, GB 의 단위를 사용, 지정한 크기에 도달하면 로그파일을 교체한다.
MaxBackupIndex=5 : 최대 5개의 백업 파일을 유지한다.

=> DailyRollingFileAppend 옵션
Threadhole=WARN : category 의 priority가 더 낮게 지정되어 있더라도 여기 명시된 priority 보다 낮은 메세지들은 로깅하지 않는다.
ImmediateFlush=true : 기본값은 true 로그메세지가 버퍼되지 않는다.
File=testlog.txt : 로깅할 파일명
Append=false : 기본값은 true이며, 파일끝에 추가하는 것을 의미한다.
DatePattern='.'yyyy-mm : 매월 파일을 교체한다. 교체주기는 월, 주, 일, 시간, 분 별로 정할 수 있다.

log4j.rootLogger=DEBUG, A1
log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender
log4j.appender.A1.File=test.log
log4j.appender.A1.DatePattern='.'yyyy-mm-dd
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss}] %-5p [%l] - %m%n


Ex) Jdbc Sample properties


log4j.appender.R=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.R.URL=jdbc:mysql://localhost/LOG4JDemo
log4j.appender.R.user=default
log4j.appender.R.password=default
log4j.appender.R.sql=INSERT INTO JDBCTEST (Message) VALUES ('%d - %c - %p - %m')

ex) 아래의 log4j.properties 파일은 메시지의 레벨과 다른 파라미터들을 기반으로 하여 여러 Appender에 로그 메시지를 기록하도록 설정 하는 예 입니다. 콘솔에도 출력하고 out.log 파일에도 메시지를 출력 합니다.

# A sample log4j configuration file
# Create two appenders, one called stdout and the other called rolling
# 최상위 카테고리에 DEBUG로 레벨 설정 및 appender로 stdout, rolling 두개를 정의
log4j.rootLogger=DEBUG, stdout, rolling

# stdout 어펜더는 콘솔에 뿌리겠다는 정의
log4j.appender.stdout=org.apache.log4j.ConsoleAppender

# stdout 어펜더는 patternlayout을 사용하겠다는 정의
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

# 페턴은 다음과 같이 포맷팅 하겠다는 것을 정의
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L)- %m%n

# rolling 어펜더는 파일로 처리한다라고 정의
log4j.appender.rolling=org.apache.log4j.RollingFileAppender

# 로그 파일 이름은 output.log
log4j.appender.rolling.File=output.log

# 파일 최대 사이즈는 100KB로 설정
log4j.appender.rolling.MaxFileSize=100KB

# rolling 어펜더는 1개의 백업파일을 유지하겠데요~
log4j.appender.rolling.MaxBackupIndex=1

# rolling 어펜더는 패턴 레이아웃을 사용하겠다고 정의, 패턴 레이아웃 포맷
log4j.appender.rolling.layout=org.apache.log4j.PatternLayout
log4j.appender.rolling.layout.ConversionPattern=%d{ABSOLUTE} - %p %c - %m%n


3 XML 파일을 이용해 세팅

Log4j.properties 처럼 XML 파일 역시 WEB-INF/classes 폴더에 위치하면 됩니다.
그리고 파일이름은 반드시 log4j.configuration 시스템 프로퍼티에 지정하여 어떤 파일을 로딩 할것인지를 알게 해야 합니다.
Log4j.configuration 파일에서 프로퍼티를 설정 하는 방법은 다음과 같습니다.
set CATALINA_OPTS=-Dlog4j.configuration=log4j.xml
또는 자바 명령행에서 지정하는 것도 가능 합니다.
java -Dlog4j.configuration=log4j.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

    <!-- 콘솔로 보기(디버그) -->
    <appender name="CONSOLE-debug" class="org.apache.log4j.ConsoleAppender">
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%p - %C{1}  :  %M  %m %n"/>
        </layout>
    </appender>
   
    <!-- 콘솔로 보기(인포) -->
    <appender name="CONSOLE-info" class="org.apache.log4j.ConsoleAppender">
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%m ---%d %n"/>
        </layout>
    </appender>
   
    <!-- 매 날짜별 로그 파일 남기기 -->
    <appender name="LOGFILE-DAILY" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="file" value="test-daily.log"/>
        <param name="Append" value="true"/>
        <param name="DatePattern" value="'.'yyyy-MM-dd"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d %-5p [%t] %-17c{2} (%13F:%L) %3x - %m%n"/>
        </layout>
    </appender>
   
     <!-- 매 날짜별 로그 파일 남기기(로그인) -->
    <appender name="LOGFILE-DAILY-LOGIN" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="file" value="test-daily-login.log"/>
        <param name="Append" value="true"/>
        <param name="DatePattern" value="'.'yyyy-MM-dd"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d - %m%n"/>
        </layout>
    </appender>
   
     <!-- 매 날짜별 로그 파일 남기기(가입) -->
    <appender name="LOGFILE-DAILY-JOIN" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="file" value="test-daily-join.log"/>
        <param name="Append" value="true"/>
        <param name="DatePattern" value="'.'yyyy-MM-dd"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d - %m%n"/>
        </layout>
    </appender>
   
     <!-- 매 날짜별 로그 파일 남기기(탈퇴) -->
    <appender name="LOGFILE-DAILY-JOINBREAK" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="file" value="test-daily-joinbreak.log"/>
        <param name="Append" value="true"/>
        <param name="DatePattern" value="'.'yyyy-MM-dd"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d - %m%n"/>
        </layout>
    </appender>
   
    <!-- 로그 파일 100KB마다 새로 남기기 -->
    <appender name="LOGFILE-SIZE" class="org.apache.log4j.RollingFileAppender">
        <param name="file" value="test-Size.log"/>
        <param name="Append" value="true"/>
        <param name="MaxFileSize" value="100KB"/>

       <param name="MaxBackupIndex" value="5"/>  
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d %-5p [%t] %-17c{2} (%13F:%L) %3x - %m%n"/>
        </layout>
    </appender>
   
    <!-- XML 형태로 로그 파일 남기기 -->
    <appender name="LOGFILE-XML" class="org.apache.log4j.FileAppender">
        <param name="file" value="test-XML.log"/>
        <param name="Append" value="true"/>
        <layout class="org.apache.log4j.xml.XMLLayout"/>
    </appender>

    <logger name="org.apache">
        <level value="WARN"/>
    </logger>
   
    <root>
        <level value="INFO"/>
        <appender-ref ref="CONSOLE-debug"/>
       
        <!--<appender-ref ref="LOGFILE-DAILY"/>-->
        <!--<appender-ref ref="LOGFILE-SIZE"/>-->
        <!--<appender-ref ref="CONSOLE-info"/>-->
        <!--<appender-ref ref="LOGFILE-XML"/>-->
    </root>
</log4j:configuration>

신고

'TDD' 카테고리의 다른 글

Log4j 설치및 사용법  (0) 2009.11.16
SVN 사용법 기초  (0) 2009.11.16
Posted by genius3k

SVN 사용법 기초

TDD 2009.11.16 10:47

기본 개념의 이해

  • 소스 코드 버전 관리 도구: 동시 개발, 소스 충돌 회피
  • 레파지토리(repository): 저장소. 소스 코드가 버전별로 모두 저장.
  • 작업 복사본(working copy): 저장소에서 내려받은 소스 코드 작업 복사본. 로컬 작업 공간(working space)
  • 리비전(revision): 갱신 번호. 매번 수정이 발생할 때마다 증가.
  • 브랜치(branch): 가지 뻗어나가기, 여러 버전의 동시 진행 및 통합(merge)
  • 트렁크(trunk): 개발 가지들 가운데 가장 중심이 되는 줄기.
  • 태그(tags): 개발 버전의 스냅샷.
  • Import: 최초로 레파지토리에 자료를 올림. (레파지토리 중심 관점)
  • Export: 레파지토리에서 자료를 내려 받음. 버전 관리 정보 제외. (레파지토리 중심 관점)
  • Checkout: 레파지토리에서 자료를 내려 받음. 버전 관리 정보 포함.
  • Commit: 작업 영역에서의 변경내역을 레파지토리에 실제 반영하는 명령어.

초기 설정

  • 저장소 설정: [관리자 설정사항]
     # fsfs 파일시스템 타입 $ svnadmin create --fs-type fsfs repo_name # bdb 버클리 디비 타입 $ svnadmin create --fs-type bdb repo_name
    • 통상적으로 /var/svn 또는 /var/repos 위치에 저장소 디렉토리를 설정, 그 아래에서 저장소 생성
    • 아파치 DAV를 사용하여 svn에 접속할 경우에는 chown -R apache repo_name 또는 chmod -R a+w repo_name 실행.
  • 기본 디렉토리 구조 설정: trunk, branches, tags
     $ svn mkdir http://svn_server.com/svn/repo_name/project_name/trunk $ svn mkdir http://svn_server.com/svn/repo_name/project_name/branches $ svn mkdir http://svn_server.com/svn/repo_name/project_name/tags
    • 별도로 압축해서 배포하지 않는 웹 프로젝트인 경우에는 trunk, branches, tags 구조 생략 가능.
    • 통상 repo_name 까지는 관리자가 생성해서 알려줌. 그 아래 프로젝트 단위 이하 구조는 개발자가 생성.
    • repository 단위로 리비전(revision) 번호가 매겨지므로, 너무 큰 단위로 저장소를 설정하지 않는 것이 좋음.
    • 완전히 별개의 프로젝트인 경우에는 가급적 별도의 레파지토리를 설정하는 것이 좋음.
  • svn import: 최초로 레파지토리에 자료를 올림. (레파지토리 중심 관점)
     # project_name 디렉토리를 지정하는 경우 $ svn import project_name http://svn_server.com/svn/repo_name/project_name/trunk # project_name 디렉토리를 지정하지 않는 경우. 현재 디렉토리 전체가 올라감. $ svn import http://svn_server.com/svn/repo_name/project_name/trunk
    • 별도로 trunk, branches, tags 구조를 설정하지 않은 경우에는 그냥 project_name 까지만 지정.
  • svn checkout (co) : 작업 영역으로 레파지토리 내용을 내려받음. 작업 복사본(WC: working copy) 생성.
     # project_name 이라는 디렉토리 새로 생성 $ svn checkout http://svn_server.com/svn/repo_name/project_name/trunk project_name # 또는 마지막 인수를 입력하지 않으면 URL의 최종단인 basename으로 디렉토리가 생성됨. # 아래 예에서는 trunk 라는 디렉토리가 새로 생성됨. $ svn checkout http://svn_server.com/svn/repo_name/project_name/trunk
  • 기본 편집기 설정: commit 명령 실행시에 -m "메시지" 옵션을 지정하지 않으면 Editor가 뜸. 이때 사용할 편집기를 설정.
     # .profile 또는 .bash_profile안에 추가 SVN_EDITOR=/usr/bin/vim export SVN_EDITOR

주의 사항

  • svn이 걸려있는 디렉토리에서 작업을 할 경우에는 반드시 svn 명령만을 사용해서 파일 변경/삭제 작업을 수행해야 함. 파일 생성후에도 svn add 명령으로 저장소 추가를 예약해놓아야 함.
  • 디렉토리 역시 svn mkdir 명령으로 생성하거나 svn add 로 추가를 예약해야 함. 디렉토리 변경/삭제 역시 svn 명령 사용해야 함.
  • svn 걸려있는지 아닌지 구별하는 방법: svn이 걸려있는 디렉토리에는 .svn 이라는 숨겨진 디렉토리가 있음.
  • 파일 관련 시스템 명령어(cp, mv, rm)를 그대로 사용할 경우에는 svn 체계에 혼선이 생겨서 이후 변경 내용이 반영되지 못하는 문제가 발생함
  • 모든 svn 관련 작업 이후에는 svn commit 명령을 실행해줘야 svn 저장소에 반영이 됨

주요 명령어

  • svn help : 상세 사용법 출력. svn help subcommand 도 가능.
  • svn add : 새로 생성한 파일이나 디렉토리를 저장소에 추가 예약
  • svn mkdir : 디렉토리 새로 생성
  • svn delete (del, remove, rm) : 파일이나 디렉토리를 삭제 (로컬과 저장소 둘다)
  • svn move (mv, rename, ren) : 파일이나 디렉토리를 이동하거나 이름 변경
  • svn copy (cp) : 파일이나 디렉토리 복사
  • svn update (up) : 작업 영역을 저장소 정보에 맞춰서 업데이트.
  • svn commit (ci) : 작업 영역의 변경 내역을 저장소에 저장.
  • svn status (st) : 상태 보기
  • svn log : 로그 기록 확인
  • svn diff : 차이점 확인
  • svn dump : 저장소 내용을 덤프해서 파일에 저장
  • svn load : 덤프 파일 내용을 저장소에 쏟아넣음
     # 저장소 백업 $ cd /var/svn $ svnadmin dump repo_name > repo_name.dump # 저장소 복구 $ cd /var/svn $ svnadmin create repo_name $ svnadmin load repo_name < repo_name.dump
신고

'TDD' 카테고리의 다른 글

Log4j 설치및 사용법  (0) 2009.11.16
SVN 사용법 기초  (0) 2009.11.16
Posted by genius3k

티스토리 툴바