日期:2014-05-20  浏览次数:20574 次

log4j诡异问题:用户名时能输出,时而不能输出!
log4j配置文件:
XML code
log4j.rootLogger=warn,db
log4j.appender.db=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.db.BufferSize=1
log4j.appender.db.URL=jdbc\:jtds\:sqlserver\://server\:1434/pcbsyn
log4j.appender.db.driver=net.sourceforge.jtds.jdbc.Driver
log4j.appender.db.user=sa
log4j.appender.db.password=711
log4j.appender.db.sql=insert into logInfo(userId,userName,lclass,lmethod,lTime,llevel,message) values ('%X{userId}','%X{userName}','%C','%M','%d{yyyy-MM-dd HH\:mm\:ss}','%p','%m')
log4j.appender.db.layout=org.apache.log4j.PatternLayout

 


使用MDC 将 userId userName 存入
Java code
session.setAttribute("userId", userInfo.getLoginName().toString()
                            .trim());
                    session.setAttribute("userName", userInfo.getUserName().toString()
                            .trim());
MDC.put("userId",userInfo.getLoginName());  
MDC.put("userName",userInfo.getUserName()); 


现在怪异的是:userId、userName 有时候是有值的,有时候又是null值!
如图:


------解决方案--------------------
信息太少,只能靠猜。
------解决方案--------------------
session.setAttribute("userId", userInfo.getLoginName().toString().trim());
session.setAttribute("userName", userInfo.getUserName().toString().trim());
MDC.put("userId",userInfo.getLoginName());
MDC.put("userName",userInfo.getUserName()); 
这些代码是只有一处,还是有多处
建议将涉及到同样操作的语句的地方都搂出来检查检查

------解决方案--------------------
MDC是全局的吗,是一个Map吗
若是全局的,下面这样写会有问题的,后来登录的会把前一个登录的给覆盖掉
MDC.put("userId",userInfo.getLoginName());
MDC.put("userName",userInfo.getUserName());

------解决方案--------------------
MDC.put("userId",userInfo.getLoginName());
MDC.put("userName",userInfo.getUserName()); 
在这之前做一个判断,userInfo.getLoginName()和userInfo.getUserName()是否为null,为null的话就设定个特殊字符来记录下试试,如果这两个确定不为null那就不用这么做了
弄个源码跟进源码看下哪些地方导致了记录为Null
ps:没实际用过,只是提供参考