tomcat 로그 catalina.out 에서 무수히 발견된 로그들.


30-Sep-2019 09:49:42.578 SEVERE [http-nio-8080-exec-32] org.apache.coyote.http11.Http11Processor.service Error processing request

        java.lang.NullPointerException


org.apache.coyote.http11.Http11Processor 는 http 요청을 처리한다. 위 로그는 server.xml 에 정의된 defaulthostname 이 null 이기 때문에 발생한 예외이다. server.xml 에는 아래와 같은 설정이 기본적으로 되어 있다.


<Engine name="Catalina" defaultHost="localhost">

    <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"></Host>


Hostname 을 localhost 그대로 사용할 경우엔 예외가 발생하지 않는다. Hostname 을 변경하고 서버가 직접 요청 받는 경우도 발생하지 않는다. Hostname 을 변경하도나서 로드밸런스 등으로 전달되는 경우 특히 발생하는 것 같다. 예외 발생 빈도는 심하지 않고 시점은 불규칙해서 알 수 없다.


저 예외를 없애려면 Catalina 안에 <Host name="localhost"></Host> 를 한줄 추가하면 해결된다.




WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,

* catalina.out 로그


29-Sep-2019 15:12:51.096 INFO [http-nio-8080-exec-29] org.apache.coyote.http11.Http11Processor.service Error parsing HTTP request header

 Note: further occurrences of HTTP header parsing errors will be logged at DEBUG level.

        java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986

                at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:483)

                at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:684)

                at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)

                at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:808)

                at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1498)

                at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)

                at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)

                at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)

                at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)

                at java.lang.Thread.run(Thread.java:748)


Tomcat 8.0.39 버전부터 Query String 에 RFC 7230과 RFC 3986 문서에서 정의되지 않은 문자열을 포함할 경우(^`\|{}[] 같은 특수문자) 발생하는 400 오류(Bad Request) 이다. server.xml 에서 요청받는 Connector 태그에 relaxedQueryChars 속성을 추가하고 허용할 문자열을 정의하여 해결한다.


<Connector port="8080" protocol="HTTP/1.1" ... relaxedQueryChars="^`\|{}[]" />

<Connector port="8443" protocol="HTTP/1.1" ... relaxedQueryChars="^`\|{}[]" />




WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,

s3 업로드시 발생하는 로그.


Sep 30 03:29:32 ip-172-50-10-72 tomcat8: 2019-09-30 12:29:32.717  WARN 27104 --- [io-8443-exec-65] c.amazonaws.services.s3.AmazonS3Client   : No content length specified for stream data.  Stream contents will be buffered in memory and could result in out of memory errors.


s3 업로드시 setContentLength 를 지정하지 않거나 IOUtils.toByteArray(inputStream) 사용시 inputStream 이 소진되어 발생하는 경고이며 다음과 같이 수정이 필요하다.


byte[] bytes = IOUtils.toByteArray(inputStream);
objectMetadata.setContentLength(bytes.length);
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
 
PutObjectRequest putObjectRequest = new PutObjectRequest(bucket, key, byteArrayInputStream, objectMetadata);
client.putObject(putObjectRequest);
cs




WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,

Tomcat 도 서비스를 시작하면 열심히 로그를 만들어 용량이 점점 방대해 집니다.
기본적으로 {CATALINA_HOME}/conf 디렉토리의 logging.properties server.xml 파일 설정에 따라
{CATALINA_HOME}/logs 디렉토리에 .log .txt 식의 로그가 일자별로 쌓이므로 1주일 후에는 삭제를 할 것입니다.
그 외에 catalina.out 파일은 지속적으로 로그가 쌓여 특히 용량이 커지므로 logrotate 로 주기적인 백업을 할 것입니다.

 

 

1. 7일 지난 로그 삭제

 

# vi /usr/local/tomcat/logs/tomcat_log.sh ($CATALINA_HOME = /usr/local/tomcat)
#!/bin/sh
#delete files 7 days later
find /usr/local/tomcat/logs -mtime +5 -name '*.log' -exec rm -f {} \;
find /usr/local/tomcat/logs -mtime +5 -name '*.txt' -exec rm -f {} \;

 

 

2. 실행 권한 부여

 

# chmod u+x /usr/local/tomcat/logs/tomcat_log.sh

 

 

3. crontab 에 등록
- 스크립트 실행할 시간 지정

 

# vi /etc/crontab
0 5 * * * root /usr/local/tomcat/logs/tomcat_log.sh

 

 

4. catalina.out -> logrotate 등록
- 매일 7일동안 백업하도록 지정

 

# vi /etc/logrotate.d/tomcatd
/usr/local/tomcat/logs/catalina.out {
    copytruncate
    daily
    rotate 7
}

 

 

5. logrotate 테스트

 

# logrotate -f /etc/logrotate.d/tomcatd

 

# ls -al /usr/local/tomcat/logs/catalina.out*
-rw-r--r-- 1 root root              0 Jan  6 18:23 /usr/local/tomcat/logs/catalina.out
-rw-r--r-- 1 root root  123123123 Jan  6 18:23 /usr/local/tomcat/logs/catalina.out.1


WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,