Jul 27 2007

[JAVA]Apache Logging(Log4j) - 편리한 로깅 기록을 도우는 라이브러리

분류: Open.Library 태그: ,, , Heart @ 12:49 오전

Trackback : http://dev.heartsavior.net/archives/90/trackback/

Log4j는 Java 관련한 로깅 라이브러리에서 가장 많이 사용되고 있는 라이브러리입니다.
아파치 재단의 명성에 걸맞게 상당히 강력하며, JDK 1.4부터 기본 포함되어 있습니다.

관련 자료들을 읽어 보시면 ‘정말 간단하게 강력한 로깅을 수행할 수 있구나’ 라고 생각하실 것입니다.

먼저, 영어 자료입니다.

@ Don’t Use System.out.println! Use Log4j

영어 문서를 자유롭게 읽으실 수 있으시다면 이 문서 하나만 보셔도 되지 않을까 싶네요. 사실 전 아래의 사이트로 공부했는데, 위의 문서를 대충 훓어보니 내용이 거의 다 있습니다.

영어 울렁증이 있으신 분은 (약간의 귀차니즘이 있지만) 아래 사이트를 참조하세요.

@ loveLazur 오픈소스 && 아키텍쳐 - 오픈소스를 이용한 SI

phpBB로 만들어져 있고, 가입을 해야 볼 수 있지만, 주인장님의 Log4j 관련한 포스트들은 그만한 가치가 있네요.
딱딱하지도 않고, 예제 중심으로 설명이 되어 초심자 입장에서 친숙하게 익힐 수가 있습니다.
출력해서 보려고 워드 파일에 정리하니까 40페이지 정도 되고, 한 페이지에 두장씩 찍으니 20페이지… 쭉 훓어보는 데 30분도 안 걸린 것 같네요. 이렇게 깔끔하게 정리해 주신 데 감사드려야겠습니다. ^^

간단한 설정 파일만으로도 강력한 로깅이 가능하다는 게 Log4j의 강력함이라고 할 수 있겠습니다.
아래는 제가 loveLazur 님의 포스트들을 읽고 테스트 용도로 만든 것입니다.

[log4jconf.xml]
<?xml version=”1.0″ encoding=”UTF-8″ ?>
<!DOCTYPE log4j:configuration SYSTEM “log4j.dtd”>
<log4j:configuration xmlns:log4j=’http://jakarta.apache.org/log4j/’>

<!– Standard output –>
<appender name=”STDOUT” class=”org.apache.log4j.ConsoleAppender”>
<layout class=”org.apache.log4j.PatternLayout”>
<param name=”ConversionPattern”
value=”%d %-5p [%t] %C{2} (%F:%L) - %m%n”/>
</layout>
</appender>

<!– Daily Rolling File Appender output –>
<appender name=”DAILY” class=”org.apache.log4j.DailyRollingFileAppender”>
<param name=”datePattern” value=”yyyy-MM-dd” />
<param name=”file” value=”log/SyncService.log” />
<param name=”append” value=”true” />
<layout class=”org.apache.log4j.PatternLayout”>
<param name=”ConversionPattern”
value=”%d %-5p [%t] %C{2} (%F:%L) - %m%n”/>
</layout>
</appender>

<!– Category logger–>
<category name=”CONSOLELOG” additivity=”false”>
<priority value=”debug” />
<appender-ref ref=”STDOUT” />
</category>

<!– package logger –>
<category name=”FILELOG” additivity=”false”>
<priority value=”debug” />
<appender-ref ref=”DAILY” />
</category>

<!– root category –>
<root>
<priority value =”debug” />
<appender-ref ref=”STDOUT” />
</root>
</log4j:configuration>

[test.java]

{
Logger logger = Logger.getLogger(”FILELOG”);

Logger logger2 = Logger.getLogger(”CONSOLELOG”);

String conf = “log4jconf.xml”;
DOMConfigurator.configure(conf);

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”);

logger2.debug(”Here is some DEBUG!!”);
}

이렇게 하면 콘솔 화면에는

2007-07-27 00:49:37,687 DEBUG [main] test.SyncFeatureTest (SyncFeatureTest.java:362) - Here is some DEBUG!!

log/SyncService.log 파일은

2007-07-27 00:49:37,640 DEBUG [main] test.SyncFeatureTest (SyncFeatureTest.java:356) - Here is some DEBUG
2007-07-27 00:49:37,671 INFO  [main] test.SyncFeatureTest (SyncFeatureTest.java:357) - Here is some INFO
2007-07-27 00:49:37,671 WARN  [main] test.SyncFeatureTest (SyncFeatureTest.java:358) - Here is some WARN
2007-07-27 00:49:37,671 ERROR [main] test.SyncFeatureTest (SyncFeatureTest.java:359) - Here is some ERROR
2007-07-27 00:49:37,687 FATAL [main] test.SyncFeatureTest (SyncFeatureTest.java:360) - Here is some FATAL

로 기록됩니다. 특히, “FILELOG” 로거로 로깅되는 정보는 날짜가 지나면 파일이 자동으로 생성되어 나뉩니다.


Jul 24 2007

