公司測試集群遷往騰訊雲,安裝完flume和kafka后使用api消費topic,在應用日志中打印出來的日志中文部分全部是???????,數據存儲寫入mysql數據庫后中文也是亂碼,針對這個問題進行調整修復:
1、kafka消費的格式問題
設置kafka序列化和反序列化格式
properties.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer"); properties.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
經測試和該配置無關【注:並不表示在使用kafka api時不用指定序列化格式】,應用日志中中文部分仍然時亂碼!
2、mysql數據庫默認編碼問題【因為在應用日志中也是亂碼,所以不太可能是這種情況】
查看mysql數據庫的編碼格式是否時中文或utf8
命令:show variables like 'character%'
結果:
紅色部分的值可以看出編碼格式沒有錯誤!
3、服務器本身的默認編碼格式問題
因為是新的雲服務器,所以才有了這個猜想,在網上也看到了相關帖子
通過命令查看服務器的編碼設置:locale
可以看出都是英文的utf-8,所以打算調整該設置,但沒找到直接修改這個設置的方法或命令,只有通過修改 /etc/profile文件進行調整【root用戶】
vim vim /etc/profile
在文件最后添加 :export LANG="zh_CN.UTF-8"
保存退出后執行命令:source /etc/profile 使配置生效,在運行服務后亂碼現象不見了
還有一種方式修改,但只是臨時的,當關閉會話后還是會出現亂碼,所以不建議:
直接執行:export LANG="zh_CN.UTF-8"
export LC_ALL="zh_CN.UTF-8"
另外在網上查找時遇到一篇帖子是關於locale命令及設置的:https://www.cnblogs.com/regit/p/7837814.html
在排查時我使用命令行kafka producter 產生消息,並使用consumer查看發現都沒有出現亂碼的現象,所以就有了服務器編碼格式非中文的猜測,測試並打印出來編碼格式
println(Charset.defaultCharset())
結果在本地和服務器上的結果是不一樣的
本地:
服務器: