终端运行Spring应用日志出现乱码问题求助
问题现象
本地运行Java Spring Boot应用时,通过IntelliJ的Run标签运行(Java 16)日志显示正常:
. ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v2.3.12.RELEASE) 2023-01-10 18:08:15.863 INFO 82231 --- [ main] c.v.c.s.SaasControllerApplication : Starting SaasControllerApplication on patelhiXMD6M.vmware.com with PID 82231 (/Users/user/workspace/saas-infra/saas-controller/target/classes started by user in /Users/user/workspace/saas-infra) 2023-01-10 18:08:15.876 INFO 82231 --- [ main] c.v.c.s.SaasControllerApplication : No active profile set, falling back to default profiles: default 2023-01-10 18:08:16.536 INFO 82231 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode. 2023-01-10 18:08:16.659 INFO 82231 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 119ms. Found 8 JPA repository interfaces.
但在终端运行时日志出现乱码:
. ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v0.001-SNAPSHOT) %.S.S.S.S.RepositoryConfigurationDelegatelr %.%.%.%.%.RepositoryConfigurationDelegatelr %.%.%.%.%.RepositoryConfigurationDelegatelr -.-.-.-.-.RepositoryConfigurationDelegatelr [.s5.d5.r5.c5.RepositoryConfigurationDelegatelr %.spri0.}.}.}.RepositoryConfigurationDelegatelr :.:.:.:.:.RepositoryConfigurationDelegatelr Bootstrapping Spring Data JPA repositories in DEFAULT mode. []wEx%.S.S.S.S.RepositoryConfigurationDelegatelr %.%.%.%.%.RepositoryConfigurationDelegatelr %.%.%.%.%.RepositoryConfigurationDelegatelr -.-.-.-.-.RepositoryConfigurationDelegatelr [.s5.d5.r5.c5.RepositoryConfigurationDelegatelr %.spri0.}.}.}.RepositoryConfigurationDelegatelr :.:.:.:.:.RepositoryConfigurationDelegatelr Finished Spring Data repository scanning in 145ms. Found 8 JPA repository interfaces. []wEx%.S.S.S.StandardServicelr %.%.%.%.StandardServicelr %.%.%.%.StandardServicelr -.-.-.-.StandardServicelr [.a5.c5.c5.StandardServicelr %.apac0.}.}.StandardServicelr :.:.:.:.StandardServicelr Starting service [Tomcat] []wEx%.S.S.S.StandardEnginelr %.%.%.%.StandardEnginelr %.%.%.%.StandardEnginelr -.-.-.-.StandardEnginelr [.a5.c5.c5.StandardEnginelr %.apac0.}.}.StandardEnginelr :.:.:.:.StandardEnginelr Starting Servlet engine: [Apache Tomcat/9.0.46] []wEx%.S.S.S.S.S.S.[/]lr %.%.%.%.%.%.%.[/]lr %.%.%.%.%.%.%.[/]lr -.-.-.-.-.-.-.[/]lr [.a5.c5.c5.C5.[5.[5.[/]lr %.apac0.}.}.}.}.}.[/]lr :.:.:.:.:.:.:.[/]lr Initializing Spring embedded WebApplicationContext []wEx%.S.S.HikariDataSourcelr %.%.%.HikariDataSourcelr %.%.%.HikariDataSourcelr -.-.-.HikariDataSourcelr [.z5.h5.HikariDataSourcelr %.zaxx0.}.HikariDataSourcelr :.:.:.HikariDataSourcelr HikariPool-1 - Starting...
两次运行使用相同的pom文件和配置文件。
可能原因及解决方法
1. 终端编码与应用输出编码不匹配
IntelliJ会自动适配应用输出编码为UTF-8,而终端可能使用了其他编码(如GBK),导致日志显示乱码。
macOS/Linux终端:
输入命令查看当前编码:echo $LANG确保输出为
zh_CN.UTF-8或en_US.UTF-8。如果不是,修改终端偏好设置中的编码为UTF-8,或者在终端配置文件(如~/.bashrc、~/.zshrc)中添加:export LANG=en_US.UTF-8 export LC_ALL=en_US.UTF-8保存后执行
source ~/.zshrc(对应你的shell类型)生效。Windows终端:
输入命令查看当前编码:chcp如果输出不是
65001(UTF-8),执行以下命令切换:chcp 65001也可以通过终端属性设置默认编码为UTF-8。
2. Maven运行时未指定编码相关JVM参数
IntelliJ运行Spring Boot应用时,会自动添加-Dfile.encoding=UTF-8参数,而终端用Maven运行时可能缺少该参数,导致输出编码异常。
临时解决:运行应用时手动指定参数:
mvn spring-boot:run -Dfile.encoding=UTF-8永久解决:在pom.xml中配置
spring-boot-maven-plugin,添加默认JVM参数:<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <jvmArguments>-Dfile.encoding=UTF-8</jvmArguments> </configuration> </plugin> </plugins> </build>保存后,直接执行
mvn spring-boot:run即可生效。
3. 日志框架编码配置问题
如果使用Logback作为日志框架,需要确保输出编码设置为UTF-8,避免终端显示乱码。
在logback.xml或logback-spring.xml中,给每个appender的encoder添加charset配置:
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <charset>UTF-8</charset> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger{36} - %msg%n</pattern> </encoder> </appender>
内容的提问来源于stack exchange,提问作者Himanshu Patel