[JAVA]Apache Commons DBCP - Application에서 DB Connection Pool 관리하기

분류: Open.Library 태그: ,, , Heart @ 5:43 오후

Trackback : http://dev.heartsavior.net/archives/91/trackback/

DBMS와 연동하는 프로그램이라면 DB 접속/해제에 드는 리소스 소모가 크기 때문에 커넥션 풀을 사용하여 DBMS와 연동하게 됩니다.

JSP/Servlet에서는 WAS에서 제공하는 데이터 소스를 이용하면 간단하면서도 강력하게 해결할 수 있으며, 웹 상에 상당히 많은 자료들이 이를 다루고 있습니다. 본 포스트는 일반 Java Application에서 DBCP를 사용하여 커넥션 풀을 사용하는 방법만 간단하게 다루고자 합니다.

@ Apache Commons DBCP 메인 사이트

우선 Apache Commons DBCP(이하 DBCP)는 아래 세 가지의 라이브러리 파일이 필요합니다.
(파일명을 누르시면 다운로드 페이지로 이동합니다)

commons-dbcp.jar
commons-pool.jar
commons-collections.jar

아래의 파일들을 클래스 패스에 추가해 주시면 준비물은 다 갖추신 것입니다.
이제 아래의 예제를 보아 주시기 바랍니다.

아래의 예제들은 DBCP 사이트에 있는 예제입니다.
(해당 소스는 서브버전으로 관리되어 있고, VIEWVC로 웹 상에 노출되고 있으며, VIEW 페이지를 링크했습니다.)

@ BasicDataSourceExample.java
@ ManualPoolingDataSourceExample.java
@ ManualPoolingDriverExample.java

가장 빠르고 쉽게 커넥션 풀을 사용할 수 있는 방법은 첫 번째 예제에 제시되어 있습니다.
바로 BasicDataSource를 사용하는 것인데, 제공하는 예제가 상당히 간단할 정도로 설정 방법도 간단합니다.
아래와 같이 몇 라인이면 설정이 완료되고,

BasicDataSource ds = new BasicDataSource();
ds.setDriverClassName(…);
ds.setUrl(…);
ds.setUserName(…);
ds.setPassword(…);

아래와 같은 방법으로 Connection 객체를 커넥션 풀에서 얻어낼 수 있습니다.

Connection conn = ds.getConnection();

이후로는 일반 Connection 객체를 사용하듯이 쓰면 됩니다. close() 시에 다른 클래스를 경유해야 한다거나 하는 것도 없습니다. BasicDataSource를 close 할 수는 있지만 (예제를 미루어 보아)꼭 해야 되는 것도 아닌 것으로 보입니다.

ASF(Apache Software Foundation)… 역시 Java 프로그래머라면 한번쯤 도움을 받을 곳인 것 같네요.
C/C++를 회사에서 주력으로 사용하고 있긴 하지만, Java로 코딩할 때 짬짬이 잘 정리해야겠습니다.


Jul 23 2007

[JAVA]Jakarta Commons Net - FTP 사용 예제

분류: Open.Library 태그: ,, , Heart @ 6:05 오후

Trackback : http://dev.heartsavior.net/archives/92/trackback/

@ Jakarta Commons Net을 사용한 FTP 파일 송수신(최범균 님)
@ Commons-net I탄 FTP(GoodBug 님)
@ Commons NET을 이용한 FTP PASSIVE 업로드 예제(하자두 님)
@ Jakarta Commons Net 에서 FTP 사용시 목록이 안보일 경우(GoodBug 님)

허락을 득하고 펌해야 하는 것 같아 내용을 펌하지 않고 링크를 모아 두었습니다.
첫 번째와 두 번째 포스트에 기본적인 설명과 예제가 모두 잘 정리가 되어 있어서 두 가지 포스트를 보고
빠진 내용은 API를 참조하시면서 바로 구현을 시작하시면 될 것 같습니다.
세 번째와 네 번째 포스트는 트러블슈팅 용으로 사용하시면 될 것 같네요.

FTP는 날짜를 보여주는 형식이 OS 종류마다 조금씩 달라서 파싱하는 데 신경을 많이 써야 합니다.
가령 아래와 같은 경우가 생기는 것이죠.(실제로 클라이언트 사이트에서 생겨난 문제입니다.)

-rwxr-xr-x 1 abcdef xxgrp 2781 12월 18일 11:11 abc
-rwxr-xr-x 1 abcdef xxgrp 1724 12월 15일 10:49 bcd
-rwxr-xr-x 1 abcdef xxgrp 1462 2006.12.11 def.ghi

3번째 파일의 날짜 부분이 형식이 완전히 다릅니다.
A/X(MFC)로는 데이터를 가져와서 직접 파싱해야 되는데 Commons Net으로는 네 번째 포스트 내용처럼 어렵지 않게 해결되는 것으로 보이네요.

바로 적용해야 하는 분들만 제가 테스트용으로 만든 아래의 실 사용 예제를 참조하시길…
필요한 기능만 테스트하도록 엄청 간단하게 짜서 이해하시기에는 쉬우실 거라 생각합니다.

소스 열기..


뒷 쪽 »