日志 中文乱码、nacos 中文乱码、saltstack 中文乱码、docker中文乱码
大家好,我是烤鴨:
? 今天分享一個 saltstack 中文亂碼 的問題。
問題說明
由于項目之前沒有接入公司的發布系統,今天接入之后發現日志亂碼,不僅如此,從nacos獲取到的中文參數也是亂碼。于是猜想是發布系統遺留了一個bug。如下圖。
發布系統使用的是 saltstack,網上查了下,saltstack 導致的中文亂碼,下文說的是2015.8 之后的版本修復了,而我們這的版本是2019.2.5。
https://blog.csdn.net/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了,很難查,而且測試驗收通過了?)
坑無處不在,希望天下無坑。
總結
以上是生活随笔為你收集整理的日志 中文乱码、nacos 中文乱码、saltstack 中文乱码、docker中文乱码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hive日志位置(日志定位报错:Fail
- 下一篇: rpgmakermv导出html,Rpg