本文已参与「新人创作礼」活动, 一起开启掘金创作之路。
线上某次服务器器重启后,导致jar包启动的日志乱码,添加
-Dfile.encoding=utf-8
后日志输出正常,但是存在
new File
取不到中文路径的情况。
file.exists()
返回
false
;
解决日志乱码问题
启动脚本中
java -jar
命令添加
-Dfile.encoding = utf-8
解决日志乱码的问题,但是中文路径依旧取不到文件,应该不是该问题导致。判断还是系统层面编码问题。
linux系统编码排查
查看linux系统的编码是UTF8编码,文件的编码也是utf-8的编码
echo $LANG
查看文件的编码格式采用第三方工具:文件格式也是UTF-8且正常展示,则说明不是文件编码问题
convmv
看到别的博客上需要修改vi /etc/sysconfig/i18n
文件,改为LANG="zh_CN.UTF-8"
,但是我的线上服务器是CentOS7.x
版本的,没有找到这个文件,后来发现centos7.x
版本的文件在/etc/locale.conf
这个文件中;其中的编码也是UTF8
后续按照网上的思路修改系统配置文件 /etc/profile
添加字符集编码后也不生效。考虑是否代码问题(可能性很低,因为重启linux
后jar
包并没有重新替换还是原来的jar包)
java路径要转编码
尝试通过代码方式对文件路径进行编码,使用和系统统一的UTF-8方式
String path = URLDecoder.decode(fileAbsolutePath, "UTF-8");
File file = new File(path);
问题依旧没有解决,还是无法取到文件路径。
jar包编码问题
通过命令jinfo 进程号
查看java进程的详细信息,发现jar进程的编码有问题,用的是ANSI_X3.4-1968
。
发现问题的根本原因是jar包的编码方式不对导致,因为jar是通过systemctl
方式启动,查看查看服务启动工具对环境变量的使用grep env /sbin/service
将LANG="$LANG"
配置在env -i
后面,最后的结果如下所示,操作过程:
编辑service文件 vim /sbin/service
在env -i
后面加上 LANG="$LANG"
。
添加后 重启操作系统(reboot
)
重新运行服务即可解决 日志文件乱码和中文路径取不到的问题