/**
* 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
*/
}
'프로그래밍 > Library' 카테고리의 다른 글
[펌] 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 |