寫在前面,第三篇文章中將原因解釋的最清楚,為什么設置為UTF-8或者GBK就生效了,原因是類文件的編碼和輸入日志的編碼必須一致,否則就會出現亂碼。
近日在AIX上用log4j打印日志,出現亂碼,經過努力解決問題。
症狀:在默認語言非中文(或者說默認語言不支持中文的)的Windows、Linux、Unix上,用log4j打印日志,出現亂碼,常見的就是一堆問號。
解決方法:
如果是log4j.properties為配置文件,比如:
log4j.appender.A1=org.apache.log4j.RollingFileAppender
log4j.appender.A1.File=all.log
加入一行:
log4j.appender.A1=org.apache.log4j.RollingFileAppender log4j.appender.A1.Encoding=UTF-8 log4j.appender.A1.File=all.log
如果是log4j.xml為配置文件,比如:
<appender name="A1" class="org.apache.log4j.RollingFileAppender"> <param name="File" value="all.log" /> ...... </appender>
加入一行:
<appender name="A1" class="org.apache.log4j.RollingFileAppender"> <param name="Encoding" value="UTF-8" /> <param name="File" value="all.log" /> ...... </appender>
原理:
log4j通過QuietWriter寫日志,QuietWriter extends FilterWriter,FilterWriter extends Writer,而Writer寫入的是字符流,對字符集比較敏感。英文系統一般默認latin-1字符集,只能處理半角,通過encoding指定字符集后,能夠正確輸出指定字符集的字符流。
字符集指定后,WriterAppender的setEncoding通過org.apache.log4j.config.PropertySetter.setProperties(Object obj, Properties properties, String prefix)設置字符集。
類文件編碼與輸出日志編碼不一致導致日志亂碼
一個小問題,卻讓我感覺到,現在真正動腦的人很少。。我來說說吧。
今天遇到一個小問題,log4j輸出到文件亂碼,控制台正常。顯然是編碼問題導致。Google一搜,幾乎一水的說:
項目中log4j在英文版linux下輸出中文日志為亂碼。由於log4j配置文件中沒有設置編碼格式(encoding),所以log4j就使用系統默認編碼。導致亂碼。解決方法是設置編碼格式UTF-8,方法為:
log4j.appender.syslog.encoding=UTF-8
這顯然是轉的,因為全網幾乎一樣。先不說這是properties配置的,還不是xml的。如果要xml的,配置如下:
<appender name="A1" class="org.apache.log4j.RollingFileAppender"> <param name="Encoding" value="UTF-8" /> <param name="File" value="all.log" /> ...... </appender>
但是,我是已經設置成UTF-8,而亂碼了。所以,上述答案是不嚴謹的。
先說說筆者的情況吧,其實筆者的問題很簡單,兩套log4j appender配置,一個輸出的文件,一個控制台,文件的配置了utf-8編碼,控制台沒配置。現象,控制台正常,文件亂碼。
把文件的改成gbk,不亂了。控制台改成gbk,亂碼。控制台改成utf-8,正常。到這里你可能糊塗了。怎么這么亂?
其實道理很簡單,亂碼,自然是編碼不匹配。什么匹配?log4j用utf-8輸入,你文件是不是utf-8編碼的呢?檢查一下,果然不是,改成utf-8編碼,解決。
你可能要問了,那控制台的匹配在哪里?Eclipse控制台也有是編碼的,而且,不僅僅是有,你還可以為每個執行的程序,設置獨立的編碼。

自然,這里的編碼匹配了,也就不會亂碼了。
