项目上生产环境时出现一个问题,生成的日志文件存在乱码,服务器编码为 LANG=zh_US.UTF-8,按理说中文不会存在乱码,这里存在一个问题,就是在SIT等其他环境我们使用的连接工具为Xshell,但生产环境是通过4A平台提供的SecureCRT工具进行连接,SecureCRT工具的编码默认不是UTF-8,并且无法永久修改为UTF-8,所以每次登录上远程连接首先要修改SecureCRT工具的编码,修改完编码为UTF-8之后再执行启动脚本,生成日志依旧存在乱码。判断原因应该是编码字符集与解码字符集不一致,采用脚本里面强制编码的方式。
原先脚本中配置的JVM参数:
JVM_OPTS="$JAVA_OPTS -Denv=pro -Dpro_meta=$APOLLO_ADDR -Dname=$APP_NAME -Dlogging.path=$LOBGACK_PATH -Xms3072M -Xmx3072M"
在JVM参数中增加编码配置之后,JVM参数如下:
JVM_OPTS="$JAVA_OPTS -Denv=pro -Dpro_meta=$APOLLO_ADDR -Dname=$APP_NAME -Dlogging.path=$LOBGACK_PATH -Xms3072M -Xmx3072M -Dfile.encoding=utf-8 -Dsun.jnu.encoding=utf-8"
配置完重启生效。
文件编码和解码字符集解释
计算机中储存的信息都是用二进制数表示的;而我们在屏幕上看到的英文、汉字等字符是二进制数转换之后的结果。通俗的说,按照何种规则将字符存储在计算机中,如'a'用什么表示,称为"编码";
反之,将存储在计算机中的二进制数解析显示出来,称为"解码",如同密码学中的加密和解密。在解码过程中,如果使用了错误的解码规则,则导致'a'解析成'b'或者乱码。
日志文件的解码字符集,可通过下载日志文件到本地,然后通过notepad打开查看。
日志文件的编码字符集。可通过下面的Java代码获取Java虚拟机使用的字符集。
String charsetName = Charset.defaultCharset().name();
通过比对解码和编码字符集,查看是否一致。