網上很多解決方案,有說該server.xml的,有說該log4j.properties的
不過我按這些改了都沒生效。不過我也確實是改了上面的兩個文件,至於對修改成功的結果有沒有起到作用我也不知道,所以大家如果按我這個方法沒用的話再試試其他的吧
排查可能性
一、日誌亂碼,修改catalina.sh
- 在Tomcat的/bin目錄下,打開
catalina.sh
- 在沒啓用insert模式下,鍵入
/$LOGGING_MANAGER
,按n
鍵查找下一條,直到找到下面的代碼:
if [ -z "$LOGGING_MANAGER" ]; then
JAVA_OPTS="$JAVA_OPTS -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager "
else
JAVA_OPTS="$JAVA_OPTS $LOGGING_MANAGER"
fi
- 註釋掉,修改爲
if [ -z "$LOGGING_MANAGER" ]; then
JAVA_OPTS="$JAVA_OPTS -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Dfile.encoding=UTF8 -Dsun.jnu.encoding=UTF8"
else
JAVA_OPTS="$JAVA_OPTS $LOGGING_MANAGER -Dfile.encoding=UTF8 -Dsun.jnu.encoding=UTF8"
fi
重啓tomcat
二、顯示頁面亂碼,修改server.xml
這個是針對展示頁面亂碼問題
加上URIEncoding
<Connector port="8081" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="UTF-8"/>
三、日誌亂碼,http調用的亂碼
還有一種可能,就是tomcat部分日誌出現中文亂碼,而且這部分日誌都是打印的調用http請求後返回的值,這個時候很可能是代碼方面的原因
強烈建議response加上響應頭,響應方返回Response的時候:
response.setContentType("application/json;charset=utf-8");
糾結我兩天的日誌亂碼問題,原因就是這個,重點就是這個charset
這是響應方需要做的事,請求方拿到了相應後,也要注意這個問題,比如使用HttpClient,解析返回的Response
CloseableHttpResponse response = httpclient.execute(httpget);
HttpEntity entity = response.getEntity();
String result = EntityUtils.toString(entity, StandardCharsets.UTF_8);
Spring中使用RestTemplate的話,高版本應該沒這個問題,至少我沒遇到過。
@Bean
public MappingJackson2HttpMessageConverter getMappingJackson2HttpMessageConverter() {
MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
//設置日期格式
ObjectMapper objectMapper = new ObjectMapper();
SimpleDateFormat smt = new SimpleDateFormat("yyyy-MM-dd");
objectMapper.setDateFormat(smt);
mappingJackson2HttpMessageConverter.setObjectMapper(objectMapper);
//設置中文編碼格式
List<MediaType> list = new ArrayList<MediaType>();
list.add(MediaType.APPLICATION_JSON_UTF8);
mappingJackson2HttpMessageConverter.setSupportedMediaTypes(list);
return mappingJackson2HttpMessageConverter;
}
四、日誌亂碼,logging.properties
找到
java.util.logging.ConsoleHandler.encoding = utf-8
這行
更改爲
java.util.logging.ConsoleHandler.encoding = GBK
或者反過來試試。
如果是tomcat9,把utf-8
的設置去掉或者設置爲GBK
查看系統編碼是否一致
其他
看看linux系統默認編碼和xshell是不是一致,設置utf-8編碼,就是上面工具欄的地球標誌