日志 中文乱码、nacos 中文乱码、saltstack 中文乱码、docker中文乱码

本文探讨了在使用SaltStack过程中遇到的中文乱码问题,分析了问题的原因,并提出了两种解决方案:一是修改应用程序编码;二是调整SaltStack配置。

大家好,我是烤鸭:

​ 今天分享一个 saltstack 中文乱码 的问题。

问题说明

由于项目之前没有接入公司的发布系统,今天接入之后发现日志乱码,不仅如此,从nacos获取到的中文参数也是乱码。于是猜想是发布系统遗留了一个bug。如下图。
在这里插入图片描述
发布系统使用的是 saltstack,网上查了下,saltstack 导致的中文乱码,下文说的是2015.8 之后的版本修复了,而我们这的版本是2019.2.5。

https://blog.youkuaiyun.com/hnhuangyiyang/article/details/50421738

即便如此我们还是去看一下现在的源码。找到salt依赖的 cmd脚本。

more /usr/lib/python2.7/site-packages/salt/modules/cmdmod.py

在这里插入图片描述
关于上边参数的说明,可以看一下 https://www.iteye.com/blog/yintech-397380,这里重点看一下 LANGUAGE。

locale的设定:
LC_ALL和LANG优先级的关系:LC_ALL > LC_* >LANG
1、如果需要一个纯中文的系统的话,设定LC_ALL= zh_CN.XXXX,或者LANG=zh_CN.XXXX都可以。
2、如果只想要一个可以输入中文的环境,而保持菜单、标题,系统信息等等为英文界面,那么只需要设定 LC_CTYPE=zh_CN.XXXX,LANG=en_US.XXXX就可以了。
3、假如什么也不做的话,也就是LC_ALL,LANG和LC_*均不指定特定值的话,系统将采用POSIX作为lcoale,也就是C locale。

LANG和LANGUAGE的区别:
LANG - Specifies the default locale for all unset locale variables
LANGUAGE - Most programs use this for the language of its interface
LANGUAGE是设置应用程序的界面语言。而LANG是优先级很低的一个变量,它指定所有与locale有关的变量的默认值。

可以看到启动应用程序没有设置 lc_all ,会按照 language处理,而这里language设置的C。

C 是啥编码呢。看下这篇http://www.gnu.org/software/libc/manual/html_node/Standard-Locales.html#Standard-Locales,也就是 ISO 编码。

编码乱了,为什么会导致nacos和日志乱码,new String的时候不指定编码格式,会按照当前环境变量的编码格式创建,所以乱码了。

其实docker也是一样的,可以参考解决方案的第一个。

解决方案

  • 修改应用程序编码,比如我们是java应用,在启动脚本中增加 -Dfile.encoding=utf-8

  • 修改 saltstack ,因为salt实际调用用的是SLS,需要把env参数找位置加进去,如下图
    在这里插入图片描述

  • 当然也可以修改 上边说到的 cmdmod.py

总结:

问题出现还是有一定影响的,总结下发布系统使用挺久的了,出现这个问题没人反馈过(没人想到是发布系统的问题),要不自己改脚本,要不想别的办法处理(new String的时候,指定编码格式)。

这种问题最好还是由上游处理,解决方案的1、3都不太友好。

还有就是测试和生产环境并不一致,发布系统只在生产环境使用(如果发布系统出bug了,很难查,而且测试验收通过了?)

坑无处不在,希望天下无坑。

### 解决 Tomcat 读取 Nacos 配置文件时出现的乱码问题 对于Tomcat读取Nacos配置文件时遇到的乱码问题,解决方案涉及多个方面。确保所有组件均采用统一的UTF-8编码标准是解决问题的关键。 #### 修改 Nacos-Spring 文本处理库版本 升级`nacos-spring-context`依赖到至少1.1.0版本能够有效改善字符集兼容性问题。在这个更新后的版本里,默认属性解析器中的字符流已更改为基于`StandardCharsets.UTF_8`初始化[^2]。 ```xml <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>nacos-spring-boot-starter</artifactId> <version>1.1.0</version> </dependency> ``` #### 调整 Tomcat 日志记录设置 为了防止日志输出过程中引入额外的编码转换错误,在Tomcat安装目录下的`conf/logging.properties`文件中指定合适的编码方式: ```properties java.util.logging.ConsoleHandler.encoding=UTF-8 org.apache.juli.FileHandler.encoding=UTF-8 ``` 此更改有助于保持控制台和文件日志的一致性和准确性[^1]。 #### IDEA 开发环境配置调整 当使用IntelliJ IDEA作为开发工具时,还需同步调整IDE内部的各项编码参数以匹配外部服务端设定。具体措施包括但不限于全局编码、项目级编码以及运行时虚拟机选项等多处位置确认为UTF-8编码格式。 #### Docker 容器内语言环境变量优化 如果应用程序部署于Docker容器之中,则应考虑适当配置容器内的区域设置(Locale),使之支持并默认启用UTF-8编码方案。通过编辑或创建`.bashrc`, `.profile`或其他启动脚本来预设这些环境变量可达成目的[^3]。 ```shell export LANG=en_US.UTF-8 export LANGUAGE=en_US:en export LC_ALL=en_US.UTF-8 ``` 以上方法综合运用后通常能较好地解决由不同环节引起的中文及其他非ASCII字符显示异常现象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

烤鸭的世界我们不懂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值