Translate

2020년 2월 9일 일요일

[Tomcat] Windows에서 로그 한글깨짐 원인과 해결 방법




테스트 환경
OS: Windows 10
비고: (Eclipse/IntelliJ) IDE를 사용하지 않고 톰캣을 자체적으로 구동한 상황





[ 증상 ]

 - 증상은 아래와 같이 두가지 종류가 있다. 환경에 따라 두개 모두 가지고 있을 수 있다.


1. 톰캣에서 자체적으로 남기는 로그의 한글이 깨짐
1004lucifer



2. 프로그램에서 남기는 로그의 한글이 깨짐
  (Windows10 환경에서 이클립스와 같은 IDE가 아닌 단독 톰캣의 경우에는 증상을 재현하지 못했다. 아래는 jsp에 pageEncoding을 지정하지 않았을경우..)







[ 원인 및 해결방법 ]


1. 톰캣에서 자체적으로 남기는 로그의 한글이 깨짐

* 좀 더 정확한 증상은 옛날 버전의 톰캣은 한글이 깨지지 않고 최신버전의 톰캣만 한글이 깨진다.


원인

* Windows10의 콘솔 인코딩과 톰캣에서 남기는 로그의 인코딩이 달라 문제가 발생함


  1) 톰캣 버전별 변경사항 확인
    - Tomcat7 기준 v7.0.92에서 '{_TOMCAT_HOME_}/conf/logging.properties' 설정파일에 인코딩 관련 설정이 추가되었다. (default:UTF-8)
   (https://tomcat.apache.org/tomcat-7.0-doc/changelog.html)
1004lucifer

  2) Tomcat의 logging.properties 파일에 인코딩 설정 추가된 버전 (버전별 ChangeLog확인)
    - Tomcat7:   v7.0.92 이상
    - Tomcat8.5: v8.5.36 이상
    - Tomcat9:   v9.0.14 이상
    - 톰캣 버전 v8.5.35 와 같이 위에 명시한 것보다 이전 버전이라면 해당 증상이 발생하지 않는다.
    - 그래서 톰캣 버전에 따라서 아무런 설정을 하지도 한글이 깨지는 사람이 있고 안깨지는 사람이 발생할수 있다.


  3) Windows10의 콘솔 인코딩 한국어 설정 확인
    - chcp 명령어 확인

    - 콘솔 속성 확인





해결방법

* Tomcat의 logging.properties 파일에 인코딩설정이 있는 톰캣을 사용하는 경우


  1) 톰캣의 마이너 버전을 다운그레이드 한다.
    - 위에서 설명했듯이 특정버전 이상에서만 증상이 발생하며 아래와 같이 해당 버전 이하로 구동 시 별다른 설정 없이 톰캣로그가 한글깨짐 없이 정상적으로 보여진다.
    - Tomcat7:   v7.0.91 이하
    - Tomcat8.5: v8.5.35 이하
    - Tomcat9:   v9.0.13 이하



  2) logging.properties 파일의 인코딩 설정을 UTF-8 => EUC-KR 로 변경해 준다.
1004lucifer

1catalina.org.apache.juli.FileHandler.level = FINE
1catalina.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
1catalina.org.apache.juli.FileHandler.prefix = catalina.
1catalina.org.apache.juli.AsyncFileHandler.encoding = EUC-KR

2localhost.org.apache.juli.FileHandler.level = FINE
2localhost.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
2localhost.org.apache.juli.FileHandler.prefix = localhost.
2localhost.org.apache.juli.AsyncFileHandler.encoding = EUC-KR

3manager.org.apache.juli.FileHandler.level = FINE
3manager.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
3manager.org.apache.juli.FileHandler.prefix = manager.
3manager.org.apache.juli.AsyncFileHandler.encoding = EUC-KR

4host-manager.org.apache.juli.FileHandler.level = FINE
4host-manager.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
4host-manager.org.apache.juli.FileHandler.prefix = host-manager.
4host-manager.org.apache.juli.AsyncFileHandler.encoding = EUC-KR

java.util.logging.ConsoleHandler.level = FINE
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
java.util.logging.ConsoleHandler.encoding = EUC-KR




  3) Windows 10 콘솔 기본 인코딩 설정을 변경해준다. (레지스트리를 변경하며 권장하지 않음)
    - 윈도우키+R: regedit 입력하여 레지스트리편집기 실행
    - 컴퓨터\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage 밑으로 스크롤해 OEMCP를 클릭하고, 값을 65001로 변경






2. 프로그램에서 남기는 로그의 한글이 깨짐

Windows10 에서 IDE 없이 단톡톰캣으로 증상 재현불가







PS. 후기

다른 블로그에 나와있지 않은 logging.properties 설정파일 방법을 알아낸건 우연히 같은 프로그램소스를 같은 Tomcat7 로 구동 시 한글이 깨지거나 깨지지 않는 증상을 발견한 것이 시발점이 되어 알아보게 되었다.
같은 Tomcat7 이었지만 마이너버전만 달랐다. 그래서 톰캣 마이너버전을 종류별로 받아서 테스트를 진행했었고 특정 버전 이상에서만 한글이 깨지는 것을 확인했었다.
ChangeLog 를 확인하고 나서야 왜 이런 증상이 발생을 했었고..

다른 블로그를 봤을 때 예전에는 -Dfile.encoding=UTF-8 밖에 없었는데 비교적 최근에 작성된 글에서는 레지스트리를 변경하라는 이야기가 나오는지 이해가 갔다.

그리고 startup.bat 파일을 수정하는 방법으로도 접근해 봤는데 'chcp 65001' 설정 후 catalina.bat 에 넘겨주는 인자를 start에서 run 으로 변경 시 톰캣 한글은 정상적으로 나오지만 프로그램 로그(System.out.print)가 콘솔에 찍히지 않아 위에 기술하지 못했다.
추후 원인을 알게되면 위에 세번째 방법으로 추가를 하려 한다.





참고
 - https://meyouus.tistory.com/12


댓글 2개 :