一、信息
IDEA:2019.1
Tomcat:9.0.24
二、問題描述
server中日志正常顯示,但Tomcat Catalina Log日志亂碼。
三、解決思路
既然出了亂碼,那肯定是編碼不統一,所以我將IDEA中設置編碼的地方(包括IDEA的配置文件)全都設置成了UTF-8,結果不但問題沒有解決,我的server和tomcat catalina log全部出現了亂碼。
https://www.cnblogs.com/aligege/p/10550432.html,翻到了這篇博客,博主思路很正確,不應當只修改IDEA中的編碼,還要修改Tomcat日志配置文件中的編碼,讓它們統一才行。
這里的默認值是GBKSS,修改成UTF-8,依舊亂碼。改為GBK后,server的日志正常了,tomcat catalina log還是亂碼。
應該是catalina的相關配置文件,網上查了好幾篇博客都說修改這個文件,於是乎按照教程走,加上了-Dfile.encoding=UTF8 -Dsun.jnu.encoding=UTF8
if [ -z "$LOGGING_MANAGER" ]; then LOGGING_MANAGER="-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Dfile.encoding=UTF8 -Dsun.jnu.encoding=UTF8" fi
依舊亂碼,這里修改的是logging_manager的值,那這一行代碼是什么意思呢?跳到catalina.sh文件的最上方,tomcat不愧是頂級開源項目,人家這注釋寫的可真是太香了。
# LOGGING_MANAGER (Optional) Override Tomcat's logging manager # Example (all one line) # LOGGING_MANAGER="-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager"
意思是覆蓋tomcat的日志管理器記錄,也就是說我們修改了日志管理器這里的編碼,但問題並未解決,這時我注意到這行注釋上方還有一段注釋。
# LOGGING_CONFIG (Optional) Override Tomcat's logging config file # Example (all one line) # LOGGING_CONFIG="-Djava.util.logging.config.file=$CATALINA_BASE/conf/logging.properties"
意思是覆蓋tomcat的日志配置文件,難道這里覆蓋掉了?跳到文件下方代碼。
# Set juli LogManager config file if it is present and an override has not been issued if [ -z "$LOGGING_CONFIG" ]; then if [ -r "$CATALINA_BASE"/conf/logging.properties ]; then LOGGING_CONFIG="-Djava.util.logging.config.file=$CATALINA_BASE/conf/logging.properties" else # Bugzilla 45585 LOGGING_CONFIG="-Dnop" fi fi
我們可以看到tomcat catalina log日志配置配置文件就是我們剛才修改過的logging.properties文件,仔細看了一下文件中的內容后,原來tomcat catalina log日志配置的代碼就是下面這幾行。
############################################################ # Handler specific properties. # Describes specific configuration info for Handlers. ############################################################ 1catalina.org.apache.juli.AsyncFileHandler.level = FINE 1catalina.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs 1catalina.org.apache.juli.AsyncFileHandler.prefix = catalina. 1catalina.org.apache.juli.AsyncFileHandler.maxDays = 90 1catalina.org.apache.juli.AsyncFileHandler.encoding = UTF-8 2localhost.org.apache.juli.AsyncFileHandler.level = FINE 2localhost.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs 2localhost.org.apache.juli.AsyncFileHandler.prefix = localhost. 2localhost.org.apache.juli.AsyncFileHandler.maxDays = 90 2localhost.org.apache.juli.AsyncFileHandler.encoding = UTF-8 3manager.org.apache.juli.AsyncFileHandler.level = FINE 3manager.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs 3manager.org.apache.juli.AsyncFileHandler.prefix = manager. 3manager.org.apache.juli.AsyncFileHandler.maxDays = 90 3manager.org.apache.juli.AsyncFileHandler.encoding = UTF-8 4host-manager.org.apache.juli.AsyncFileHandler.level = FINE 4host-manager.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs 4host-manager.org.apache.juli.AsyncFileHandler.prefix = host-manager. 4host-manager.org.apache.juli.AsyncFileHandler.maxDays = 90 4host-manager.org.apache.juli.AsyncFileHandler.encoding = UTF-8
試着將這幾行代碼中的UTF-8全部改為GBK后,問題圓滿解決。
四、遺留問題
之所以會出現亂碼,肯定是編碼格式不統一導致的。我們將tomcat的logging.properties配置文件中的編碼格式都設置成了GBK,IDEA中能找到的設置編碼的地方我都設置成了UTF-8,問題居然得到了解決。
五、猜想
IDEA中output輸出的內容編碼是GBK格式的,所以我們將tomcat輸出的日志編碼改為GBK后問題解決。但我確實沒找到IDEA中關於output輸出內容的編碼設置。