Tomcat日志乱码问题处理指南
Tomcat日志乱码的根本原因是字符编码不一致(如Tomcat默认的ISO-8859-1与应用程序/系统使用的UTF-8冲突),需通过调整配置文件、环境变量及IDE设置等多维度解决。以下是具体解决方法:
Tomcat的日志输出由conf/logging.properties控制,需确保控制台(ConsoleHandler)和文件(FileHandler)的编码设置为UTF-8(若系统默认编码为GBK,可暂时改为GBK测试)。
conf/logging.properties,找到以下两行(通常位于文件中下部):java.util.logging.ConsoleHandler.encoding = UTF-8java.util.logging.FileHandler.encoding = UTF-8#),去掉注释并保存。通过JVM参数强制指定Tomcat运行时的文件编码为UTF-8,覆盖默认设置:
bin/catalina.sh,在文件开头(如第21行左右)添加:export JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=UTF-8"bin/catalina.bat,在文件开头(如第216行左右)添加:set JAVA_OPTS=%JAVA_OPTS% -Dfile.encoding=UTF-8确保Tomcat能正确解析HTTP请求中的参数(如GET请求的URL参数),避免因编码不一致导致日志乱码:
conf/server.xml,找到<Connector>标签(通常端口为8080),添加URIEncoding="UTF-8"属性:<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
URIEncoding="UTF-8" />
操作系统的默认编码需与Tomcat配置一致(推荐UTF-8):
echo $LANG,若结果不是UTF-8(如zh_CN.GBK),可临时修改为UTF-8:export LANG=en_US.UTF-8(永久生效需修改/etc/profile或~/.bashrc)。若使用IntelliJ IDEA或Eclipse运行Tomcat,需确保IDE的控制台及项目编码为UTF-8:
File→Settings→Editor→File Encodings;UTF-8;Window→Preferences→General→Workspace;UTF-8。若应用程序自身输出日志时未指定编码,需调整代码或配置:
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.logging.Logger;
public class LogWriter {
private static final Logger logger = Logger.getLogger(LogWriter.class.getName());
public static void main(String[] args) {
try (PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out, "UTF-8"))) {
out.println("这是一条测试日志");
} catch (Exception e) {
e.printStackTrace();
}
}
}
application.properties中添加:spring.http.encoding.charset=UTF-8spring.http.encoding.enabled=truespring.http.encoding.force=true。通过SetCharacterEncodingFilter强制统一请求和响应的编码(适用于Web应用):
web.xml中添加以下配置:<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.apache.catalina.filters.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>ignore</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>