最近的开发过程中发生一件非常让人苦恼的事件: 在windows下的tomcat8+jdk1.8调试没问题, tomcat6+jdk1.6测试环境也没问题, 但分发到生产环境的linux(tomcat6+jdk1.6) , 使用不久用户反映输入的中文全部变乱码 !
可幸事先有做备份, 于是赶紧恢复备份,接下来写了一个小小的测试 test.jsp丢到linux环境下:
<%@page import="org.apache.commons.logging.LogFactory"%>
<%@page import="org.apache.commons.logging.Log"%>
<%
/* --------------------------------------------------------------------
Program: SAR920L1 -
Created: 22/Oct/2008 by csmiswfl
Modify: 26/DEC/2008 by dgmishxw
Modify: 05/Jan/2009 by csmiswfl
Modify: 14/Jan/2010 by dgmislfb
* -------------------------------------------------------------------- */
%>
<%@ include file="sardef.jsp" %>
<%@ include file="common/alco_lib.jsp" %>
<%@ include file="common/alco_header.jsp" %>
<script type="text/javascript" src="js/jq.js"></script>
<%
//*
// Database Access
Connection w_conn = null;
Statement w_stmt = null;
ResultSet w_rs = null;
String lvName="";
String pvStaffName=X01getParameter(c_para, "staffname");
if (pvStaffName==null){
pvStaffName="";
}
Log log = LogFactory.getLog("test");
log.info("input value:"+pvStaffName);
try
{
w_conn = X60getConnection();
w_stmt = w_conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
if (!pvStaffName.equals("")){
X62executeSQL(w_stmt,"update test set staffname='"+pvStaffName+"'");
}
w_rs=X61executeQuery(w_stmt, "select * from test limit 1");
w_rs.next();
lvName=w_rs.getString("staffname");
w_rs.close();
}finally
{ X63closeConn(w_conn, w_stmt, w_rs); }
//
%>
<div>
submit value:<%=pvStaffName %><br/>
database value: <%=lvName %>
</div>
<form action="./test.jsp" method="post">
<label>Update Name:</label>
<input name="staffname" value="<%=lvName%>"/>
<input type="submit" />
</form>
在新的web app下, 在test.jsp页面输入中文, input value是乱码的,各种排除后最终发现原来是log4j惹的祸!后来指定了log4j的日志输出encoding还是不行,无意中, 将日志级别改为INFO再试,OK了!刚开始以为手误,再改为DEBUG,乱码!改为INFO正常!!! 真是无比奇葩! 但在linux下的tomcat8+jdk1.8是完全没问题的, 这是log4j的bug还是tomcat6的bug ?!
贴出这份log4j的配置,兼容tomcat6的中文/log输出也是中文,项目的编码是utf-8。
### logger的配置 ###
#配置根logger
log4j.rootLogger=INFO,stdout,RollingAppender
#配置子logger:org.lavasoft(在org.lavasoft包中类的日志在没有指定子logger名的情况下使用这个logger)
#log4j.logger.org.lavasoft=ERROR,file
#配置子logger:org.lavasoft.test(在org.lavasoft.test包中类的日志在没有指定子logger名的情况下使用这个logger)
#log4j.logger.org.lavasoft.test=ERROR,file1,stdout
log4j.appender.syslog.encoding=UTF-8
log4j.appender.logfile.encoding=UTF-8
### direct log messages to stdout ### (标准的终端输出)
#控制台输出
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
#自定义输出布局
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
#输出的格式
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
### direct messages to file ttt.log ### (输入到文件ttt.log的配置)
#输出到滚动文件
log4j.appender.RollingAppender=org.apache.log4j.DailyRollingFileAppender
#输出文件最大为10M
log4j.appender.RollingAppender.MaxFileSize=2MB
log4j.appender.RollingAppender.Threshold=INFO
#输出文件最大序号为10
log4j.appender.RollingAppender.MaxBackupIndex=10
#输出文件路径
log4j.appender.RollingAppender.File=/live/logs/dgsar
#log4j.appender.Appender2.DatePattern=’_’yyyy-MM-dd’.log’
log4j.appender.RollingAppender.DatePattern='.'yyyy-MM-dd
#自定义输出布局
log4j.appender.RollingAppender.layout=org.apache.log4j.PatternLayout
#输出格式
log4j.appender.RollingAppender.layout.ConversionPattern=%d %-5p [%t] (%13F:%L) %3x - %m%n
project 的log4j版本:log4j-1.2.17