Tomcat의 로그파일중 catalina.out은 하나의 파일에 계속 로그가 누적됨으로

파일의 크기가 무지막지하게 커지는 현상을 볼수있다.

차후 파일의 크기가 일정크기를 벗어났을때 에러도 발생하기때문에 정기적으로 Tomcat을 내리고 삭제해주는 작업을 해야되는

불편함이 있어서 파일을 다른 로그처럼 날짜별로 생성하고 싶었다.

 

그래서 검색을 했더니 log4j나 몇가지 다른 방법으로 설정하는 방법이 존재하는거 같았다.

하지만 Apache의 rotatelogs를 이용하는게 제일 쉽고 간단해 보였다.

 

방법은 /Tomcat설치폴더/bin/catalina.sh 파일의 내용중

  shift

  touch "$CATALINA_OUT"

  if [ "$1" = "-security" ] ; then

    if [ $have_tty -eq 1 ]; then

      echo "Using Security Manager"

    fi

    shift

    eval "\"$_RUNJAVA\"" "\"$LOGGING_CONFIG\"" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS \

      -Djava.endorsed.dirs="\"$JAVA_ENDORSED_DIRS\"" -classpath "\"$CLASSPATH\"" \

      -Djava.security.manager \

      -Djava.security.policy=="\"$CATALINA_BASE/conf/catalina.policy\"" \

      -Dcatalina.base="\"$CATALINA_BASE\"" \

      -Dcatalina.home="\"$CATALINA_HOME\"" \

      -Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \

      org.apache.catalina.startup.Bootstrap "$@" start \

      >> "$CATALINA_OUT" 2>&1 "&"

  else

    eval "\"$_RUNJAVA\"" "\"$LOGGING_CONFIG\"" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS \

      -Djava.endorsed.dirs="\"$JAVA_ENDORSED_DIRS\"" -classpath "\"$CLASSPATH\"" \

      -Dcatalina.base="\"$CATALINA_BASE\"" \

      -Dcatalina.home="\"$CATALINA_HOME\"" \

      -Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \

      org.apache.catalina.startup.Bootstrap "$@" start \

      >> "$CATALINA_OUT" 2>&1 "&"

  fi

이부분에서 몇가지 부분을 아래와 같이 변경한다.

  shift

  #touch "$CATALINA_OUT"

  if [ "$1" = "-security" ] ; then

    if [ $have_tty -eq 1 ]; then

      echo "Using Security Manager"

    fi

    shift

    eval "\"$_RUNJAVA\"" "\"$LOGGING_CONFIG\"" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS \

      -Djava.endorsed.dirs="\"$JAVA_ENDORSED_DIRS\"" -classpath "\"$CLASSPATH\"" \

      -Djava.security.manager \

      -Djava.security.policy=="\"$CATALINA_BASE/conf/catalina.policy\"" \

      -Dcatalina.base="\"$CATALINA_BASE\"" \

      -Dcatalina.home="\"$CATALINA_HOME\"" \

      -Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \

      org.apache.catalina.startup.Bootstrap "$@" start \

      2>&1 "&" | /apache설치위치/bin/rotatelogs "$CATALINA_OUT"-%Y-%m-%d 86400 540 &

  else

    eval "\"$_RUNJAVA\"" "\"$LOGGING_CONFIG\"" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS \

      -Djava.endorsed.dirs="\"$JAVA_ENDORSED_DIRS\"" -classpath "\"$CLASSPATH\"" \

      -Dcatalina.base="\"$CATALINA_BASE\"" \

      -Dcatalina.home="\"$CATALINA_HOME\"" \

      -Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \

      org.apache.catalina.startup.Bootstrap "$@" start \

      2>&1 "&" | /apache설치위치/bin/rotatelogs "$CATALINA_OUT"-%Y-%m-%d 86400 540 &

  fi

위의 빨간색 글자부분이 변경된 부분이다.

우선 touch "$CATALINA_OUT" 부분을 주석처리한다.

주석처리하지 않으면 아래와같이 파일크기가 0인 catalina.out 이라는 파일이 계속 생성되어 있는것을 볼수 있다.

그다음으로 Apache가 설치된 경로를 확인한다.

이는 날짜별 파일 생성을 위해 rotatelogs를 사용하는데 Apache의 설치경로 아래에 bin폴더에 존재하기 때문이다.

