tomcat 로그 java.util.logging.Logger 사용(2)

4192 단어 logging
# default file output is in user's home directory.  
java.util.logging.FileHandler.pattern = %h/java%u.log  
java.util.logging.FileHandler.limit = 50000  
java.util.logging.FileHandler.count = 1  
java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter  
  
# Limit the message that are printed on the console to INFO and above.  
java.util.logging.ConsoleHandler.level = WARNING   
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter  

1:출력 로 그 를 다시 쓰 는 형식
java.util.logging.ConsoleHanlder.formatter 속성 을 설정 해 야 합 니 다.
이 문 제 는 자바 SE 프로그램 에서 문제 가 없습니다.자바 프로그램 은 이 설정 을 통 해 사용자 정의 Formatter 를 찾 을 수 있 습 니 다.
하지만 Tomcat 등 웹 프로젝트 에 넣 으 면문제 가 생 겼 다
Console Handler 의 소스 코드 를 보 겠 습 니 다.
public class ConsoleHandler extends StreamHandler {
    // Private method to configure a ConsoleHandler from LogManager
    // properties and/or default values as specified in the class
    // javadoc.
    private void configure() {
        LogManager manager = LogManager.getLogManager();
	String cname = getClass().getName();

	setLevel(manager.getLevelProperty(cname +".level", Level.INFO));
	setFilter(manager.getFilterProperty(cname +".filter", null));
	setFormatter(manager.getFormatterProperty(cname +".formatter", new SimpleFormatter()));
	try {
	    setEncoding(manager.getStringProperty(cname +".encoding", null));
	} catch (Exception ex) {
	    try {
	        setEncoding(null);
	    } catch (Exception ex2) {
		// doing a setEncoding with null should always work.
		// assert false;
	    }
	}
    }
그 중 한 줄 의 코드 가 있 습 니 다.설정 파일 에 있 는'formatter'를 설정 하 는 데 사 용 됩 니 다.
setFormatter(manager.getFormatterProperty(cname +".formatter", new SimpleFormatter()));
추적 하여 발견:ClassLoader.getSystem ClassLoader 는 지정 한 class 에 반사 할 수 없습니다.
  Formatter getFormatterProperty(String name, Formatter defaultValue) {
	String val = getProperty(name);
	try {
	    if (val != null) {
		Class clz = ClassLoader.getSystemClassLoader().loadClass(val);
	        return (Formatter) clz.newInstance();
	    }
	} catch (Exception ex) {
	    // We got one of a variety of exceptions in creating the
	    // class or creating an instance.
	    // Drop through.
	}

Tomcat 관련 문서 계속 찾 아 보기
http://tomcat.apache.org/tomcat-7.0-doc/class-loader-howto.html
System — This class loader is normally initialized from the contents of the CLASSPATH environment variable. All such classes are visible to both Tomcat internal classes, and to web applications. However, the standard Tomcat startup scripts ($CATALINA_HOME/bin/catalina.sh or %CATALINA_HOME%\bin\catalina.bat) totally ignore the contents of the CLASSPATH environment variable itself, and instead build the System class loader from the following repositories:


$CATALINA_HOME/bin/bootstrap.jar — Contains the main() method that is used to initialize the Tomcat server, and the class loader implementation classes it depends on.


$CATALINA_BASE/bin/tomcat-juli.jar or $CATALINA_HOME/bin/tomcat-juli.jar — Logging implementation classes. These include enhancement classes to java.util.logging API, known as Tomcat JULI, and a package-renamed copy of Apache Commons Logging library used internally by Tomcat. See logging documentation for more details.


If tomcat-juli.jar is present in $CATALINA_BASE/bin, it is used instead of the one in $CATALINA_HOME/bin. It is useful in certain logging configurations


$CATALINA_HOME/bin/commons-daemon.jar — The classes from Apache Commons Daemon project. This JAR file is not present in the CLASSPATH built by catalina.bat|.sh scripts, but is referenced from the manifest file of bootstrap.jar.

SystemClassLoader 를 발견 하면 Tomcat-7.0.34\bin 디 렉 터 리 에 있 는 세 개의 Jar 만 불 러 올 수 있 습 니 다.
그 러 니까 JDK 가 가 져 온 로 그 를 계속 사용 해 야 한다 면 Formater 등 을 다시 쓸 수 없다 는 거 야...

좋은 웹페이지 즐겨찾기