겸손한 자바스크립트(unobtrusive JavaScript)
'프로그래밍' 카테고리의 다른 글
action->jsp excel file 다운로드 (0) | 2011.02.24 |
---|---|
GET 방식 한글 꺠짐 해결법 (0) | 2011.02.24 |
숫자, 하이픈 입력가능 (0) | 2010.12.06 |
숫자만 입력가능 (0) | 2010.12.06 |
현재 날짜와의 차이(일수) 구하기 (0) | 2010.12.05 |
겸손한 자바스크립트(unobtrusive JavaScript)
action->jsp excel file 다운로드 (0) | 2011.02.24 |
---|---|
GET 방식 한글 꺠짐 해결법 (0) | 2011.02.24 |
숫자, 하이픈 입력가능 (0) | 2010.12.06 |
숫자만 입력가능 (0) | 2010.12.06 |
현재 날짜와의 차이(일수) 구하기 (0) | 2010.12.05 |
function GetNumberHipun(check_num) { var inText = check_num.value; var ret; for (var i=0; i<inText.length; i++) { ret = inText.charCodeAt(i); if (ret != 45) { if ((ret<48) || (ret>57)) { alert("숫자 또는 하이푼만 기입하여 주시기 바랍니다."); check_num.value = ""; check_num.focus(); return false } } } }
GET 방식 한글 꺠짐 해결법 (0) | 2011.02.24 |
---|---|
겸손한 자바스크립트 (0) | 2010.12.12 |
숫자만 입력가능 (0) | 2010.12.06 |
현재 날짜와의 차이(일수) 구하기 (0) | 2010.12.05 |
패턴이란 무엇인가 (0) | 2010.09.13 |
function GetNumber(check_num) { var inText = check_num.value; var ret; for (var i=0; i<inText.length; i++) { ret = inText.charCodeAt(i); if ((ret<48) || (ret>57)) { alert("숫자로만 기입하여 주시기 바랍니다."); check_num.value = ""; check_num.focus(); return false ; } } }
겸손한 자바스크립트 (0) | 2010.12.12 |
---|---|
숫자, 하이픈 입력가능 (0) | 2010.12.06 |
현재 날짜와의 차이(일수) 구하기 (0) | 2010.12.05 |
패턴이란 무엇인가 (0) | 2010.09.13 |
j2ee (0) | 2010.09.13 |
function cntTime( frYyyyMmDd) { var frDt = new Date( frYyyyMmDd.substring(0, 4), frYyyyMmDd.substring(5, 7) - 1, frYyyyMmDd.substring(8, 10) ); var toDt = new Date(); var tmp = toDt.getTime() - frDt.getTime(); var dayCnt = ( tmp / 60 / 60 / 1000 ); return dayCnt; }
1970년대, 크리스토퍼 알렉산더(Christopher Alexander)[Alen, Alen2]는 토목공학과 건축학 분야에서 패턴을 주제로 많은 책을 썼습니다.소프트웨어 커뮤니티에서도 이미 패턴에 대한 생각과 관심을 갖고 있었지만, 크리스토퍼가 그의 책에서 밝힌 패턴에 대한 아이디어를 받아들였다고 한다.
소프트웨어 분야에서 패턴은(4인의 갱, GoF) 에릭 감마, 리처드 햄, 랄프 존슨, 존 블리사이즈의 책 (GoF의 디자인 패턴(Design Patterns: Elements of Reusable Object-Oriented Software)에 의해 널리 알려졌다고 한다. 이 책이 출간된 이후, 전 세계 소프트웨어 개발팀 내부에서 패턴이 공통된 논의 주제가 되었지만, 중요하게 기억해야 할 점은 GoF들이 설명하고 있는 패턴들은 그들이 만든것이 아니라, 수많은 프로젝트에서 사용하는 디자인들을 파악하여 이를 모아 분류하고 문서로 정리한 것이다.
패턴의 정의
각 패턴에는 삼요소 규칙(three-part rule)이 적용된다. 삼요소 규칙이란
|
각 패턴에는 삼요소 규칙(three-part rule)이 적용된다. 삼요소 규칙이란
-리차드 가브리엘 |
패턴은 특정 상황에서 유용하게 쓰이며, 다른 상황에서도 유용한 아이디어다.
|
패턴의 특성
패턴 분류
J2EE 패턴 목록
티어 |
패턴 이름 |
프리젠테이션 티어(Presentation tier) |
|
비지니스 티어 |
|
통합 티어 |
|
-in 코어J2ee패턴 2판[디팍 알루어/존 크루피/댄 말크스 지음/김종호 옮김]
숫자만 입력가능 (0) | 2010.12.06 |
---|---|
현재 날짜와의 차이(일수) 구하기 (0) | 2010.12.05 |
j2ee (0) | 2010.09.13 |
플래그 레지스터 (2) | 2010.09.10 |
Fault Barrier Pattern (0) | 2010.08.26 |
-코어 j2ee 패턴 2판[디팍 알루어/존 크루피/댄 말크스 지음] 중에서
현재 날짜와의 차이(일수) 구하기 (0) | 2010.12.05 |
---|---|
패턴이란 무엇인가 (0) | 2010.09.13 |
플래그 레지스터 (2) | 2010.09.10 |
Fault Barrier Pattern (0) | 2010.08.26 |
log4j (0) | 2010.08.13 |
마이크로
프로세서실습
플래그 레지스터
조건분기명령은 비교명령이나 연산명령의 결과에 따라서 분기합니다.
그러나, 정확히 말하자면 비교명령이나 연산명령의 결과에 의해 세트된 플래그 레지스터의 값에 따라서 분기하는 것입니다. 플래그 레지스터는 여러 가지 상태를 기억하기 위한 레지스터입니다.
+------------------------------------------------------------------+
*플래그 레지스터의 각 비트의 명칭
공백인 비트는 사용하지 않읍니다.
비트 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
OF DF IF TF SF ZF AF PF CF
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+------------------------------------------------------------------+
스테이터스 플래그(status flag)
연산의 결과에 따라서 세트 혹은 리셋되는 플래그로 다음과 같은 것이 있읍니다.
-CF : 캐리플래그 (carry flag)
연산한 결과,최상의 비트로 부터의 높은 자리로 자리올림(캐리)
혹은 최상의 비트로 부터의 빌림이 발생한 경우에 1로 세트되고
그 이외의 경우 0으로 세트됩니다.
-PF :패리티 플래그(parity flag)
연산한 결과, 1로된 비트의 수가 짝수개(EVEN)일 때 1로 세트되
고 그 이외의 경우 0으로 리셋됩니다.
-AF : 보조 캐리플래그(auxiliary carry flag)
8(16)비트 연산에서,하위 4(8) 비트로 부터 상위 4 비트로 자리
올림 혹은 빌림이 발생한 경우에 1로 리셋된다. 10진 보정 명령에
있어서도 사용 됩니다.
-ZF : 제로 플래그(zero flag)
연산한 결과가 0으로 되었을 때에 1로 세트되고,그이외일 때는
0으로 리셋됩니다.
-SF :사인 플래래그(sign flag)
연산한 결과,최상의 비트가 1이 되었을 때(즉,보수표현으로
음수가 되었을 때) 1로 세트되고,그이외일 때는 0으로 리셋됩니다.
-OF : 오버플로우 플래그(overflow flag)
연산을 부호가 달린 숫자로 했을때,오버 플로우 혹은 언더 플로우
가 발생한 경우에 1로 세트되고,그 이외일 때는 0으로 리셋됩니다.
콘트롤 플래그(control flag)
CPU의 동작 상태 를 제어하는 레지스터로 플래그 제어 명령이나 플래그 전송명령을 사용하여 프로그램 중에서 세트 혹은 리셋됩니다.
-DF : 디렉션 플래그(direction flag)
스트링 조작을 할 때에 이 플래그가 0이면 번지를 나타내는
레지스터값이 자동으로 증가하고 1이면 레지스터값은 자동적으로
감소합니다.
-IF : 인터럽트 플래그(interrupt flag)
이 플래그가 0 일 때 INTR단자로 부터의 외부 인터럽트 요구는
무시되고,1 일 때에는 외부 인터럽트 요구를 받아 들일 수 있게
됩니다.
-TF : 트랩 플래그(trap flag)
이 플래그가 0일 때 CPU 는 보통대로 명령을 실행한다.이 플래그가
1일 때 CPU 는 한 명령을 실행할 때마다 자동적으로 내부 인터럽트
(INT1)가 발생하고,인터럽트 처리 루틴으로 들어간다.(단, 이 처리
루틴의 실행중에는 트랩플래그는 0으로 클리어 된다).이 플래그는
프로그램의 추적에 사용됩니다.
플래그 레지스터 제어 명령 과 전송 명령
STC (Set Carry flag) 캐리플러그를 1로 세트한다.
CLC (CLear Carry flag) 캐리플러그를 0으로 리셋한다.
CMC (CoMplement Carry flag) 캐리플래그가 0이면 1로 1이면 0으로 세트한다.
STD(Set Direction flag) 디렉션 플래그를 1로 세트한다.
CLD(CLear Direction flag) 디렉션 플래그를 0으로 리셋한다
STI(Set Interrupt-enable flag) 인터럽트 플래그를 1로 세트한다.
CLI(CLear Interrupt-enable flag) 인터럽트 플래그를 0으로 세트한다.
LAHF(Load AH from Flags) 플래그 레지스터의 하위 8비트를 AH레지
스터로 전송한다.사용하지 않는 비트의 값은 정해져 있지 않다.
SAHF(Store AH into Flags) AH레지스터의 내용을 플래그레지스터의하위 8비트에 전송한다.
PUSHF (PUSH Flas onto stack) 플래그 레지스터의 내용을 스택(stag)상에 푸쉬(PUSH:삽입)한다.
POPF (POP Flags off stack) 스택 위의 워드데이터를 플래그레지스터에 POP한다.
다음 두 명령의 차이를 알아 봅시다.
CMP AX,BX ;AX레지스터로 부터 BX 레지스터를 가상적으로 뺀
다음 그 결과에 따라 플래그 레지스터만을 변화시킨다.
SUB AX,BX ;AX레지스터에서 BX 레지스터를 뺀다음 그결과에 따라
플래그 레지스터를 변화 시킨다.
결국 두명령의 결과 플래그 레지스터의 결과는 똑 같읍니다.
플래그 레지스터의 값은 산술 논리연산을 행할 때에 세트 리셋되고,전송
명령이나 분기명령에서는 변화하지 않읍니다.따라서 비교명령과 분기명령
사이에 전송명령등을 사용할 수 있읍니다.
CODE SEGMENT
ASSUME CS:CODE
MOV AX,1234H
MOV BX,8888H
CMP BX,0
JB L1
JL L1
NOP
8888H를 부호없는 숫자로 간주하면 0보다 크므로
JB에서는 분기하지 않는다 그러나 부호있는 숫자로
보면 0보다 작으므로 JL에서 분기한다.
L1: CMP AX,BX
JG L2 ;부호있는 숫자로 보았을 때 AX가 크므로 JG에서 분기한다.
JA L2
NOP
L2: ADD AX,8000H
JC L3
JS L3 ;1234H에 8000H를 더하면 9234H가 된다.자리 올림이
생기지 않으므로 캐리플러그는 0이 된다.그러나 최상위
비트가 1이 되므로 사인 플러그는 1이 된다.
따라서 JC 에서는 분기하지 않고JS에서 분기한다.
NOP ;아무것도 하지 않는다는 명령
L3: ADD AX,8000H ;두 수를 더하면 자리올림이 발생하고 결과는 1234H
가 된다.이때 캐리 플러그는 1로 세트된다.제로가
아니므로 제로 플러그는 0이다.
MOV AX,0
JZ L4
JC L4 ; 캐리플러그가 1이므로 분기한다.
NOP
L4: MOV AX,0FFFFH
ADD AX,1
JC L5
NOP
L5: CLC ;CLC는 clear carry로서 캐리플러그를 0으로 만든다.
MOV AX,0FFFFH
INC AX ;INC명령에 의해 자리 올림이 생긴 경우에는 캐리
플러그의 값은 변화하지 않는다.
JC L6
JE L6
NOP
L6: MOV AH,4CH
INT 21H
CODE ENDS
END
플래그 레지스터를 보는 방법
+-----------+----+----+----+----+----+----+----+----+
플래그 이름 OF DF IF SF ZF AF PF CF
+-----------+----+----+----+----+----+----+----+----+
0 NV UP DI PL NZ NA PO NC
+-----------+----+----+----+----+----+----+----+----+
1 OV DN EI NG ZR AC PE CY
+-----------+----+----+----+----+----+----+----+----+
약자를 읽어 내는 방법
NV:not overflow OV:overflow
uP:up DN:down
DI:disable interrupt EI:enable interrupt
PL:plus NG:negative
NZ:not zero ZR:zero
NA:not auxiliary carry AC:auxiliary carry
PO:parity odd PE:parity even
NC:not carry CY:carry
INC명령과 DEC명령은 캐리플래그에 영향을 주지 않읍니다.
-T
AX=1234 BX=0000 CX=003F DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=54EF ES=54EF SS=54FF CS=54FF IP=0003 NV UP EI NG NZ NA PE NC
54FF:0003 BB8888 MOV BX,8888
-T
AX=1234 BX=8888 CX=003F DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=54EF ES=54EF SS=54FF CS=54FF IP=0006 NV UP EI NG NZ NA PE NC
54FF:0006 83FB00 CMP BX,+00
-T
AX=1234 BX=8888 CX=003F DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=54EF ES=54EF SS=54FF CS=54FF IP=0009 NV UP EI NG NZ NA PE NC
54FF:0009 7203 JB 000E
BX레지스터와 0H 의 비교 결과에 따라 플래그레지스터가 세트됩니다.
뺄셈결과 8888H이므로 최상의 비트는 1이 되고 사인플래그는 NG(음수)가
됩니다.빌림이 발생하지 않았으므로 캐리플러그는 NC(0) 가되고 오버플래그
는 NV(0)가 됩니다.
-T
AX=1234 BX=8888 CX=003F DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=54EF ES=54EF SS=54FF CS=54FF IP=000B NV UP EI NG NZ NA PE NC
54FF:000B 7C01 JL 000E
-Q
LOOP 명령어
- LOOP OPR
- OPR : short label
- 8 bit displacement(-126 ~ +129)
- (CX) <- (CX) - 1
jump if (CX) <> 0
분기(branch)명령어
- PC의 값의 변경
. 순차적인 프로그램의 진행순서가
다른 부분으로 이동하여 수행
- 대표적인 프로그램 제어 명령어
- 분기명령
. 조건부 분기명령
. 무조건 분기명령
- 스킵(skip)
. 주소가 필요없는 무주소 명령어
- 콜(call)과 리턴(return) 명령어
. 서브루틴과 연관되어 사용
- 비교명령어와 테스트명령어
. 특정 상태를 나타내는 레지스터를 조정하므로써
후에 분기를 일어키게 하는 역할 수행
. 비교명령어는 두수의 크기를 비교하고,
테스트(test) 명령은 두수를 AND시켜서 특정 상태를 나타나는 비트를 조정
상태 비트 조건
- 상태비트: 조건 코드(condition code)나 플래그(flag)
- 상태 레지스터 비트
. 4개의 상태비트 V,Z,S,C
1) C비트: ALU의 출력 캐리
2) S비트: ALU의 연산결과에서 부호 비트
3) Z비트: ALU의 연산결과의 워드
4) V비트: C8, C9캐리의 excluive-OR 결과
조건부 분기 명령어
- 조건부 분기 명령어 표
. 각 니모닉은 분기를 나타내는 B와 조건이름 약자로서 구성하며
반대조건의 경우 N을 추가
- 비교 명령어
. 두개의 피연산자의 차이를 계산
. 부호가 있는 경우와 부호없는 경우의 비교
패턴이란 무엇인가 (0) | 2010.09.13 |
---|---|
j2ee (0) | 2010.09.13 |
Fault Barrier Pattern (0) | 2010.08.26 |
log4j (0) | 2010.08.13 |
경고: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.j2ee.server:????????' did not find a matching property. (0) | 2010.07.19 |
JBOSS에 배포한 EJB3.0에서 runtime 예외가 발생하면 작업중이던 트랜잭션을 롤백 처리하고javax.ejb.EJBTransactionRolledbackException예외를 던진다. 구글에 보니 아래와 같은 형식으로 잡아 처리를 하는 소스를보았고, 저게 Fault Barrier Pattern을 이용한 것이라 되어있다.
EJBException을 캐치해도 되지만 Fault Barrier Pattern 형태를 약간 이용해서 다른 예외로
클라이언트에게 던졌다.
*하지만 이렇게 인터셉터를 걸어둘경우에 롤백처리가 되는지 확인을 하지 않았다.
import java.util.Arrays; import javax.interceptor.AroundInvoke; import javax.interceptor.InvocationContext; import org.jboss.logging.Logger; public class FaultBarrierInterceptor { @AroundInvoke public Object intercept(final InvocationContext invocationContext) throws Exception { try { return invocationContext.proceed(); } catch (final RuntimeException e) { final Logger logger = Logger.getLogger(invocationContext .getMethod().getDeclaringClass()); logger.error("A fault occured during service invocation:" + "\n-METHOD: " + invocationContext.getMethod() + "\n-PARAMS: " + Arrays.toString(invocationContext.getParameters()), e); throw new TechnicalException(); } } }TechnicalException.class
import javax.ejb.EJBException; public class TechnicalException extends EJBException { }비지니스 부분
@Local @Interceptors( { FaultBarrierInterceptor.class }) public interface AlbumDAO {
…
j2ee (0) | 2010.09.13 |
---|---|
플래그 레지스터 (2) | 2010.09.10 |
log4j (0) | 2010.08.13 |
경고: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.j2ee.server:????????' did not find a matching property. (0) | 2010.07.19 |
The Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path (0) | 2010.07.19 |
LOG4J
I. 들어가면서.. 그리고 log4j
log4j는 자바 어플리케이션에서 빠르고 효과적으로 로깅 할 수 있도록 도와주는 오픈 소스 프로젝트입니다.
로깅(logging)은 코드의 가독성을 떨어뜨리는 단점이 있지만 애플리케이션에 문제가 있을 때 개발자가 자세한 상황을 파악할 수 있도록 해 주며 테스팅시 빠질 수 없는 요소입니다.
아마도 여러분들은 여러 어플리케이션이 추가되면서 각 개발자들만의 독특한 로깅방식이 서로 썩이고 얽혀서 화면에 나타나는것을 많이 봤을겁니다 -_-;
즉 로깅방법을 통일할 필요가 있는것이죠. 모든 개발자가 특정 포맷에 맞추어서 로깅 한다면 한결 로깅하기도 편하겠지요
오픈 소스 프로젝트인 Log4j는 개발자들이 매우 손쉽고 다양한 형태로 로깅을 할 수 있도록 도와줍니다. 성능또한 우수해 더이상 System.out.println을 사용할 필요가 없습니다.
II. 다운로드
다운로드 http://logging.apache.org/log4j/docs/download.html
매뉴얼 http://logging.apache.org/log4j/docs/documentation.html
API spec http://logging.apache.org/log4j/docs/api/index.html
III. LOG4J 구조
일단 log4j를 잘 모르지만 그 구조만 살짝 살펴보고 넘어갑시다
log4j는 크게 3가지 요소로 구성되며 그 구조는 다음과 같습니다
① Logger(Category) : 로깅 메세지를 Appender에 전달합니다.
② Appender : 전달된 로깅 메세지를 파일에다 기록할 것인지, 콘솔에 출력할 것인지
아니면 DB에 저장할 것인지 매개체 역활을 합니다.
③ Layout : Appender가 어디에 출력할 것인지 결정했다면 어떤 형식으로 출력할 것이지
출력 layout을 결졍합니다.
쉽죠?
IV. LOG4J 로깅 레벨
log4j는 다양한 로깅레벨을 지원합니다.
① FATAL : 가장 크리티컬한 에러가 일어 났을 때 사용합니다.
② ERROR : 일반 에러가 일어 났을 때 사용합니다.
③ WARN : 에러는 아니지만 주의할 필요가 있을 때 사용합니다.
④ INFO : 일반 정보를 나타낼 때 사용합니다.
⑤ DEBUG : 일반 정보를 상세히 나타낼 때 사용합니다.
만약 로깅 레벨을 WARN 으로 설정하였다면 그 이상 레벨만 로깅하게 됩니다.
즉 WARN, ERROR, FATAL 의 로깅이 됩니다.
V. 샘플코드 1
jsp에서 사용하는 예제가 없어 만들어 봤습니다.
test.jsp
<%@ page contentType="text/html;charset=MS949"
import="org.apache.log4j.Logger" %>
<%!
static Logger logger = Logger.getLogger("test.jsp");
%>
<%
logger.fatal("fatal!!");
logger.fatal("fatal2!!", new NullPointerException("널입니다요"));
logger.error("error!", new NumberFormatException());
logger.error("error!2");
logger.warn("warn");
logger.info("info");
logger.debug("debug");
%>
결과 콘솔화면
① static Logger logger = Logger.getLogger("test.jsp");
static 메소드 getLogger를 통해 logger 인스턴스를 가져옵니다.
getLogger에는 파라미터로 스트링 혹은 클래스를 사용하는데 jsp에서는 클래스를 파라미터로 주기에는 좀 애매합니다. 그냥 스트링으로 주도록 하지요
② logger.fatal("fatal!!");
logger.fatal("fatal2!!", new NullPointerException("널입니다요"));
logger에 fatal 레벨의 메세지를 전달합니다. 다음 두가지 메소드를 지원하는군요
fatal(Object message)
fatal(Object message, Throwable t)
각 레벨마다 위처럼 두가지 메소드를 지원합니다.
지원 메쏘드
logger.fatal(Object message)
logger.fatal(Object message, Throwable t)
logger.error(Object message)
logger.error(Object message, Throwable t)
logger.warn(Object message)
logger.warn(Object message, Throwable t)
logger.info(Object message)
logger.info(Object message, Throwable t)
logger.debug(Object message)
logger.debug(Object message, Throwable t)
VI. 샘플코드 2
서블릿의 경우 다음과 같이 코딩하면 되겠군요
TestServlet.java
import javax.servlet.*;
import javax.servlet.http.*;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class TestServlet extends HttpServlet {
static Logger logger = Logger.getLogger(TestServlet.class);
public void init(ServletConfig config) throws ServletException {
super.init(config);
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
...
logger.info("Hellow World~");
...
} catch (Exception e) {
logger.error("Error at TestServlet", e);
}
}
}
VII. LOG4J 설정
log4j 설정은 프로그램 내에서 할 수 있지만 설정파일을 사용함으로서 좀더 유연하게 log4j환경을 만들 수 있습니다.
① 프로그램에서 설정
<%@ page contentType="text/html;charset=MS949"
import="org.apache.log4j.*,java.io.* "
%>
<%!
static Logger logger = Logger.getLogger("log4j.jsp");
%>
<%
String layout = "%d %-5p [%t] %-17c{2} (%13F:%L) %3x - %m%n";
String logfilename = "DailyLog.log";
String datePattern = ".yyyy-MM-dd ";
PatternLayout patternlayout = new PatternLayout(layout);
DailyRollingFileAppender appender = new DailyRollingFileAppender(patternlayout, logfilename, datePattern);
logger.addAppender(appender);
logger.setLevel(Level.INFO);
logger.fatal("fatal!!");
%>
② property 파일에 설정
log4j.properties를 만들어 /WEB-INF/classes 밑에 놓으세요
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=output.log
log4j.appender.rolling.Append=true
log4j.appender.rolling.MaxFileSize=500KB
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
#최상위 카테고리에 INFO로 레벨 설정 및 appender로 stdout, rolling을 정의
log4j.rootLogger=INFO, 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=%d %-5p [%t] %-17c{2} (%13F:%L) %3x - %m%n
#역시나 rolling 어펜더는 파일로 처리한다라고 정의
log4j.appender.rolling=org.apache.log4j.DailyRollingFileAppender
#로그 파일 이름은 output.log
log4j.appender.rolling.File=output.log
#true면 톰캣을 내렸다 올려도 파일이 리셋되지 않습니다.
log4j.appender.rolling.Append=true
#파일 최대 사이즈는 500KB로 설정
log4j.appender.rolling.MaxFileSize=500KB
#파일 포맷은 output.log.2005-03-10 으로 관리하겠다고 정의
log4j.appender.rolling.DatePattern='.'yyyy-MM-dd
#역시나 rolling 어펜더는 패턴 레이아웃을 사용하겠다고 정의
log4j.appender.rolling.layout=org.apache.log4j.PatternLayout
#rolling 어펜더는 패턴 레이아웃 포맷
log4j.appender.rolling.layout.ConversionPattern=%d %-5p [%t] %-17c{2} (%13F:%L) %3x - %m%n
VIII. 설정 포맷
① 로그파일명 포맷 (DatePattern)
로그파일명 포맷입니다. 날짜, 시간 및 분단위로까지 로그 파일을 분리할 수 있습니다.
형식
설명
'.'yyyy-MM
매달 첫번째날에 로그파일을 변경합니다
'.'yyyy-ww
매주의 시작시 로그파일을 변경합니다.
'.'yyyy-MM-dd
매일 자정에 로그파일을 변경합니다.
'.'yyyy-MM-dd-a
자정과 정오에 로그파일을 변경합니다.
'.'yyyy-MM-dd-HH
매 시간의 시작마다 로그파일을 변경합니다.
'.'yyyy-MM-dd-HH-mm
매분마다 로그파일을 변경합니다.
② PatternLayout 포맷
로그자체를 어떤 포맷으로 남길지 결정합니다.
layout에는 HTMLLayout, PatternLayout, SimpleLayout, XMLLayout등이 있으며 PatternLayout이 일반적으로 가장 많이 쓰입니다.
형식
설명
%p
debug, info, warn, error, fatal 등의 priority 가 출력된다.
%m
로그내용이 출력됩니다
%d
로깅 이벤트가 발생한 시간을 기록합니다.
포맷은 %d{HH:mm:ss, SSS}, %d{yyyy MMM dd HH:mm:ss, SSS}같은 형태로 사용하며 SimpleDateFormat에 따른 포맷팅을 하면 된다
%t
로그이벤트가 발생된 쓰레드의 이름을 출력합니다.
%%
% 표시를 출력하기 위해 사용한다.
%n
플랫폼 종속적인 개행문자가 출력된다. \r\n 또는 \n 일것이다.
%c
카테고리를 표시합니다
예) 카테고리가 a.b.c 처럼 되어있다면 %c{2}는 b.c가 출력됩니다.
%C
클래스명을 포시합니다.
예) 클래스구조가 org.apache.xyz.SomeClass 처럼 되어있다면 %C{2}는 xyz.SomeClass 가 출력됩니다
%F
로깅이 발생한 프로그램 파일명을 나타냅니다.
%l
로깅이 발생한 caller의 정보를 나타냅니다
%L
로깅이 발생한 caller의 라인수를 나타냅니다
%M
로깅이 발생한 method 이름을 나타냅니다.
%r
어플리케이션 시작 이후 부터 로깅이 발생한 시점의 시간(milliseconds)
%x
로깅이 발생한 thread와 관련된 NDC(nested diagnostic context)를 출력합니다.
%X
로깅이 발생한 thread와 관련된 MDC(mapped diagnostic context)를 출력합니다.
예시) (같은 색끼리 보시면 됩니다)
위의 test.jsp를 다음 포맷으로 출력해본다면
[%c] [%C] [%d] [%F] [%l] [%L] [%m] [%M] [%n] [%p] [%r] [%t] [%x] [%X]는 다음과 같다
[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] [] []
=============================================
본문서는 자유롭게 배포/복사 할수 있지만
이문서의 저자에 대한 언급을 삭제하시면 안됩니다
저자 : GoodBug (unicorn@jakartaproject.com)
최초 : http://www.jakartaproject.com
=============================================
[출처] System.out.println를 버리고 Log4j로 Log를 관리해봅시다. (자바(java)초보스터디) |작성자 너는모니
Fault Barrier Pattern (0) | 2010.08.26 |
---|---|
log4j (0) | 2010.08.13 |
The Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path (0) | 2010.07.19 |
eclipse에러 persem space error (0) | 2010.07.14 |
오라클 커밋 메모리 설정 (0) | 2010.07.09 |