Tomcat 작 동 방식 (10)

15290 단어 tomcat
본 고 는 다음 에 tomcat 의 로그 기록 기 를 분석 하고 로그 기록 기 는 메 시 지 를 기록 하 는 구성 요소 입 니 다. tomcat 에서 로그 기록 기 는 특정한 servlet 용기 와 연결 되 어야 합 니 다.org. apache. catalina. logger 패키지 에서 tomcat 는 몇 가지 유형의 로그 기록 기 를 제공 합 니 다.
tomcat 의 로그 기록 기 는 org. apache. catalina. Logger 인 터 페 이 스 를 실현 해 야 합 니 다.
public interface Logger {    

    public static final int FATAL = Integer.MIN_VALUE;

    public static final int ERROR = 1;

    public static final int WARNING = 2;

    public static final int INFORMATION = 3;

    public static final int DEBUG = 4;
   
    public Container getContainer();
   
    public void setContainer(Container container);
   
    public String getInfo();
   
    public int getVerbosity();
    
    public void setVerbosity(int verbosity);
   
    public void addPropertyChangeListener(PropertyChangeListener listener);
   
    public void log(String message);
    
    public void log(Exception exception, String msg);
   
    public void log(String message, Throwable throwable);
   
    public void log(String message, int verbosity);
   
    public void log(String message, Throwable throwable, int verbosity);
   
    public void removePropertyChangeListener(PropertyChangeListener listener);
}

일반적으로 로그 단계 verbosity 가 Logger 가 설정 한 단계 보다 클 때 message 는 기록 되 며, 그렇지 않 으 면 무 시 됩 니 다.
Logger 인 터 페 이 스 는 모두 다섯 가지 로그 단 계 를 정의 하 였 는데, 각각 FATAL 이다. ERROR WARNING INFORMATION DEBUG
Tomcat 은 SystemOutLogger, SystemErrLogger, FileLogger 등 세 가지 유형의 로그 기록 기 를 제공 합 니 다. org. apache. catalina. logger 가방 에서 모두 org. apache. catalina. logger. LoggerBase 류 를 계승 합 니 다.
LoggerBase 클래스 는 org. apache. catalina. Logger 인 터 페 이 스 를 실 현 했 고 tomcat 5 에 서 는 Lifecycle 인터페이스 도 실현 했다.
LoggerBase 클래스 는 추상 클래스 로 Logger 인터페이스 에서 abstract void log (String msg) 를 제외 한 모든 방법 이 실 현 됩 니 다. 모든 다른 재 부팅 방법 은 최종 적 으로 이 방법 (templet 모드) 을 호출 합 니 다. set Verbosity () 방법 으로 로그 단 계 를 설정 할 수 있 습 니 다.
구체 적 인 로그 클래스 는 모두 비교적 간단 합 니 다. 다음은 SystemOutLogger 클래스 의 실현 입 니 다.
public class SystemOutLogger
    extends LoggerBase {
   
    protected static final String info =
        "org.apache.catalina.logger.SystemOutLogger/1.0";
   
    public void log(String msg) {

        System.out.println(msg);

    }
}

SystemErrLogger 클래스
public class SystemErrLogger
    extends LoggerBase {
   
    protected static final String info =
        "org.apache.catalina.logger.SystemErrLogger/1.0";
   
    public void log(String msg) {

        System.err.println(msg);
    }
}

FileLogger 클래스 는 조금 복잡 합 니 다. servlet 용기 에서 받 은 메 시 지 를 파일 에 기록 합 니 다. (tomcat 4 에서 FileLogger 클래스 는 Lifecycle 인 터 페 이 스 를 실현 합 니 다)
public class FileLogger
    extends LoggerBase
    implements Lifecycle {
    protected LifecycleSupport lifecycle = new LifecycleSupport(this);
    private StringManager sm =
        StringManager.getManager(Constants.Package);

    private boolean started = false;

    private String suffix = ".log";

    private boolean timestamp = false;

    private PrintWriter writer = null;
    public void log(String msg) {

        // Construct the timestamp we will use, if requested
        Timestamp ts = new Timestamp(System.currentTimeMillis());
        String tsString = ts.toString().substring(0, 19);
        String tsDate = tsString.substring(0, 10);

        // If the date has changed, switch log files
        if (!date.equals(tsDate)) {
            synchronized (this) {
                if (!date.equals(tsDate)) {
                    close();
                    date = tsDate;
                    open();
                }
            }
        }

        // Log this message, timestamped if necessary
        if (writer != null) {
            if (timestamp) {
                writer.println(tsString + " " + msg);
            } else {
                writer.println(msg);
            }
        }

    }

    private void close() {

        if (writer == null)
            return;
        writer.flush();
        writer.close();
        writer = null;
        date = "";
    }

    /**
     * Open the new log file for the date specified by <code>date</code>.
     */
    private void open() {

        // Create the directory if necessary
        File dir = new File(directory);
        if (!dir.isAbsolute())
            dir = new File(System.getProperty("catalina.base"), directory);
        dir.mkdirs();

        // Open the current log file
        try {
            String pathname = dir.getAbsolutePath() + File.separator +
                prefix + date + suffix;
            writer = new PrintWriter(new FileWriter(pathname, true), true);
        } catch (IOException e) {
            writer = null;
        }

    }
  
    public void addLifecycleListener(LifecycleListener listener) {

        lifecycle.addLifecycleListener(listener);
    }
public LifecycleListener[] findLifecycleListeners() { return lifecycle.findLifecycleListeners(); } public void removeLifecycleListener(LifecycleListener listener) { lifecycle.removeLifecycleListener(listener); } public void start() throws LifecycleException { // Validate and update our current component state if (started) throw new LifecycleException (sm.getString("fileLogger.alreadyStarted")); lifecycle.fireLifecycleEvent(START_EVENT, null); started = true; } public void stop() throws LifecycleException { // Validate and update our current component state if (!started) throw new LifecycleException (sm.getString("fileLogger.notStarted")); lifecycle.fireLifecycleEvent(STOP_EVENT, null); started = false; close(); } }

--------------------------------------------------------------------------- 
본 시 리 즈 는 Tomcat Works 학과 본인 의 오리지널 작품 입 니 다. 
전재 블 로그 원 고슴도치 의 온순 함 을 밝 혀 주세요. 
본인 메 일 박스: chenying 998179 \ # 163. com (\ # @ 으로 변경)
본문 링크

좋은 웹페이지 즐겨찾기