그리고 나서

>> "$CATALINA_OUT" 2>&1 "&" 

부분이 두군데 있는데 두군데 모두를 

2>&1 "&" | /apache설치위치/bin/rotatelogs "$CATALINA_OUT"-%Y-%m-%d 86400 540 &

로 변경해준다.

 

당연히 "apache설치위치"는 실제 위치를 기재해야된다.

그리고 뒷쪽의 옵션이 %Y-%m-%d 86400 540 이렇게 붙는데

%Y-%m-%d는 날짜 표현(상세 표현 방법은 아래 표 참조)

%A (지역화된) 완전한 요일 이름
%a (지역화된) 3-문자 요일 이름
%B (지역화된) 완전한 달 이름
%b (지역화된) 3-문자 달 이름
%c (지역화된) 날짜와 시간
%d 2-자리 일
%H 2-자리 시간 (24 시간 시계)
%I 2-자리 시간 (12 시간 시계)
%j 3-자리 날짜수
%M 2-자리 분
%m 2-자리 달
%p (지역화된) 12 시간 시계의 am/pm
%S 2-자리 초
%U 2-자리 주일수 (주의 첫번재 날은 일요일)
%W 2-자리 주일수 (주의 첫번재 날은 월요일)
%w 1-자리 요일수 (주의 첫번째 날은 일요일)
%X (지역화된) 시간
%x (지역화된) 날짜
%Y 4-자리 연도
%y 2-자리 연도
%Z 시간대 이름
%% 문자그대로 `%'
 

86400는 로테이션 시간을 초단위로 표현 (86400은 24시간 즉 매일)

540은 표준시와 한국시간과의 시간차를 표현

 

이제 catalina.out 로그는 날짜별로 생성되어 진다.

아래 참고사이트에 가면 더 다양한 설정 방법 및 옵션을 확인 가능하다.

참고 사이트 : http://adminid.kr/unixlinux/102231

                  http://httpd.apache.org/docs/current/programs/rotatelogs.html

                  

AND

///// 톰캣 (Tomcat)

배포할 파일을 tomcat폴더 바로 아래의 webapps에 넣어 놓게 된다.

로그 파일은 tomcat폴더 바로 아래의 logs폴더에 점점 쌓이게 된다.

 

그렇지만, 경우에 따라서는 이런 기본 경로(위치)를 바꾸고 싶은 분들 있을 수 있다!

 

내 경우에는 드랍박스에 톰캣을 설치했기 때문에 war와 log파일로 인한 잦은 동기화를 방지하고 싶었다.

 

방법은 간단하다.

 

tomcat폴더 바로 아래의 conf폴더안의 파일들을 수정하면 된다.

 

 

 

 

///// webapps폴더 경로(위치) 변경하기

1. conf/sever.xml을 수정한다

 

- 기본 설정:

<Host name="localhost"  appBase="webapps"

            unpackWARs="true" autoDeploy="true">

 

- 경로 변경 후: 

<Host name="localhost"  appBase="D:/dev/tomcat_webapps"

            unpackWARs="true" autoDeploy="true">

* 아쉬운 점이 있다면, 절대 경로만 되는 것 같다.

 

 

- 추가 설정: (뭔지 모르겠지만 이것도 추가하기)

<Host name="localhost"  appBase="D:/dev/tomcat_webapps"

            unpackWARs="true" autoDeploy="true"

   xmlValidation="false"  xmlNamespaceAware="false">

 

 

 

///// logs폴더 경로(위치) 변경하기

1. conf/sever.xml을 수정한다

 

- 기본 설정:

<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"

                   prefix="localhost_access_log." suffix=".txt"

                   pattern="%h %l %u %t &quot;%r&quot; %s %b" />

- 경로 변경후:

<Valve className="org.apache.catalina.valves.AccessLogValve" directory="D:/dev/tomcat_logs"

                   prefix="localhost_access_log." suffix=".txt"

                   pattern="%h %l %u %t &quot;%r&quot; %s %b" />

* 아쉬운 점이 있다면, 절대 경로만 되는 것 같다.

 

2. bin/catalina.sh를 수정한다

- 기본 설정:

if [ -z "$CATALINA_OUT" ] ; then

  CATALINA_OUT="$CATALINA_BASE"/logs/catalina.out

fi

 

- 경로 변경 후:

if [ -z "$CATALINA_OUT" ] ; then

  CATALINA_OUT=E:/dev/logs/catalina.out

fi

 

3. conf/logging.properties를 수정한다

- 기본 설정:

1catalina.org.apache.juli.FileHandler.directory = ${catalina.base}/logs

...

2localhost.org.apache.juli.FileHandler.directory = ${catalina.base}/logs

...

3manager.org.apache.juli.FileHandler.directory = ${catalina.base}/logs

...

4host-manager.org.apache.juli.FileHandler.directory = ${catalina.base}/logs

 

- 경로 변경 후:

1catalina.org.apache.juli.FileHandler.directory = E:/dev/tomcat_logs

...

2localhost.org.apache.juli.FileHandler.directory = E:/dev/tomcat_logs

...

3manager.org.apache.juli.FileHandler.directory = E:/dev/tomcat_logs

...

4host-manager.org.apache.juli.FileHandler.directory = E:/dev/tomcat_logs

 

 

 

///// 참고

Tomcat의 webapps 디렉토리 경로 변경하기: http://itpaper.co.kr/index.php?mid=java&document_srl=2776&ckattempt=1

Tomcat에서의 로그위치 변경하기: http://blog.naver.com/xers1/140166771033

AND

톰캣에 두개의 포트를 올리고 각 포트마다 ROOT를 다르게 하여 매핑하여 두개의 도메인을 올리는게 가능하다 다음은 해당 설정값이다.

두개의 서비스가 올라감

AND


The bug seems ot be in the JSSE package
I could solve it by changing the method JSSE14Support.handshake() from:

   protected void handShake() throws IOException {
        if( ssl.getWantClientAuth() ) {
            logger.debug("No client cert sent for want");
        } else {
            ssl.setNeedClientAuth(true);
        }
        synchronousHandshake(ssl);
    }

to:

    protected void handShake() throws IOException {
        if( ssl.getNeedClientAuth() ) {
            logger.debug("No client cert sent for want");
        } else {
            ssl.setWantClientAuth(true);
        }
        synchronousHandshake(ssl);
    }

This way in the above scenario wantClientAuth is set to true. So the SSLSocket
would also accept connection without client certificates, but the
SSLAuthenticator will then display an error page.
Comment 3 Armin H 2007-01-30 04:09:42 EST
Created an attachment (id=19483) [details]
added a patch with the proposed change in
http://issues.apache.org/bugzilla/show_bug.cgi?id=41337#c2
Comment 4 Armin H 2007-01-30 04:12:01 EST
Does this patch introduce a logical change for applications and therefore need
an RFE?
Comment 5 Julius Davies 2007-01-30 08:08:45 EST
Hi,

The only way to present a useful error page is to establish a socket.  JSSE
won't let the socket happen if there's a problem with a client cert.  In my mind
the only way to provide a useful error page would be to for Tomcat to only ever
use "setWantClientAuth" (which isn't even available pre Java 1.4 !), and to draw
an HTML error page for all requests if "need=true" is set in Tomcat's own config.

It's nicer to just leave all this stuff up to JSSE and not worry about it.  By
circumventing JSSE's "no socket for you" security, Tomcat risks making itself
insecure, even though a helpful error page would be *really* handy!

Workaround:  set your own SSL config in Tomcat to "WANT" instead of "NEED" (in
server.xml) and setup your own ServletFilter on "/*" that draws a nice error
page if no client cert is provided.

<Connector 
           port="8443" minProcessors="5" maxProcessors="75"
           enableLookups="true" disableUploadTimeout="true"
           acceptCount="100" debug="0" scheme="https" secure="true";
           sslProtocol="TLS"

clientAuth="want" <- 요렇게 하면 해결됨
/>
AND


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

Tomcat 5에 대해서 좀더 많은 정보를 보기 위해서는 Tomcat 5 Upgrade를 보라.

Tomcat 5.5의 로깅에 대한 문서는 Tomcat 5.5 Logging 에서 볼수 있다.

만약 당신이 위 지시사항으로 수행할수 없다면, tomcat내 두었던 파일들을 삭제하고 Tomcat을 commons로깅을 사용하도록 되돌릴것이다

AND