近日在aix上用log4j打印日志,出现乱码,经过努力解决问题。
症状:在默认语言非中文(或者说默认语言不支持中文的)的windows、linux、unix上,用log4j打印日志,出现乱码,常见的就是一堆问号。
解决方法:
如果是log4j.properties为配置文件,比如:
log4j.appender.a1=org.apache.log4j.rollingfileappender
log4j.appender.a1.file=all.log
加入一行:
log4j.appender.a1.encoding=utf-8
如果是log4j.xml为配置文件,比如:
<appender name="a1" class="org.apache.log4j.rollingfileappender">
<param name="file" value="all.log" />
......
</appender>
<param name="encoding" value="utf-8" />
原理:
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)设置字符集。