Log4J 적용 사례(따라하기) - 손정호 | |
![]() | |
![]() |
|
'프로그래밍 > Library' 카테고리의 다른 글
[펌] 가상주소 구현 (0) | 2007.11.28 |
---|---|
[펌] 404 Error (0) | 2007.11.28 |
[펌] JSP에서 원하는 Appender 선택하여 쓰기 (0) | 2007.11.28 |
[펌] WEBLOGIC + LOG4J (0) | 2007.11.28 |
[펌] Log4J... (0) | 2007.11.28 |
Log4J 적용 사례(따라하기) - 손정호 | |
![]() | |
![]() |
|
[펌] 가상주소 구현 (0) | 2007.11.28 |
---|---|
[펌] 404 Error (0) | 2007.11.28 |
[펌] JSP에서 원하는 Appender 선택하여 쓰기 (0) | 2007.11.28 |
[펌] WEBLOGIC + LOG4J (0) | 2007.11.28 |
[펌] Log4J... (0) | 2007.11.28 |
JSP에서 원하는 Appender 선택하여 쓰기
참고로 이글의 원저자는 제가 아니므로 퍼가셔서 사용하실때 신중해주시기 바랍니다
만약 log4j 가 처음이라면 이 카테고리의 다음 포스트를 먼저 필독하세요
- log4j 웹에서 사용하기
- log4j 고급스럽게 사용하기
I. 먼저 log4j 프로퍼티 파일입니다
log4j.properties
log4j.logger.jsp1=INFO, stdout1
log4j.logger.jsp2=INFO, stdout2
jsp1과 jsp2의 두개의 logger를 정의합니다
jsp1 logger는 appender로 stdout1을 사용하며, jsp2 logger는 appender로 stdout2로 사용한다는 의미입니다
log4j.additivity.jsp1=false
additivity 속성은 jsp1 logger를 상위 로거(root logger)의 속성을 삭송받지 않겠다는 의미입니다
만약 이 속성이 없으면 동일한 메세지가 여러번 로깅될 것입니다
이하 속성은
http://www.jakartaproject.com/article/jakarta/1110438405982 등의 사이트를 참고하세요
II. JSP 샘플 소스
test_jsp1_appender.jsp
로깅 메세지
test_jsp2_appender.jsp
로깅 메세지
[펌] 404 Error (0) | 2007.11.28 |
---|---|
[펌] Log4J 적용 사례(따라하기) (0) | 2007.11.28 |
[펌] WEBLOGIC + LOG4J (0) | 2007.11.28 |
[펌] Log4J... (0) | 2007.11.28 |
[펌] Log4j를 사용하여 Tomcat 5.x로깅 설정하기 (0) | 2007.11.28 |
WEBLOGIC + LOG4J |
|
Unix/Linux | 2007/05/11 (금) 12:11 |
| |||
본론으로 들어가자. 1. log4j를 웹로직에서 쓰자. 웹로직에서의 log4j를 쓰는 방법에 대해서 많이 생각을 해봤다. 좀처럼 쉽지 않았음 T.T 원리는 간단한데 말이다. 일단 log4j의 특성을 알아야 한다. 이 log를 적기 위해 별별 opensoure를 뒤져야 했다. 몇몇 프레임웍및 opensource 혹은 상용소스들을 decompile해서 소스를 뒤졌다. log4j를 이렇게 많이 쓰면서... 이렇게 자료가 없단말인가? 때문에 보다 객관적이고 정확한 방법으로 log를 쓰고 싶었다. 다른 분들도 보고 있기 때문에.... 언제나 log를 쓰면서 느끼는건데 부끄럽다. 그 결론을 나름대로 내려보면
그럼 3번을 쓰는 방법을 알아보자. 그냥 T.T
2. 환경설정
log4j.xml
3. 헉 정말로 저게 끝이단 말인가? 그져 코딩에(jsp, servlet, ejb 등등...) 아래의 예처럼 코딩만하면 된다.
4. web.xml의 수정 환경 설정이 이것 뿐이라는 말은 t.t 하나 더 있기는 하다. 우선 web.xml을 열어 이렇게 수정한다.
이건 뭐란말인가? 이것의 정체를 알려면 이전에 log에서 DomConfigurator를 찾아보기 바란다. 이것은 properties를 메모리에 로딩해서 범용적으로 쓰기 위함이다. 이제 이것의 servlet을 보도록 하자. 4. Config용 Servlet작성 org.new21.lovelazur.conf.Log4jInit
이것을 compile해서 WEB-INF 아래에 넣어주면 된다. 5. log확인 T.T 이것을 잘 따라했다면...아래와 같은 로그를 볼수 있다. 로그 파일 이름은 log4j.xml에 기술한 Logging4J.log 이다. 그리고 이 로그는 주기적으로 backup을 받으므로 착오없길 바란다.
6. 잡소리 T.T
|
[펌] Log4J 적용 사례(따라하기) (0) | 2007.11.28 |
---|---|
[펌] JSP에서 원하는 Appender 선택하여 쓰기 (0) | 2007.11.28 |
[펌] Log4J... (0) | 2007.11.28 |
[펌] Log4j를 사용하여 Tomcat 5.x로깅 설정하기 (0) | 2007.11.28 |
[펌] log4j 설정법 (0) | 2007.11.28 |
/**
* Created on 2004. 3. 05.
*
*
* @author 짱가
*
* *******************************************************
* 코드수정히스토리
* 날짜 작업자 내용
* 2004. 3. 3. 짱가
* *******************************************************
*
*/
/**
* System.out.println("[WARN] : " + e.toSting() );
* 이런식으로 코딩해본적 있을것이다. 혹시라도 로그를 빼달라고 하면 모두들
* System.out.println("[WARN] : " + e.toSting() ); //라고 해본사람들이 꽤될것이다.
* 컴파일 했다가 말았다가 어느게 시스템 Debug용이고 어느게 뭔지 .....
* 프로그래밍이 끝나고 운용에 들어가면서 속도 향상을 위해 클라이언트가 FATAL에러만 빼고 모두 빼달라고 했다던지
* 혹은 운용중에 에러를 잡기위해 어느단계까지는 모두 나오게 해야한다던지 할때 이런기능이 없다면
* 아마 소스코드는 IF문과 System.out.println() 으로 뒤범벅이 될것이다.
*
*
* 로그레벨이라는 개념을 사용하면 약간 수고를 덜수 있다.
* DEBUG < INFO < WARN < ERROR < FATAL
* 보통 로그level에서 DEBUG가 가장작고 FATAL이 가장크다. 그래서 위의 예제 결과는 아래와 같이 나온다.
* 결과를 봐서 알겠지만 예제에서 WORN을 LogLevel로 삼았기 때문에 위의 그림과 같게 아래의 결과가 나온다.
* java.lang.Object
*|
* +--org.apache.log4j.Category
* |
* +--org.apache.log4j.Logger
* 보는 바와 같이 Logger class는 Category의 child class였다.
*
*
*
*
* API의 일부....
*
* Constructor Summary
* protected Logger(String name)
*
* Method Summary
*
* 1) static Logger getLogger(Class clazz) --- Same as calling getLogger(clazz.getName()).
*
* 2) static Logger getLogger(String name) --- Retrieve a logger by name.
*
* 3) static Logger getLogger(String name, LoggerFactory factory) ---Like getLogger(String)
* except that the type of logger instantiated depends on the type
* returned by the LoggerFactory.makeNewLoggerInstance(java.lang.String) method of the factory parameter.
*
* 4) static Logger getRootLogger() --- Retrieve the root logger.
*
* ----------------------------------------------------------------------------------------------------
* 1)과 2번은 클라스로 근본적으로 같고 예를들면 Logger.getLogger( xxxx.class.getName( ) )
* 이런식으로 쓰므로 1번과 2번은 근본적으로 같다고 볼수 있다.
* 3)은 LoggerFactory에 의해 불리우는것에 따라 logger type이 달라지고....
* 4)째는 모든 Logger는 부모가 있는데 이 부모logger를 사용가능하지만 별로 권장하지 않는다고 한다.
* http://www.onjava.com/lpt/a/2525 을 참조하기 바란다.
* 이글에 보면 Tomcat에서의 사용법까지 나와있으며 어떻게 로그를 남기는것이 효율적인지에 대하여 적고 있다.
*--------------------------------------------------------------------------------------
*
* logger class는 Category 클라스의 setLevel( )을 호출하게 되면 level이 정해진다.
* http://logging.apache.org/log4j/docs/api/org/apache/log4j/Level.html 에서 보는바와같이 level의 종류는
* 코드:
* static Level ALL
* static Level DEBUG
* static Level ERROR
* static Level FATAL
* static Level INFO
* static Level OFF
* static Level WARN 와같다.
* http://logging.apache.org/log4j/docs/api/org/apache/log4j/Category.html
* 실제 로그를 뿌리는 메서드들을 발견할수 있을것이다.
*
* Log4j 는 기본적으로 다섯개의 우선권(이하 Priority) 등급으로 메세지를 로깅할 수 있다.
* 1. 완성된 어플리케이션에서는 출력되지 않아야 할 디버깅 메세지들을 쓰기위해 debug 를 사용하라.
* 2. 어플리케이션의 verbose 모드에서 출력될만한 메세지들을 로깅하기 위해 info 를 사용하라.
* 3. 어플리케이션이 이상없이 계속 실행될 수 있는 정도의 경고메세지를 로깅하기 위해 warn 을 사용하라.
* 4. 어플리케이션이 그럭저럭 돌아갈만한 정도의 에러베세지를 로깅하기 위해 error 를 사용하라.
예를들어 관리자에 의해 주어진 설정인자가 올바르지 않아 하드코딩된 기본값을 사용해야 할 경우.
* 5. 로깅후에 애플리케이션이 비정상적으로 종료될 치명적인 메세지를 로깅하기 위해 fatal 을 사용하라.
*****************************************************************************
*
* 여기서 작성한 클래스는 각 기능 별로 txt로 생성하는 로그
* html로 생성하는 로그
* pattern matching을 사용하는 로그
* xml로 생성하는 로그
* 그리고 configuration file로 xml을 사용하여 log파일로 생성하고
* 그 log파일이 일정 사이즈가 될때 증가시키는 로그로 나뉘어져 있다
* 참고로 각 실행시에 main으로 실행한후 메소드 명만 수정하였으므로 실행은 그렇게 하면 실행이 가능하다.
*
*****************************************************************************
*
*/
import java.io.FileOutputStream;
import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.ConsoleAppender;
import org.apache.log4j.FileAppender;
import org.apache.log4j.HTMLLayout;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.PatternLayout;
import org.apache.log4j.SimpleLayout;
import org.apache.log4j.WriterAppender;
import org.apache.log4j.xml.DOMConfigurator;
import org.apache.log4j.xml.XMLLayout;
public class Logging4J {
// Logger.getInstance()의 실체는 Category.getInstance()이며,
// Category가 반환되기때문이다. 그리고 이 Category 클래스나 getInstance()
// 메소드는 추천 되지 않는 API인것으로 알려져있다.
// Logger의 취득은 Logger.getLogger()로 하기 바란다
static Logger logger = Logger.getLogger(Logging4J.class);
public void consoleLog() {
Logger logger = Logger.getLogger("loggerTest");
BasicConfigurator.configure();
logger.setLevel(Level.WARN);
logger.debug("this is debug!!!");
logger.info("this is info!!!");
logger.warn("this is warn!!!");
logger.error("this is error!!!");
logger.fatal("this is fatal!!!");
}
/**
* 생성 로그 txt
* DEBUG - debug!!!
* INFO - info!!!
* WARN - warn!!!
* ERROR - error!!!
* FATAL - fatal!!! *
*/
public void txtLog() {
SimpleLayout layout = new SimpleLayout();
FileAppender appender = null;
try {
appender = new FileAppender(layout, "Logging4J.txt", false);
} catch (Exception e) {
}
// FileAppender(Layout layout, String filename) : constructor
// FileAppender(Layout layout, String filename, boolean append)
logger.addAppender(appender);
logger.setLevel(Level.DEBUG);
logger.debug("debug!!!");
logger.info("info!!!");
logger.warn("warn!!!");
logger.error("error!!!");
logger.fatal("fatal!!!");
}
// html은 너무 길다.. ^^;;
public void htmlLog() {
HTMLLayout layout = new HTMLLayout();
WriterAppender appender = null;
try {
FileOutputStream output = new FileOutputStream("Logging4J.html");
appender = new WriterAppender(layout, output);
} catch (Exception e) {
}
// FileAppender(Layout layout, String filename) : constructor
// FileAppender(Layout layout, String filename, boolean append)
// Logger.getInstance()의 실체는 Category.getInstance()이며,
// Category가 반환되기때문이다. 그리고 이 Category 클래스나 getInstance() 메소드는
// 추천 되지 않는 API인것으로 알려져있다.
// Logger의 취득은 Logger.getLogger()로 하기 바란다
logger.addAppender(appender);
logger.setLevel(Level.DEBUG);
logger.debug("HERE is some Debug!!!");
logger.info("HERE is some info!!!");
logger.warn("HERE is some WARN!!!");
logger.error("HERE is some ERROR!!!");
logger.fatal("HERE is some FATAL!!!");
}
/**
* Classname: Logging4J
* Date in ISO8601 format: 2004-03-04 11:08:43,950
* 이벤트 위치: Logging4J.main(Logging4J.java:194)
* 메시지 : Here is some DEBUG
*
* Classname: Logging4J
* Date in ISO8601 format: 2004-03-04 11:08:43,950
* 이벤트 위치: Logging4J.main(Logging4J.java:195)
* 메시지 : Here is some INFO
*
* Classname: Logging4J
* Date in ISO8601 format: 2004-03-04 11:08:43,950
* 이벤트 위치: Logging4J.main(Logging4J.java:196)
* 메시지 : Here is some WARN
*
* Classname: Logging4J
* Date in ISO8601 format: 2004-03-04 11:08:43,950
* 이벤트 위치: Logging4J.main(Logging4J.java:197)
* 메시지 : Here is some ERROR
*
* Classname: Logging4J
* Date in ISO8601 format: 2004-03-04 11:08:43,950
* 이벤트 위치: Logging4J.main(Logging4J.java:198)
* 메시지 : Here is some FATAL
*
*
*/
public void patternLog() {
// Note, %n is newline
String pattern = "Classname: %C %n";
pattern += "Date in ISO8601 format: %d{ISO8601} %n";
pattern += "이벤트 위치: %l %n";
pattern += "메시지 : %m %n %n";
PatternLayout layout = new PatternLayout(pattern);
ConsoleAppender appender = new ConsoleAppender(layout);
logger.addAppender(appender);
logger.setLevel((Level) Level.DEBUG);
logger.debug("Here is some DEBUG");
logger.info("Here is some INFO");
logger.warn("Here is some WARN");
logger.error("Here is some ERROR");
logger.fatal("Here is some FATAL");
}
// xml로 기록
public void xmlLog() {
XMLLayout layout = new XMLLayout();
//option setting
layout.setLocationInfo(true);
FileAppender appender = null;
try {
appender = new FileAppender(layout, "Logging4J.xml", false);
} catch (Exception e) {
}
logger.addAppender(appender);
logger.setLevel((Level) Level.DEBUG);
logger.debug("Here is some DEBUG");
logger.info("Here is some INFO");
logger.warn("Here is some WARN");
logger.error("Here is some ERROR");
logger.fatal("Here is some FATAL");
}
//--------참고. http://www.vipan.com/htdocs/log4jhelp.html --------//
// for using xml conf
// properties를 이용하는 것은 다루지 않았다.
/**
* conf file
* <?xml version="1.0" encoding="UTF-8" ?>
* <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
*
* <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
*
* <appender name="cad" class="org.apache.log4j.FileAppender">
* <param name="File" value="Logging4J.xml" />
* <param name="Append" value="false" />
* <layout class="org.apache.log4j.xml.XMLLayout"/>
* </appender>
*
* <root>
* <priority value ="debug" />
* <appender-ref ref="cad"/>
* </root>
*
* </log4j:configuration>
*
*/
public void confLog() {
//dom conf start
String conf = "log4jconf.xml";
DOMConfigurator.configure(conf);
//dom conf end
logger.debug("Here is some DEBUG");
logger.info("Here is some INFO");
logger.warn("Here is some WARN");
logger.error("Here is some ERROR");
logger.fatal("Here is some FATAL");
}
//LollingFileAppender
//log4j가 쌓는 로그의 순서
//최근것은 항상 Logging4J.log 에 쌓이고 이것이 예에서 1000바이트가 차들어가면
//Logging4J.log를 복사하여
//Logging4J.log.1을 만들고 Logging4J.log에는 최근게 계속 쌓인다.
/**
* <?xml version="1.0" encoding="UTF-8" ?>
* <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
*
* <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
*
* <appender name="cad" class="org.apache.log4j.RollingFileAppender">
* <!--<param name="File" value="Logging4J.xml" />-->
* <param name="File" value="Logging4J.log" />
* <param name="Append" value="true" />
* <param name="MaxFileSize" value="1000"/>
* <param name="MaxBackupIndex" value="3"/>
*
*
* <!--<layout class="org.apache.log4j.xml.XMLLayout">
* </layout>-->
*
* <layout class="org.apache.log4j.PatternLayout">
* <param name="ConversionPattern"
* value="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/>
* </layout>
*
* </appender>
*
* <root>
* <priority value ="debug" />
* <appender-ref ref="cad"/>
* </root>
*
* </log4j:configuration>
*/
public void lollingLog() {
//dom conf start
String conf = "log4jconfLolling.xml";
DOMConfigurator.configure(conf);
//dom conf end
logger.debug("Here is some DEBUG");
logger.info("Here is some INFO");
logger.warn("Here is some WARN");
logger.error("Here is some ERROR");
logger.fatal("Here is some FATAL");
}
// pattern layout
// --참고 -- http://logging.apache.org/log4j/docs/api/org/apache/log4j/PatternLayout.html
/**
* 출력패턴
*
* * ------+-------------------------------------------------------------------------------
* %c | 로그 이벤트의 카테고리명을 출력한다.
* ------|-------------------------------------------------------------------------------
* %C | 로깅 요구를 실시하는 클래스명을 출력한다.
* ------|-------------------------------------------------------------------------------
* %d | 로그 이벤트의 일시를 출력한다.
* | %d{HH:mm:ss} 나 %d{dd MMM yyyy HH}로서보다 유연하게 일시 정보를 출력할 수가 있다.
* ------|-------------------------------------------------------------------------------
* %F(*) | 로그 요구가 발생한 파일명을 출력한다.
* ------|-------------------------------------------------------------------------------
* %l(*) | 로그가 생성되었을 때에 불려 간 위치(소스명, 행)를 출력한다.
* ------|-------------------------------------------------------------------------------
* %L(*) | 로깅 요구를 행한 행 번호를 출력한다.
* ------|-------------------------------------------------------------------------------
* %m | 로깅이벤트로 설정된 메세지를 출력한다.
* ------|-------------------------------------------------------------------------------
* %M(*) | 로그 요구가 행해진 메소드명을 출력한다.
* ------|-------------------------------------------------------------------------------
* %n | 플랫폼 의존의 개행 문자를 출력한다.
* ------|-------------------------------------------------------------------------------
* %p | 로그의 우선도를 출력합니다.
* ------|-------------------------------------------------------------------------------
* %r | 어플리케이션이 개시하고 나서, 로그가 출력될 때까지의 시간을 밀리 세컨드 단위로 출력한다.
* ------|-------------------------------------------------------------------------------
* %t | 로그를 생성한 thread의 이름을 출력한다.
* ------|-------------------------------------------------------------------------------
* %x | 로그가 생성된 thread의 NDC(네스트화 진단 문맥)를 출력한다.
* ------|-------------------------------------------------------------------------------
* %% | %를 출력한다.
* ------+-------------------------------------------------------------------------------
*
*(*)이것들을 출력할 때의 퍼포먼스는 좋지 않기 때문에, 어플리케이션의 실행 속도가 문제가 되지 않는 경우에게만
*사용하는 것이 추천 되고 있다
*
*
** 여러가지 출력포멧 : 위의 xml에 아래의 포멧들을 적용해서 이것저것 찍어보도록 하자코드:
* ----------+-------------------------------------------------------------------------
* %10m | 출력 캐릭터 라인이 10 문자 이하의 경우,
* | 캐릭터 라인의 좌측으로 공백이 삽입된다.
* ----------+-------------------------------------------------------------------------
* %-10m | 출력 캐릭터 라인이 10 문자 이하의 경우,
* | 캐릭터 라인의 우측으로 공백이 삽입된다.
* ----------+-------------------------------------------------------------------------
* %.10m | 출력 캐릭터 라인이 10 문자를 넘는 경우,
* | 캐릭터 라인의 오른쪽으로부터 세어 11 문자눈 이후의 문자(선두의 문자)가 잘라내진다.
* ----------+-------------------------------------------------------------------------
* %10.20m | 출력 캐릭터 라인이 10 문자 이하의 경우,
* | 캐릭터 라인의 좌측으로 공백이 삽입된다.
* | 출력 캐릭터 라인이 20 문자를 넘는 경우,
* | 캐릭터 라인의 오른쪽으로부터 세어
* | 21 문자 이후의 문자(선두의 문자)가 잘라내진다.
* ----------+-------------------------------------------------------------------------
* %-10.20m | 출력 캐릭터 라인이 10 문자 이하의 경우,
* | 캐릭터 라인의 우측으로 공백이 삽입된다.
* | 출력 캐릭터 라인이 20 문자를 넘는 경우,
* | 캐릭터 라인의 오른쪽으로부터 세어 21 문자이후의 문자(선두의 문자)가 잘라내진다.
* ----------+-------------------------------------------------------------------------
*
*
* 패턴 layout을 쓰는 예제 xml conf 파일코드:
* <?xml version="1.0" encoding="UTF-8" ?>
* <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
*
* <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
*
* <appender name="cad" class="org.apache.log4j.RollingFileAppender">
* <!--<param name="File" value="Logging4J.xml" />-->
* <param name="File" value="Logging4J.log" />
* <param name="Append" value="true" />
* <param name="MaxFileSize" value="1000"/>
* <param name="MaxBackupIndex" value="3"/>
*
*
* <!--<layout class="org.apache.log4j.xml.XMLLayout">
* </layout>-->
*
* <layout class="org.apache.log4j.PatternLayout">
* <param name="ConversionPattern"
* value="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/>
* </layout>
*
* </appender>
*
* <root>
* <priority value ="debug" />
* <appender-ref ref="cad"/>
* </root>
*
* </log4j:configuration>
*/
public static void main(String[] args) {
//dom conf start
String conf = "log4jPattern.xml";
DOMConfigurator.configure(conf);
//dom conf end
logger.debug("Here is some DEBUG");
logger.info("Here is some INFO");
logger.warn("Here is some WARN");
logger.error("Here is some ERROR");
logger.fatal("Here is some FATAL");
}
/**
* 결과
* 2004-03-04 11:27:57,038 DEBUG [main] Logging4J (Logging4J.java:440) - Here is some DEBUG
* 2004-03-04 11:27:57,038 INFO [main] Logging4J (Logging4J.java:441) - Here is some INFO
* 2004-03-04 11:27:57,038 WARN [main] Logging4J (Logging4J.java:442) - Here is some WARN
* 2004-03-04 11:27:57,038 ERROR [main] Logging4J (Logging4J.java:443) - Here is some ERROR
* 2004-03-04 11:27:57,038 FATAL [main] Logging4J (Logging4J.java:444) - Here is some FATAL
*/
}
[펌] JSP에서 원하는 Appender 선택하여 쓰기 (0) | 2007.11.28 |
---|---|
[펌] WEBLOGIC + LOG4J (0) | 2007.11.28 |
[펌] Log4j를 사용하여 Tomcat 5.x로깅 설정하기 (0) | 2007.11.28 |
[펌] log4j 설정법 (0) | 2007.11.28 |
[펌] Log4J Configuration (0) | 2007.11.28 |
Log4j를 사용하여 Tomcat 5.x로깅 설정하기
알림 : 여기의 방법은 Tomcat에 log4j로깅을 셋팅하기 위한것이다. 당신의 애플리케이션은 해당 웹 애플리케이션만의 log4j.properties를 WEB-INF/classes디렉토리로 배치될수 있다.
$CATALINA_HOME/common/classes에 log4j.properties파일을 생성한다.
log4j.rootLogger=ERROR, R log4j.appender.R=org.apache.log4j.DailyRollingFileAppender log4j.appender.R.File=${catalina.home}/logs/tomcat.log log4j.appender.R.DatePattern='.'yyyy-MM-dd log4j.appender.R.layout=org.apache.log4j.PatternLayout log4j.appender.R.layout.ConversionPattern={%p} %c{2} %x %m%n
commons-logging.jar 와 log4j-1.2.9.jar을 $CATALINA_HOME/common/lib로 복사할 필요가 있다. 주의, 몇몇 참조문서에서는 $CATALINA_HOME/server/lib로 이 파일을 복사해야 한다고 말하고 있으나 나의 경우 common/lib로 복사하는 것이 잘 작동했다.
그리고 나서, 당신의 애플리케이션 log4j.properties($APPFUSE_HOME/web/WEB-INF/classes)에 다음의 내용을 추가한다.
# Suppress the tomcat logging whilst DEBUG is switched on log4j.logger.org.apache.catalina.core=ERROR log4j.logger.org.apache.catalina.session=ERROR log4j.logger.org.apache.jasper.compiler=ERROR
개발하는 동안, 당신은 root logger를 DEBUG로 셋팅한다. 그리고 나서 Tomcat로깅이 DEBUG로 셋팅이 되면, 당신은 Jasper컴파일러로부터 수천라인의 컴파일 추적메시지를 보게될것이다.
물론, 특정 애플리케이션을 구별하여, 당신의 애플리케이션 log4j.properties ROOT로그 레벨을 WARN이나 ERROR로 유지하고 특정 애플리케이션을 위해 디버깅을 활성화한다.(이를테면, org.appfuse=DEBUG)
노트: 만약 당신이 stdout으로 Tomcat로깅을 수행하길 원한다면, 당신의 $CATALINA_HOME/common/classes/log4j.properties파일은 다음과 같을것이다.
log4j.rootLogger=ERROR, stdout, TOMCAT log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{dd-MM-yy HH:mm:ss:SSS} - {%p} %c{2} Thread [%t]; %x %m%n log4j.appender.TOMCAT=org.apache.log4j.DailyRollingFileAppender log4j.appender.TOMCAT.File=${catalina.home}/logs/tomcat.log log4j.appender.TOMCAT.DatePattern='.'yyyy-MM-dd log4j.appender.TOMCAT.layout=org.apache.log4j.PatternLayout log4j.appender.TOMCAT.layout.ConversionPattern=%d{dd-MM-yy HH:mm:ss:SSS} - {%p} %c{2} Thread [%t]; %x %m%n
[펌] WEBLOGIC + LOG4J (0) | 2007.11.28 |
---|---|
[펌] Log4J... (0) | 2007.11.28 |
[펌] log4j 설정법 (0) | 2007.11.28 |
[펌] Log4J Configuration (0) | 2007.11.28 |
[펌] Log4J 사용하기 (0) | 2007.11.28 |
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
참고파일 ============================================= 본문서는 자유롭게 배포/복사 할수 있지만 이문서의 저자에 대한 언급을 삭제하시면 안됩니다 저자 : GoodBug (unicorn@jakartaproject.com) 최초 : http://www.jakartaproject.com ============================================= LOG4J I. 들어가면서.. 그리고 log4j log4j는 자바 어플리케이션에서 빠르고 효과적으로 로깅 할 수 있도록 도와주는 오픈 소스 프로젝트입니다. 로깅(logging)은 코드의 가독성을 떨어뜨리는 단점이 있지만 애플리케이션에 문제가 있을 때 개발자가 자세한 상황을 파악할 수 있도록 해 주며 테스팅시 빠질 수 없는 요소입니다.
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에서 사용하는 예제가 없어 만들어 봤습니다.
결과 콘솔화면 ① static Logger logger = Logger.getLogger("test.jsp"); static 메소드 getLogger를 통해 logger 인스턴스를 가져옵니다. ② logger.fatal("fatal!!"); fatal(Object message) fatal(Object message, Throwable t) 각 레벨마다 위처럼 두가지 메소드를 지원합니다.
VI. 샘플코드 2 서블릿의 경우 다음과 같이 코딩하면 되겠군요
VII. LOG4J 설정 log4j 설정은 프로그램 내에서 할 수 있지만 설정파일을 사용함으로서 좀더 유연하게 log4j환경을 만들 수 있습니다. ① 프로그램에서 설정
② property 파일에 설정
#최상위 카테고리에 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)
예시) (같은 색끼리 보시면 됩니다) 위의 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] [] [] |
[펌] Log4J... (0) | 2007.11.28 |
---|---|
[펌] Log4j를 사용하여 Tomcat 5.x로깅 설정하기 (0) | 2007.11.28 |
[펌] Log4J Configuration (0) | 2007.11.28 |
[펌] Log4J 사용하기 (0) | 2007.11.28 |
[펌] Tomcat의 Logger(로거)가 이상해요.. (0) | 2007.11.28 |
[펌] Log4j를 사용하여 Tomcat 5.x로깅 설정하기 (0) | 2007.11.28 |
---|---|
[펌] log4j 설정법 (0) | 2007.11.28 |
[펌] Log4J 사용하기 (0) | 2007.11.28 |
[펌] Tomcat의 Logger(로거)가 이상해요.. (0) | 2007.11.28 |
[펌] Eclipse WTP에서 Apache Cactus사용하기 (0) | 2007.11.28 |
[펌] log4j 설정법 (0) | 2007.11.28 |
---|---|
[펌] Log4J Configuration (0) | 2007.11.28 |
[펌] Tomcat의 Logger(로거)가 이상해요.. (0) | 2007.11.28 |
[펌] Eclipse WTP에서 Apache Cactus사용하기 (0) | 2007.11.28 |
[펌] TDD와 JUnit을 이용한 테스팅 방법을 알아보고 효율적.. (0) | 2007.11.28 |
log4j:WARN No appenders could be found for logger (org.apache.commons.digester.Digester).
log4j:WARN Please initialize the log4j system properly.
[펌] Log4J Configuration (0) | 2007.11.28 |
---|---|
[펌] Log4J 사용하기 (0) | 2007.11.28 |
[펌] Eclipse WTP에서 Apache Cactus사용하기 (0) | 2007.11.28 |
[펌] TDD와 JUnit을 이용한 테스팅 방법을 알아보고 효율적.. (0) | 2007.11.28 |
[펌] JUnit을 이용한 효율적인 단위테스트 전략 (0) | 2007.11.28 |
Eclipse WTP에서 Apache Cactus사용하기
Cactus는 Web Application 에 올라가 있는 servlet, jsp, filter등을 테스트 할수 있도록 하는 JUnit 기반위의 Framework이다. (HttpUnit 과의 관계가 어떻게 되는지 모르겠네요..)
Cactus를 이용하여 서블릿에 대한 request를 설정하고 response를 확인할 수 있다.
cactus.contextURL=http://localhost:8080/prod_web
public class ServletTest extends ServletTestCase {
public void testProdSpecSel() throws IOException {
ProdSpecSel servlet = new ProdSpecSel();
servlet.service(request, response);
}
public void beginProdSpecSel(WebRequest request) throws Exception{
String data = "
InputStream input = new ByteArrayInputStream(data.getBytes());
request.setUserData(input);
}
public void endProdSpecSel(WebResponse response) throws Exception{
System.out.println(response.getText());
}
}
[펌] Log4J 사용하기 (0) | 2007.11.28 |
---|---|
[펌] Tomcat의 Logger(로거)가 이상해요.. (0) | 2007.11.28 |
[펌] TDD와 JUnit을 이용한 테스팅 방법을 알아보고 효율적.. (0) | 2007.11.28 |
[펌] JUnit을 이용한 효율적인 단위테스트 전략 (0) | 2007.11.28 |
[펌] JUnit 2 (0) | 2007.11.28 |
http://blog.naver.com/galad/140042153122
자동화된 테스트로 개발을 이끌어 가는 개발 방식을 테스트 주도 개발이라 부른다.
TDD는 분석 기술이며, 설계 기술이며, 개발의 모든 활동을 구조화하는 기술이다.
작동하는 깔끔한 코드(clean code that works).
이 핵심을 찌르는 한마디가 바로 테스트 주도 개발의 궁극적인 목표다.
테스트 주도 개발에서는 두 가지 단순한 규칙만을 따른다.
또한 위의 두 가지 규칙에 의해 프로그래밍 순서가 다음과 같이 결정 된다.
▪ 다운로드 : http://www.junit.org/
1. TestCase 클래스 : 가장 간단하게 Junit을 사용하는 방법은 TestCase 클래스를 상속받은 클래스를 작성하는 것이다. 이 클래스에는 test로 시작하는 메소드만 나열하면 된다.
2. TestSuite 클래스 : testCase 클래스를 상속받은 클래스만을 사용하다 보면, 일부의 test 메소드는 간혹 실행하지 않고 싶거나 특정한 test 메소드만 실행하고 싶을 때가 생긴다. (①) 또는 Test 클래스를 한데 묶어서 한꺼번에 실행하고 싶은 경우(②)도 발생한다. 이때 사용하는 것이 바로 TestSuite이다.
3. Assersions
4. Fixture : 초기 값 설정 및 해제 – setUp(), teardown()
좋은 테스트는 'A- TRIP' 해야 한다.
: Right-BICEP (오른쪽 이두박근이라는 뜻)
1. 테스트 코드를 어디에 둘 것인가?
2. 테스트 예절
3. 테스트 빈도
4. 테스트와 레거시 코드
5. 테스트와 검토
1. 테스트의 용이성을 높이는 설계
2. 테스트를 위한 리팩토링
3. 클래스의 불변성(invariant)을 테스트 하기
최초작성자 : OSS:오혜진
최초작성일 : 2006년 2월 19일
버전 : 1.0 ? ㅎㅎ
문서이력 :
[펌] Tomcat의 Logger(로거)가 이상해요.. (0) | 2007.11.28 |
---|---|
[펌] Eclipse WTP에서 Apache Cactus사용하기 (0) | 2007.11.28 |
[펌] JUnit을 이용한 효율적인 단위테스트 전략 (0) | 2007.11.28 |
[펌] JUnit 2 (0) | 2007.11.28 |
[펌] eclipse short cuts (0) | 2007.11.28 |
http://blog.naver.com/galad/140035831360
기존에 TDD의 개념은 있었으나 도와주는 도구의 부재로 자바 개발자들은 주로 main() 에서 테스트 하는 방식을 주로 이용했을 것이다.
먼저 JUnit이 무엇이고 테스트란 무엇인지 알아보자.
테스트 코드는 작성시에 일반적으로 권장되는 몇가지 사항이 있다.
![]() |
test 로 시작하는 메서드 이름으로 작성한다. |
![]() |
테스트에 필요한 모든 조건과 상황을 준비 설정한다. |
![]() |
Failures 탭은 실패한 테스트의 목록을 나열한다. |
![]() |
*assertEquals - 같은지 비교 |
![]() |
테스트 클래스에 public void setUp() 메소드를 만들어주면 각 테스트 메소드가 실행되기 전에 먼저 setUp() 메소드가 실행된다. |
// 이 코드는 간단한 프레임워크및 실행순서를 보여준다.
oneTimeSetup(){} //- 한번만 실행되는 스위트를 시작할 때의 준비설정코드와 끝날때의 정리코드
setUp(){} //- 메서드별로 테스트 메서드 이전에 실행되는 준비설정코드와, 이후에 실행되는 정리코드
testMethod(){}
tearDown(){}
setUp(){}
testMethod2(){}
tearDown(){}
oneTimeTearDown(){}
예를들어, 테스트마다 db연결 객체가 필요하다고 가정할때,
데이터베이스에 연결하고 접속을 종료하는 코드를 각 테스트 메서드에 일일이 넣을 필요 없이
setUp()과 tearDown() 메서드를 이용하여 해결하면 될것이다.
ex)
public Class TestDb extends TestCase()
{
private Connection dbConn;
protected void setUp()
{
dbConn = new Connection( "oracle", 1521, "scott", "tiger");
dbConn.connect();
}
protected void tearDown()
{
dbConn.disconnect();
dbConn = null;
}
public void testEmpAccess()
{
//dbConn 사용 어쩌고 저쩌고....
}
public void testDeptAccess()
{
//dbConn 사용 어쩌고 저쩌고....
}
}
대개는 이렇게 테스트별 준비 설정만으로 충분하지만
어떤 상황에서는 "전체" 테스트 스위트를 실행하기위해 어떤것을 설정하거나 정리해야 할 필요가 있다.
이런 경우 스위트별 준비 설정과 정리가 필요한데 이 설정은 조금 더 복잡하다.
필요한 테스트들의 스위트를 반들어서 TestSetup 객체 안에 감싸 넣어야 한다.
public static Test suite()
{
TestSuite suite = new TestSuite();
// Only include short tests
suite.addTest(new TestClassTwo("testShortTest"));
suite.addTest(new TestClassTwo("testAnotherShortTest"));
junit.extensions.TestSetup wrapper = junit.extensions.TestSetup(suite)
{
// TestSetup 클래스의 setUp과 tearDown() 메서드를 재정의 한다.
protected void setUp() { oneTimeSetUp(); }
protected void tearDown() { oneTimeTearDown(); }
};
return wrapper;
}
public static void oneTimeSetUp()
{
// 한번만 실행되는 초기화 코드가 여기에 들어간다.
tsp = new TSP();
tsp.loadCities("EasternSeaboard");
}
public static void oneTimeTearDown()
{
// one-time cleanup code goes here...
tsp.releaseCities();
}
public void testForException()
{
try
{
sortList(null);
fail("Should have trown an exception");
}
catch (RuntimeException e)
{
assertTrue(ture);
}
}
이 테스트 메서드의 경우 sortList를 테스트 할때 null이 넘어가면 예외를 발생시키는게 맞는 제어흐름이므로
catch절에 assertTrue(ture); 가 수행이 된다.
즉, 이는 나중에라도 코드를 잘못 해석할 가능성을 막아주는 강력한 문서화 기법이다.
다만 assertTrue(ture); 가 호출되지 않는다 하더라도 테스트가 실패하는 것은 아니라는 것은 명심하라.
그렇다면 예상하지 못한 예외들은?
사용자가 직접 처리하는 메서드를 구현할 수 있겠으나
메서드 선언부에 throws 절을 명시해 준다면 JUnit 프레임워크가 발생한 모든 예외를 잡아서 실패한 assert메서드를 출력하며
버그에 이르기까지 "전체" 호출 스택을 출력해 주므로 무엇때문인지 알아볼 때 많은 도움이 된다.
![]() |
|
이것은 ,, 실제 테스트할 준비가 될때까지 메서드의 이름을 test로 시작하는 메서드가 아니라면 실행을 하지 않게 할수 있다는 것을 의미한다.
다만, 익숙해져선 안되는 것은 바로 테스트가 실패하는데도 이를 무시하는 습관이다.
![]() |
|
! 무엇을 테스트 할것인가?
![]() |
또하나, 많은 양의 테스트 데이타가 필요한 테스트를 한다면, 단위 테스트에서 읽어들이는 별도의 데이타 파일에 테스트 값이나 결과를 넣는 것을 고려하는 것이 좋다. |
![]() |
형식일치, 순서, 범위, 참조, 존재성, 개체수, 시간 등을 테스트한다.
예를 들면, 해당 메서드가 동작하기 위한 사전 조건( pre condition ) 이나 사후 조건( post condition ) 은
|
모의객체 사용하기 - 단위 테스트의 목표는 한번에 메서드 하나를 테스트 하는 것이다. 하지만, 테스트 하기가 어려운 상황이라면?
public long getTime()
{
if( debug )
{
return debug_cur_time;
}
else
{
return System.currentTimeMillis();
}
}
하지만 우리에게 필요한것은 똑같은 일을 해내면서 더 깔끔하고, 더 객체지향 적인 방법이다.
![]() |
진짜 객체가 비결정적인 동작을 한다.( 예상할 수 없는 결과를 만들어 낸다.) |
모의 객체를 사용하기 위한 세단계
*객체를 설명하기 위해 인터페이스를 사용한다.
*제품 코드에 맞게 그 인터페이스를 구현한다.
*테스트에 쓸 모의 객체의 인터페이스를 구현한다.
참고자료
http://sourceforge.net/projects/mockobjects
http://www.easymock.org
모의 객체의 사용법의 핵심은 각자가 흉내내는 뭔가에 의존하는 객체를 테스트 하기 위한것이다.
![]() |
테스트를 테스트 하기위한 방법의 일환으로 |
![]() |
|
![]() |
불완전한 코드(의존성 있는 코드가 체크인 되지 않은.) |
![]() |
새 메서드를 작성할 때마다: 지역단위 테스트들을 컴파일 하고 실행한다. |
먼저 테스트 해 볼 것은 간단한 예제로 주어진 배열중 가장 큰수를 리턴하는 메서드를 작성하는 테스트를 작성해 보기로 한다.
그리고 TestSuite의 사용법을 위해 TestCase를 더 작성후 TestSuite를 작성해본다.
*TDD는 다음과 같은 순서로 진행을 하면 된다. 이 순서는 켄트벡이 제시한 순서이다.
1. Quickly add a test(테스트 프로그램을 작성한다.)
2. Run all tests and see the new one fail
(모든 테스트 프로그램을 수행시키고 테스트에 실패한 부분을 확인한다.)
3. Make a little change(소스를 추가하거나 변경한다.)
4. Run all tests and see them all succeed
(다시 모든 테스트를 수행시키고 모두 테스트를 통과했는데 확인한다.)
5. Refactor to remove duplication(중복을 제거하기 위해 Refactoring 한다.)
*이클립스에서 TestCase자동생성
[펌] Eclipse WTP에서 Apache Cactus사용하기 (0) | 2007.11.28 |
---|---|
[펌] TDD와 JUnit을 이용한 테스팅 방법을 알아보고 효율적.. (0) | 2007.11.28 |
[펌] JUnit 2 (0) | 2007.11.28 |
[펌] eclipse short cuts (0) | 2007.11.28 |
[펌] eclipse 에서 run 실행시 jvm 에 대한 세팅은 어디서 하나요? (0) | 2007.11.28 |
http://blog.naver.com/galad/140035831352
JUnit
테스트 클래스 작성
JUnit Test 클래스는 junit.framework.TestCase 를 상속받고,
public void test*() 형태의 테스트 메소드를 작성한다.
JUnit 테스트의 골격
1. junit.framework.* 을 코드에 반영하기 위한 import 문
2. 테스트 클래스가 TestCase를 상속하는 extends 문(되도록 TestCase를 상속하는 다른 클래스를 만들고, 그 클래스로 다시 상속 받아 테스트 클래스를 만드는 것이 좋다)
3. super(string)을 호출해 주는 생성자
테스트 수행
* 텍스트 : junit.textui.TestRunner TestClass
* AWT : junit.awtui.TestRunner TestClass
* SWING : junit.swingui.TestRunner TestClass
테스트 수행 메소드 부르기
public static void main(String[] args) {
junit.swingui.TestRunner.run(AllTest.class);
}
Assertions
각 메소드는 맨 처음 인자로 문자열 설명을 가질 수 있다.
assertEquals(primitive expected, primitive actual);
assertEquals(Object exprected, Object actual);
assertSame(Object exptected, Object actual); // 두 객체가 같은가?
assertNotSame(Object exptected, Object actual);
assertNull(Object object); // 객체가 NULL인가?
assertNotNull(Object object);
assertTrue(boolean condition);
assertFalse(boolean condition);
fail(String str); : 무조건 실패
테스트 클래스의 값 초기화
테스트 클래스에 public void setUp() 메소드를 만들어주면 각 테스트 메소드가 실행되기 전에 먼저 setUp() 메소드가 실행된다.
테스트 클래스에 public void tearDown() 메소드를 만들어주면 각 테스트 메소드가 종료할 때마다 tearDown() 메소드가 실행된다.
suite()
테스트할 메소드를 명시적으로 지정하고 싶을 때 테스트 클래스에 public static Test suite() 메소드를 만든다.
public static Test suite() {
TestSuite = new TestSuite();
suite.addTest(new TestClass("testMethod1")); // 테스트할 메소드 이름
suite.addTest(new TestClass("testMethod2"));
return suite;
}
JUnit과 ANT
<junit printsummary="true" haltonfailure="no">
<classpath>
<pathelement path="${classes.dir}"/>
</classpath>
<test name="helloproject.junit1.DayCounterTest"/>
</junit>
haltonfailover="yes" 이면 테스트가 하나라도 실패하면 거기서 테스트를
중지해버린다.
여러 테스트를 수행하려면
<junit printsummary="true" haltonfailure="no">
<classpath>
<pathelement path="${classes.dir}"/>
</classpath>
<formatter type="xml"> <!-- 결과를 XML로 내보냄 -->
<batchtest todir="${test.dir}"> <!-- XML결과가 저장될 Directory -->
<fileset dir="${classes.dir}">
<include name="**/*Test*.class"/>
</fileset>
</batchset>
</junit>
테스트 결과 XML을 이용해 HTML로 결과 보고서 만들기 - Xalan 2 필요
<junitreport todir="${test.dir}">
<fileset dir="${test.dir}">
<include name="TEST**.xml"/>
</fileset>
<report format="frames" todir="${test.dir}/html"/>
</junitreport>
[펌] TDD와 JUnit을 이용한 테스팅 방법을 알아보고 효율적.. (0) | 2007.11.28 |
---|---|
[펌] JUnit을 이용한 효율적인 단위테스트 전략 (0) | 2007.11.28 |
[펌] eclipse short cuts (0) | 2007.11.28 |
[펌] eclipse 에서 run 실행시 jvm 에 대한 세팅은 어디서 하나요? (0) | 2007.11.28 |
Tomcat 다운현상 (0) | 2007.11.28 |
[펌] JUnit을 이용한 효율적인 단위테스트 전략 (0) | 2007.11.28 |
---|---|
[펌] JUnit 2 (0) | 2007.11.28 |
[펌] eclipse 에서 run 실행시 jvm 에 대한 세팅은 어디서 하나요? (0) | 2007.11.28 |
Tomcat 다운현상 (0) | 2007.11.28 |
james mail server (0) | 2007.11.28 |
제목 : [질문]eclipse 에서 run 실행시 jvm 에 대한 세팅은 어디서 하나요? 글쓴이: 손님(guest) 2006/07/25 14:54:16 조회수:636 줄수:13 |
eclipse 에서 대용량의 파일(xml파일) 을 읽어 들여서 처리하는 프로그램을 개발한 후에 테스트를 하려고 이클립스의 Run As Java application 을 클릭하여 실행을 하니 OutOfMemory 에러가 발생했습니다. 이클립스에서 Run 을 하면 새로운 JVM 이 따로 떠서 실행을 하는 것 같던데 그 거에 대해서 초기 메모리 setting 을 하는 방법이 없는지 아시는 분은 답변부탁드립니다. -Xms -Xmx option 을 설정하려고 하는데 찾아봐도 이클립스 자체를 실행시킬때 옵션 주는 거 밖에는 안나오더군요.. 질문을 다시 정리하면 이클립스에서 Run을 했을때 어플리케이션을 실행시키기 위해 새로 실행되는 JVM 에 대한 옵션을 주는 법을 알려주시면 감사하겠습니다. |
제목 : Re: 제기억엔. 글쓴이: 깨끗한손(guest) 2006/07/31 17:12:34 조회수:339 줄수:9 |
이클립스에서 Run 을 하면 조그만 실행 윈도우가 열립니다. 메인 클래스 이름이 적혀있고. 아래에 Run, close 버튼이 있습니다.(^^) 여러가지 옵션을 줄수있게 탭들이 있는데 이곳에서 아규먼트, jre , 클래스패스, 시스템 변수등을 다 세팅할 수 있습니다. 아규먼트 탭에. VM 아규먼트로 있을듯 합니다. (지금 이클립스가 안 깔린 컴퓨터 라서 ㅡ.ㅡ) |
제목 : Re: 이렇게 하세요~ 글쓴이: 손님(guest) 2006/08/03 09:54:36 조회수:334 줄수:6 |
실행할 화일의 등록정보를 여시고 아래처럼 셋팅하시면 됩니다. D:\eclipse\eclipse.exe -vm C:\Progra~1\Java\j2sdk1.4.2_05\bin\javaw.exe -vmargs -Xmx256m |
제목 : Re:Re:제기억엔. 글쓴이: 손님(guest) 2006/08/04 14:00:18 조회수:305 줄수:18 |
우선 답변 감사드립니다. >이클립스에서 Run 을 하면 조그만 실행 윈도우가 열립니다. >메인 클래스 이름이 적혀있고. 아래에 Run, close 버튼이 있습니다.(^^) >여러가지 옵션을 줄수있게 탭들이 있는데 이곳에서 >아규먼트, jre , 클래스패스, 시스템 변수등을 다 세팅할 수 있습니다. >아규먼트 탭에. VM 아규먼트로 있을듯 합니다. >(지금 이클립스가 안 깔린 컴퓨터 라서 ㅡ.ㅡ) 거기는 찾아봤는데 JRE 탭에 jvm 의 옵션을 주는 란이 없는 것 같은데요.. 그리고 바로 위에 이렇게하세요~ 라고 써주신 분이 알려주신 거에서 vm 옵션을 줄수 있다는 건 알겠는데 그 vm 에 대해서 Xmx 옵션은 어떻게 줘야 하죠? 맨 뒤에 있는 -Xmx256m 은 C:\Progra~1\Java\j2sdk1.4.2_05\bin\javaw.exe 에 적용되는 옵션이 아니라 eclipse.exe 에 적용되는 옵션이 아닌지요... |
제목 : Re: eclipse.ini 파일을 수정하시면 됩니다. 글쓴이: 손님(guest) 2006/11/20 15:59:38 조회수:248 줄수:13 |
eclipse 폴더에 보시면 eclipse.ini 구성설정 파일이 있습니다. -vmargs-Xms40m-Xmx256m 이부분을 원하는 환경으로 설정해주시면 됩니다. -vmargs-Xms40m(최소값)-Xmx256m(최대값) |
[펌] JUnit 2 (0) | 2007.11.28 |
---|---|
[펌] eclipse short cuts (0) | 2007.11.28 |
Tomcat 다운현상 (0) | 2007.11.28 |
james mail server (0) | 2007.11.28 |
[펌] james mail server setting (0) | 2007.11.28 |
제목 : Tomcat 다운현상 글쓴이: 손님(guest) 2005/12/21 14:20:39 조회수:1098 줄수:53 |
프로젝트 마무리 단계로 고객측 서버에서 테스트를 하고 있는데, 잘되다가 멈춰버리면서 접근이 안되네요. 좀 기다렸다가 다시 접속하거나 또는 톰캣을 내렸다가 올리면 되는데, 근본적으로 원인을 찾아야 할것 같습니다. 우선 톰캣로그에는 항상 저런형태는 아니지만, 비슷한 에러가 자주 발생을 하는듯 하구요, 톰캣 실행은 -server -Xms128m -Xmx256m -verbosegc 옵션을 주고 있고, 서버환경은 HP-UX B.11.11 Tomcat 5.5.9 Java 1.5.0.02 입니다. 아 그리고, 오늘 다운됐을때 로그를 보니까 계속 Full GC가 반복해서 일어나고 있더라구요. 2005. 12. 21 오전 9:45:07 org.apache.tomcat.util.threads.ThreadPool$ControlRunnable run 심각: Caught exception (java.lang.OutOfMemoryError: Java heap space) executing org.apache.jk.common.SocketConnection@aabe60, terminating thread 2005. 12. 21 오전 9:45:07 org.apache.tomcat.util.threads.ThreadPool$ControlRunnable run 심각: Caught exception (java.lang.OutOfMemoryError: Java heap space) executing org.apache.jk.common.SocketConnection@7e6732, terminating thread 2005. 12. 21 오전 9:45:07 org.apache.tomcat.util.threads.ThreadPool$ControlRunnable run 심각: Caught exception (java.lang.OutOfMemoryError: unable to create new native thread) executing org.apache.jk.common.SocketAcceptor@221b8b, terminating thread 2005. 12. 21 오전 9:45:21 org.apache.tomcat.util.threads.ThreadPool$ControlRunnable run 심각: Caught exception (java.lang.OutOfMemoryError: Java heap space) executing org.apache.jk.common.SocketConnection@85a60, terminating thread 2005. 12. 21 오전 9:46:16 org.apache.jk.common.ChannelSocket processConnection 경고: processCallbacks status 2 2005. 12. 21 오전 9:46:25 org.apache.jasper.compiler.JspReader pushFile 심각: Exception parsing file java.lang.OutOfMemoryError: Java heap space 2005. 12. 21 오전 9:50:41 org.apache.jasper.compiler.JspReader pushFile 심각: Exception parsing file java.lang.OutOfMemoryError: Java heap space 2005. 12. 21 오전 9:50:54 org.apache.jasper.compiler.JspReader pushFile 심각: Exception parsing file java.lang.OutOfMemoryError: Java heap space 2005. 12. 21 오전 9:51:59 org.apache.jk.common.ChannelSocket processConnection 경고: processCallbacks status 2 2005. 12. 21 오전 9:53:36 org.apache.catalina.connector.CoyoteAdapter service 심각: An exception or error occurred in the container during the request processing java.lang.OutOfMemoryError: Java heap space 2005. 12. 21 오전 9:54:16 org.apache.jasper.compiler.JspReader pushFile 심각: Exception parsing file java.lang.OutOfMemoryError: Java heap space 2005. 12. 21 오전 9:54:19 org.apache.jasper.compiler.JspReader pushFile 심각: Exception parsing file java.lang.OutOfMemoryError: Java heap space 2005. 12. 21 오전 9:54:29 org.apache.tomcat.util.threads.ThreadPool$ControlRunnable run 심각: Caught exception (java.lang.OutOfMemoryError: Java heap space) executing org.apache.jk.common.SocketConnection@d9624, terminating thread 2005. 12. 21 오전 9:54:57 org.apache.jasper.compiler.JspReader pushFile 심각: Exception parsing file java.lang.OutOfMemoryError: Java heap space 2005. 12. 21 오전 9:58:50 org.apache.jasper.compiler.JspReader pushFile 심각: Exception parsing file |
제목 : Re: verbosegc 로그를 올려봐요. 글쓴이: 이원영(javaservice) 2005/12/21 19:59:09 조회수:447 줄수:6 |
verbosegc 로그를 올려봐요. 자바서비스넷 이원영 Phone: 010-6239-6498 E-mail: NOSPAM_lwy@javaservice.com MSN: NOSPAM_javaservice@hanmail.net |
제목 : Re: GC 로그 입니다. 글쓴이: 손님(guest) 2005/12/22 10:31:31 조회수:502 줄수:135 |
좀더 자세하게 출력해보기 위해서 옵션을 -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC 로 줘서 다시 실행시켜 보고 있는 중입니다. 오늘 outofmemory 발생 이전의 일부분과 발생후의 로그를 올려봅니다. {Heap before GC invocations=1454: Heap PSYoungGen total 141120K, used 126050K [6e000000, 78aa0000, 78aa0000) eden space 109696K, 99% used [6e000000,74b1dd10,74b20000) from space 31424K, 52% used [76b60000,77b5ab68,78a10000) to space 32512K, 0% used [74b20000,74b20000,76ae0000) PSOldGen total 349568K, used 128281K [58800000, 6dd60000, 6dd60000) object space 349568K, 36% used [58800000,60546648,6dd60000) PSPermGen total 31744K, used 29458K [54800000, 56700000, 58800000) object space 31744K, 92% used [54800000,564c4978,56700000) 56943.386: [GC [PSYoungGen: 126050K->22406K(132160K)] 254331K->160687K(481728K), 1.2878866 secs] Heap after GC invocations=1454: Heap PSYoungGen total 132160K, used 22406K [6e000000, 78aa0000, 78aa0000) eden space 109696K, 0% used [6e000000,6e000000,74b20000) from space 22464K, 99% used [74b20000,76101850,76110000) to space 35456K, 0% used [76800000,76800000,78aa0000) PSOldGen total 349568K, used 138281K [58800000, 6dd60000, 6dd60000) object space 349568K, 39% used [58800000,60f0a648,6dd60000) PSPermGen total 31744K, used 29458K [54800000, 56700000, 58800000) object space 31744K, 92% used [54800000,564c4978,56700000) } {Heap before GC invocations=1455: Heap PSYoungGen total 132160K, used 132089K [6e000000, 78aa0000, 78aa0000) eden space 109696K, 99% used [6e000000,74b1cc68,74b20000) from space 22464K, 99% used [74b20000,76101850,76110000) to space 35456K, 0% used [76800000,76800000,78aa0000) PSOldGen total 349568K, used 138281K [58800000, 6dd60000, 6dd60000) object space 349568K, 39% used [58800000,60f0a648,6dd60000) PSPermGen total 31744K, used 29492K [54800000, 56700000, 58800000) object space 31744K, 92% used [54800000,564cd1e0,56700000) 57028.604: [GC [PSYoungGen: 132089K->2203K(140672K)] 270370K->141300K(490240K), 0.1712235 secs] Heap after GC invocations=1455: Heap PSYoungGen total 140672K, used 2203K [6e000000, 78aa0000, 78aa0000) eden space 105216K, 0% used [6e000000,6e000000,746c0000) from space 35456K, 6% used [76800000,76a26dc0,78aa0000) to space 34048K, 0% used [746c0000,746c0000,76800000) PSOldGen total 349568K, used 139096K [58800000, 6dd60000, 6dd60000) object space 349568K, 39% used [58800000,60fd6258,6dd60000) PSPermGen total 31744K, used 29492K [54800000, 56700000, 58800000) object space 31744K, 92% used [54800000,564cd1e0,56700000) } {Heap before GC invocations=1456: Heap PSYoungGen total 140672K, used 107419K [6e000000, 78aa0000, 78aa0000) eden space 105216K, 100% used [6e000000,746c0000,746c0000) from space 35456K, 6% used [76800000,76a26dc0,78aa0000) to space 34048K, 0% used [746c0000,746c0000,76800000) PSOldGen total 349568K, used 139096K [58800000, 6dd60000, 6dd60000) object space 349568K, 39% used [58800000,60fd6258,6dd60000) PSPermGen total 31744K, used 29531K [54800000, 56700000, 58800000) object space 31744K, 93% used [54800000,564d6c18,56700000) 57030.592: [GC [PSYoungGen: 107419K->33204K(138432K)] 246516K->173516K(488000K), 2.3490715 secs] Heap after GC invocations=1456: Heap PSYoungGen total 138432K, used 33204K [6e000000, 78aa0000, 78aa0000) eden space 105216K, 0% used [6e000000,6e000000,746c0000) from space 33216K, 99% used [746c0000,7672d248,76730000) to space 36288K, 0% used [76730000,76730000,78aa0000) PSOldGen total 349568K, used 140312K [58800000, 6dd60000, 6dd60000) object space 349568K, 40% used [58800000,61106130,6dd60000) PSPermGen total 31744K, used 29531K [54800000, 56700000, 58800000) object space 31744K, 93% used [54800000,564d6c18,56700000) } {Heap before GC invocations=1457: Heap PSYoungGen total 138432K, used 138397K [6e000000, 78aa0000, 78aa0000) eden space 105216K, 99% used [6e000000,746ba2a0,746c0000) from space 33216K, 99% used [746c0000,7672d248,76730000) to space 36288K, 0% used [76730000,76730000,78aa0000) PSOldGen total 349568K, used 140312K [58800000, 6dd60000, 6dd60000) object space 349568K, 40% used [58800000,61106130,6dd60000) PSPermGen total 31744K, used 29531K [54800000, 56700000, 58800000) object space 31744K, 93% used [54800000,564d6c18,56700000) 57035.835: [GC [PSYoungGen: 138397K->16265K(131776K)] 278709K->179145K(481344K), 0.9527750 secs] Heap after GC invocations=1457: Heap PSYoungGen total 131776K, used 16265K [6e000000, 78aa0000, 78aa0000) eden space 95488K, 0% used [6e000000,6e000000,73d40000) from space 36288K, 44% used [76730000,77712580,78aa0000) to space 39616K, 0% used [73d40000,73d40000,763f0000) PSOldGen total 349568K, used 162880K [58800000, 6dd60000, 6dd60000) object space 349568K, 46% used [58800000,62710130,6dd60000) PSPermGen total 31744K, used 29531K [54800000, 56700000, 58800000) object space 31744K, 93% used [54800000,564d6c18,56700000) } 2005. 12. 22 오전 10:11:52 org.apache.tomcat.util.threads.ThreadPool$ControlRunnable run 심각: Caught exception (java.lang.OutOfMemoryError: unable to create new native thread) executing org.apache.jk.common.SocketAcceptor@b7299b, terminating thread 2005. 12. 22 오전 10:11:52 org.apache.jk.common.ChannelSocket processConnection 경고: processCallbacks status 2 2005. 12. 22 오전 10:11:52 org.apache.jk.common.ChannelSocket processConnection 경고: processCallbacks status 2 2005. 12. 22 오전 10:11:53 org.apache.jk.common.ChannelSocket processConnection 경고: processCallbacks status 2 2005. 12. 22 오전 10:11:53 org.apache.jk.common.ChannelSocket processConnection 경고: processCallbacks status 2 2005. 12. 22 오전 10:11:53 org.apache.jk.common.ChannelSocket processConnection 경고: processCallbacks status 2 2005. 12. 22 오전 10:11:53 org.apache.jk.common.ChannelSocket processConnection 경고: processCallbacks status 2 2005. 12. 22 오전 10:11:53 org.apache.jk.common.ChannelSocket processConnection 경고: processCallbacks status 2 2005. 12. 22 오전 10:11:54 org.apache.jk.common.ChannelSocket processConnection 경고: processCallbacks status 2 2005. 12. 22 오전 10:11:54 org.apache.jk.common.ChannelSocket processConnection 경고: processCallbacks status 2 2005. 12. 22 오전 10:11:54 org.apache.jk.common.ChannelSocket processConnection 경고: processCallbacks status 2 {Heap before GC invocations=1458: Heap PSYoungGen total 131776K, used 111753K [6e000000, 78aa0000, 78aa0000) eden space 95488K, 100% used [6e000000,73d40000,73d40000) from space 36288K, 44% used [76730000,77712580,78aa0000) to space 39616K, 0% used [73d40000,73d40000,763f0000) PSOldGen total 349568K, used 162880K [58800000, 6dd60000, 6dd60000) object space 349568K, 46% used [58800000,62710130,6dd60000) PSPermGen total 31744K, used 29578K [54800000, 56700000, 58800000) object space 31744K, 93% used [54800000,564e2810,56700000) 57041.924: [GC [PSYoungGen: 111753K->1897K(135104K)] 274633K->165667K(484672K), 0.0574536 secs] Heap after GC invocations=1458: Heap PSYoungGen total 135104K, used 1897K [6e000000, 78aa0000, 78aa0000) eden space 95488K, 0% used [6e000000,6e000000,73d40000) from space 39616K, 4% used [73d40000,73f1a5c0,763f0000) to space 38464K, 0% used [76510000,76510000,78aa0000) PSOldGen total 349568K, used 163770K [58800000, 6dd60000, 6dd60000) object space 349568K, 46% used [58800000,627eea38,6dd60000) PSPermGen total 31744K, used 29578K [54800000, 56700000, 58800000) object space 31744K, 93% used [54800000,564e2810,56700000) } |
제목 : Re: 오전에 발생한 현상은... 글쓴이: 이원영(javaservice) 2005/12/22 15:16:35 조회수:380 줄수:16 |
오전에 발생한 현상은 heap 메모리와는 무관하게 HP-UX의 커널파라메터인 max_thread_proc 값에 영향은 받은 것 같습니다. default가 64이기 때문에 하나의 process가 64개 이상의 thread를 생성하지 못합니다. 보시는 방법은 kmtune | grep max_thread_proc 하시면 될 겁니다. NOTE: 그러나, 맨 처음 올려주신 OutOfMemoryError는 heap 힙메모리와 관련되어 있는 것으로 추정되며, 오전 상황과는 다른 이슈로 보입니다. 해당 현상이 일어났을 때, 앞서처럼 verbosegc 결과를 올려주시면 가이드를 드리겠습니다. 자바서비스넷 이원영 Phone: 010-6239-6498 E-mail: NOSPAM_lwy@javaservice.com MSN: NOSPAM_javaservice@hanmail.net |
제목 : Re: 그렇다면 thread 수가 일반적인것인지요? 글쓴이: 손님(guest) 2005/12/22 15:48:14 조회수:343 줄수:12 |
그렇군요. heap 메모리에 대해서는 프로그램적인 누수가 있을수도 있지만, 아직 정확하게 파악할수 있지는 못해서 1차적으로 java option에서 메모리 옵션을 늘려서 지켜보고 있는 상황입니다. 말씀하신것처럼 thread의 수가 64개로 잡혀있네요. max_thread_proc 64 - 64 그런데 제가 시스템 엔지니어가 아니다보니 이 수치가 준포탈급의 사이트를 운영하기에 적당한것인지에 대해서는 잘 모르겠네요. 항상 도움만 받아가네요. 감사합니다. |
제목 : Re: HP-UX의 Thread 모델은.. 글쓴이: 이원영(javaservice) 2005/12/22 15:55:02 조회수:633 줄수:31 |
HP-UX의 Thread 모델은 IBM AIX나 SUN Solaris에 비해 상대적으로 무겁습니다. 그래서 JVM하나에서 여러개의 Thread를 띄우는 것이 상대적으로 힘겹게 다가옵니다. 그래서인지, default로 설정된 max_thread_proc 64개는 WAS(웹어플리케이션서버)와 같이 하나의 JVM에서 multi-thread로 구동되는 환경에서 늘 한번씩 겪는 것으로 상대적으로 작게 설정되어 있는 감이 늘 있습니다. 튜닝시 약방의 감초처럼 항상 올려주어야 합니다. (Thread 모델의 특성 그렇다는 것이지, HP-UX가 WAS를 운영하기에 성능이 좋지 않다는 얘기가 전혀 아닙니다. Thread를 키우는 것 보다 process를 multi로 클러스터링 하는 것이 HP-UX에서는 보다 효과적이며, 개인적인 생각으로는 HP-UX가 WAS운영머신 및 성능적 관점에서 매우 유리한 위치를 차지하고 있다고 생각합니다.) Tomcat의 허용가능한 최대 thread 보다는 최소한 max_thread_proc 값이 크게 잡혀있어야 겠지요. 그러면 Tomcat의 최대 thread값은 얼마가 적당하냐란 질문이 나올 수 있는데, 이건 답이 없는 문제로서, 해당 사이트의 특성에 맞게 설정해야 합니다. (제니퍼와 같은 APM툴을 사용하시면 운영중에 몇개의 thread가 늘 쓰이는지를 모니터링 하실 수 있겠지요) 액티브서비스의 개수는 깔때기에 물을 일정하게 내려보낼 때, 그 물높이 해당 하는 특성이 있습니다. 단위시간당 흘러나올 수 있는 물의 량보다 단위시간당 흘러들어오는 물의 량이 근접하게 될 때, 물높이는 상대적으로 짧은 시간에 높아집니다.(정확히는 분수함수의 특성이 있습니다.) 무엇인가 backend에서 잠시 막히면 순식간에 차 올라오게 되지요. 따라서, 50개냐, 100개냐, 200개냐의 문제가 아닙니다. 50보 100보의 특성이 있는 것이지요. ------- 2005.12.23 첨언 아래 질문에 대해, "예, 적어도 그렇습니다." 자바서비스넷 이원영 Phone: 010-6239-6498 E-mail: NOSPAM_lwy@javaservice.com MSN: NOSPAM_javaservice@hanmail.net |
제목 : Re: 그렇다면...? 글쓴이: 손님(guest) 2005/12/22 18:36:40 조회수:297 줄수:9 |
일반적으로 tomcat의 server.xml에 <Connector port="8080" maxHttpHeaderSize="8192" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" 와 같이 설정이 되어 있는데요, 그렇다면 HP-UX의 max_thread_proc 값이 위의 maxThreads 값보다는 즉, 150과 같거나 높게 설정이 되어야 하는건가요? |
[펌] eclipse short cuts (0) | 2007.11.28 |
---|---|
[펌] eclipse 에서 run 실행시 jvm 에 대한 세팅은 어디서 하나요? (0) | 2007.11.28 |
james mail server (0) | 2007.11.28 |
[펌] james mail server setting (0) | 2007.11.28 |
[펌] JUnit 설정 (0) | 2007.11.28 |
★ E-mail 보내기
* http://james.apache.org/ 에서 james 메일 서버 다운로드
* C:\james 에 압축을 풀고 C:\james\bin 의 run.bat 파일을 실행
* James 환경 설정
– C:\james\apps\james\SAR-INF의 config.xml 파일 변경
사용자의 아이디와 암호를 변경 - <account login="itea" password="itea"/>
메일 서버 설정 - <servername>61.109.232.158</servername>
DNS 서버 지정
- <dnsserver>
<servers>
<server>168.126.63.1</server>
<server>168.126.63.2</server>
<server>61.109.232.158</server>
<server>127.0.0.1</server>
</servers>
<autodiscover>true</autodiscover>
<authoritative>false</authoritative>
</dnsserver>
* config.xml 파일을 변경한 후 james 서버를 실행
* 메일 사용자 계정을 만들기 위해 명령어 창에서 이렇게 입력해서 james 서버에 연결
C:\> telnet localhost 4555
* 새로운 메일 계정을 만들기 위해서 이렇게 한다.
로그인을 한 다음,
adduser 아이디 비번 이렇게 입력하면 새로운 메일 계정이 생성됨.
프로젝트 때는 ID: itea PW: itea 로 통합해서 사용하겠음.
* 메일을 전송하고 읽기 위해서 라이브러리 다운로드
http://java.sun.com/products/javamail/ 에서 JavaMail 위한 라이브러리 다운로드
압축을 풀고 mail.jar 파일을 j2SDK/jre/lib/ext 와 Tomcat/common/lib 에 복사
http://java.sun.com/products/javabeans/glasgow/jaf.html 에서 JAF 라이브러리 다운로드
압축을 풀고 activation.jar 파일을 j2SDK/jre/lib/ext 와 Tomcat/common/lib에 복사
톰캣 다시 시작
ps.
<authorizedAddresses>127.0.0.0/8, 61.109.232.*</authorizedAddresses>
메일 전송 권한 설정 - D:\www\james-2.2.0\apps\james\SAR-INF\config.xml 에서...
위의 속성을 없애면 아무나 메일을 보낼 수 있다. 즉, 스팸 메일 서버 등으로 사용가능해짐 ㅡ.ㅡ;;
[펌] eclipse 에서 run 실행시 jvm 에 대한 세팅은 어디서 하나요? (0) | 2007.11.28 |
---|---|
Tomcat 다운현상 (0) | 2007.11.28 |
[펌] james mail server setting (0) | 2007.11.28 |
[펌] JUnit 설정 (0) | 2007.11.28 |
CVS 설치 후, 사용자 추가하기 (0) | 2007.11.28 |
http://blog.naver.com/galad/140033607909
james mail server setting
0. 실행 환경 2000 서버, Tomcat4.1.30, JDK1.4.3
1. http://james.apache.org/download.cg에 가서 실행파일을 받아 온다.
Avalon Phoenix라는 것이 필요하다는 말이 있는데 실행 파일을 받아오면 그 안에 다 있는
것 같습니다. 그러니 따로 받지 않아도 됩니다.
2. 적당한 폴더에 압축을 풀고 james-2.1.3\bin 밑에 있는 run.bat를 실행시키십시요.
물론 그전에 JDK는 설치가 되어 있어야 합니다. 실행이 되고 나면 Dos창이 하나 뜨는데 일
단은 강제 종료를 시키십시요.
3. Dos창을 종료하고 james-2.1.3\apps 폴더를 보면 james라는 폴더가 생겨있을 겁니다.
4. james-2.1.3\apps\james\SAR-INF 폴더에 가서 보면 config.xml이라는 파일이 있는데
이게 설정 화일입니다.
5. 에디터에서 그 파일을 열어 보면 여러가지 것들을 설청 할수 있습니다.
5-1. 28번 줄에 <postmaster>Postmaster@abc.com</postmaster>으로 수정하세요.
왜 그러는지는 알수 없지만 나중에 메일 서버를 관리 할때 필요
5.2. 49번 줄에 <servername>abc.com</servername>으로 수정하세요.
여기서 서버이름에 mail.abc.com으로 하시면 메일을 보낼때 메일 주소를
user_id@mail.abc.com으로 해야 메일이 들어 오더라구요.
5-3. <dnsserver>
<servers>
<!-- CONFIRM? -->
<!--Enter ip address of your DNS server, one IP address per server -->
<!-- element. The default configuration assumes a DNS server on the localhost.
-->
<server>000.000.000.000</server>
</servers>
<authoritative>false</authoritative>
</dnsserver> 부분을 수정하세요.
메일 서버 James가 설치된 서버의 IP를 적으시면 됩니다.
5-4. <remotemanager><remotemanager/>부분의 login/password가 있습니다. 자신이 원
하는 ID와 패스로 수정하세요.
나중에 유저를 관리할때 필요합니다.
6. james-2.1.3\bin 밑에 있는 run.bat를 다시 실행시키십시요. 다음과 같은 메시지가 나오면
성공입니다.
Using PHOENIX_HOME: C:\james213\james-2.1.3
Using PHOENIX_TMPDIR: C:\james213\james-2.1.3\temp
Using JAVA_HOME:
Phoenix 4.0.1
James 2.1.3
Remote Manager Service started plain:4555
POP3 Service started plain:110
SMTP Service started plain:25
NNTP Service started plain:119
Fetch POP Disabled
7. Dos창을 하나 더 띄우세요. 그리고 telnet abc.com 4555로 접속하면
<remotemanager><remotemanager/>부분에서 정의한 ID로 접속하시면 됩니다.
접속에 성곡하면 adduser test 1234같이 사용자를 추가 하세요.
help를 치시면 도움말이 나옵니다.
8. outlook express 에서 메일 계정을 등록한 후에 테스를 해보시면 됩니다.
9. spoolmanager, Matchers, Mailets, DB접속은 아직 테스트 못해 봤습니다.
1. 다운로드 및 설치
우선 James를 받습니다...
받을곳은 http://mirror.apache.or.kr/jakarta/james/binaries/
여기서 james-2.1.3.zip를 받습니다
받은다음 아무곳에나 압축을 풀고 james/bin 디렉토리에 run.bat를 실행하면
Phienix 4.0.1이 먼저 가동되고 James 2.1.3이 실행되었다고 나옵니다..
2. 사용자 추가
James를 가동한걸 잘 보면 Remote Manager Service Started plain:4555 라고 나올걸 볼
수 있습니다.
여기가 admin콘솔. 텔넷으로 접속합니다.
명령 프롬프트에서 telnet localhost 4555 라고 치면 아이디랑 패스워드 넣으라고 나옵니
다. 디폴트로 root/root로 잡혀있어요. 이거를 넣으면 Welcome root HELP for list 라고
나옵니다.
여기서 adduser [사용자 이름] [패스워드] 라고 치면 User [사용자이름] added 라는 메세
지가 나옵니다. 추가된걸 확인하려면 listusers 라고 치면 됩니다.
3. 메일보내기/받기
아웃룩에서 새로운 계정을 만듭니다.메일주소는 [사용자이름]@localhost
POP3는 localhost , SMTP도 localhost, 사용자랑 비번은 아까 추가한 그걸로 넣으면 됩니
다.그리고 테스트해보세요.
4. 설정하기
James홈 밑에 app/james/SAR-INF/config.xml화일이 있읍니다..이게 설정화일입니다.
28번째줄 정도에 보시면 <postmaster>admin@localhost</postmaster> 에서
localhost대신에 도메인 네임을 적으시면 되고요~~
49번째줄 정도에 보시면 <servername>localhost</servername> 에서 바꿔주심 돼 요.
368번째줄 정도에 보시면
<!-- Change the default login/password. -->
<account login="root" password="root"/>
이부분이 있는데 여기가 아까 어드민콘솔에 들어갈때 아이디랑 패스워드 입니다.
Tomcat 다운현상 (0) | 2007.11.28 |
---|---|
james mail server (0) | 2007.11.28 |
[펌] JUnit 설정 (0) | 2007.11.28 |
CVS 설치 후, 사용자 추가하기 (0) | 2007.11.28 |
cmd here! (0) | 2007.11.27 |
[이클립스에서 JUnit 설정]
1. 상단 메뉴에서 [Window] -> [Preference] 를 선택한 다음, 좌측 트리에서 [Java]를 클릭한 다음 아래 생성된 [Junit] 클릭하여 JUnit 기본 설정을 변경할 수 있다.
[이클립스에서 JUnit 테스트]
1. [Package Explorer] 에서 소스가 위치한 소스폴더 또는 패키지에서 팝업메뉴를 띄운 다음 [New] -> [Other] 를 선택
2. 화면에 나타난 다이얼로그에서 [Java] -> [JUnit] -> [JUnit Test Case]를 선택
3. 화면에 나타난 메뉴 중단의 [Name] 항목에 새로운 JAVA 파일명을 입력하고, 하단의 [Class Under Test] 항목에는 테스트하고자 하는 JAVA 파일명을 입력한다.
4. 새로 나타난 화면에서 테스트 하고자 하는 메소드를 선택하여 체크한 다음 [Finish]버튼 클릭
5. 소스 창에 탬플릿이 생성된 것을 볼 수 있으며, 주어진 템플릿을 이용하여 코딩한다.
6. 소스 작성이 마무리 되면, 해당 소스를 선택한 다음, 팝업 메뉴에서 [Run] -> [Junit Test]를 클릭하면 테스트 내용을 [Junit] Perspective로 나타난다.
* JUnit Test Suite의 경우에도 위와 동일한 방식으로 템플릿 생성 및 테스트가 가능하다.
Tomcat 다운현상 (0) | 2007.11.28 |
---|---|
james mail server (0) | 2007.11.28 |
[펌] james mail server setting (0) | 2007.11.28 |
CVS 설치 후, 사용자 추가하기 (0) | 2007.11.28 |
cmd here! (0) | 2007.11.27 |
1. CVS에서 사용할 디렉토리를 설정해줘야 한다.
Repository 라는 영역과 Temporary 라는 영역을 설정해 줘야 하는데
Temporary는 일반적인 임시파일을 쓸 경로로 지정해주면 되고
Repository는 CVS서버 하위의 저장공간이라고 생각하면 된다.
(각각의 Repository는 독립적인 경로를 가지게 되며 하위에 여러가지 모듈을
가지며 로그인 가능한 사용자등도 따로 가지게 된다.)
주의 Repository 와Temporary는 C:₩Documents and Settings₩ 하위 디렉토리에 설정을 하면 안된다.
(권한 관련한 문제가 생김)
2. 이제 CVS Conrtol Panel을 실행시켜
우선 CVSNT Service와 CVSNT Lock Service 를 멈춰준다.
Server Settings 탭으로 이동한후
Temporary를 설정해 준다.
Repository configuration 탭으로 이동후
Location 에 적당한 폴더를 설정한다.
Name 의 경우 외부에서 CVS에 접속을 할때 Repository를 선택할수 있는 이름을 나타낸다.
3. 이제 CVS의 각 Repository에 접속가능한 유저계정을 생성해야 한다.
이것은 윈도우의 계정을 설정할수도 있고 하나의 윈도우 계정을 사용하는 자체 cvs 계정을 생성할수도 있다.
물론 실제로 사용되는 윈도우 계정이 위에서 설정했던 디렉토리에 접근권한이 있어야 한다.
Administrator 를 cvs에서 사용하는 윈도우 계정으로 하고 사용자 계정을 만들어보면
윈도우의 시작 -> 실행 에서 cmd 를 입력하고 엔터를 눌러 커맨드 창을 띄운다.
프롬프트에서 cvs를 입력해 본다.
여기서 실행파일을 찾을수 없다는 메세지가 나오면 CVSNT를 설치하면서 정상적으로 PATH가 설정되지 않은 경우다. 이 경우는 환경변수(제어판->시스탬->고급->환경변수)의 PATH에 CVSNT가 설치된 디렉토리를 추가 시켜준다.
cvs에 정상적으로 접근을 하기위해서는 CVSROOT 라는 환경변수가 설정이 되어있어야 하므로 프롬프트 창에서
set CVSROOT=:pserver:Administrator@127.0.0.1:/SSA
를 입력한다. 위의 127.0.0.1 이 접속하려는 서버의 주소다.
그 앞의 Administrator 가 접속하려는 계정이고 가장 뒤의 /SSA는 위에서 설정해준 Repository 의 이름이다.
이제 로그인을 위해서 프롬프트 창에
cvs login
을 입력하고 해당계정의 패스워드를 입력한다.
정상적으로 로그인이 되면 아무메세지 없이 프롬프트로 돌아오며 이제 유저를 추가하면 된다.
cvs passwd -r Administrator -a yoway
을 입력하면 yoway 라는 계정을 추가하게 되며 CVS로 yoway 라는 계정으로 user가 로그인을 하면 윈도우의 Administrator 계정을 사용해서
CVS서버내의 리소스 접근권한을 제어하게 된다.
!! 위 처럼 해도 안되는 경우가 많다. 그 때는 새로이 cmd창을 열어서
C:\Documents and Settings\Administrator>set CVSROOT=:pserver:Administrator@127.0.0.1:/blog
C:\Documents and Settings\Administrator>cvs -d d:/www/CVS/blog passwd -r Administrator -a itea
Adding user itea
New Password:
Verify Password:
이것 처럼 한다
4. admin 권한주기
Repository 로 설정한 디렉토리의 CVSROOT 디렉토리 안에 admin 파일을 생성하고 각 줄에 하나씩 아이디를 적어주면 해당 아이디가 admin 권한을 가지게 된다.
5. 첨언
● Repository 는 각각이 source safe 에서 하나의 서버라고 생각하면 된다. 각각의 Repository 는 서로 다른 유저계정을 관리하므로 서로 다른팀, 완전히 독립된 프로젝트 등을 하나의 Repository 로 구분하는것이 좋다.
● 설치해서 Repository 를 설정하고 유저를 추가하는것 까지만 해두면 나머지 실제 모듈을 생성하고 소스를 올려두는것은 클라이언트 단에서 처리가 가능하다. 괜히 비어있는 Repository 에 소스를 올리고 할 필요는 없다.
● 방화벽이 있으면 외부에서 CVS에 접속을 할수가 없으므로 TCP 2401포트와 2402포트를 열어둬야 한다.
Tomcat 다운현상 (0) | 2007.11.28 |
---|---|
james mail server (0) | 2007.11.28 |
[펌] james mail server setting (0) | 2007.11.28 |
[펌] JUnit 설정 (0) | 2007.11.28 |
cmd here! (0) | 2007.11.27 |