问题描述
最近在配置log4j,往db中写入数据,但不知道为什么mdc为null,困惑,请各位帮忙看看。过滤器publicclassAuthorityInterceptorextendsAbstractInterceptor{privatefinalLoglog=LogFactory.getLog(getClass());@Override/**拦截action处理的方法*/publicStringintercept(ActionInvocationinvocation)throwsException{//获取ActionContext实例ActionContextctx=invocation.getInvocationContext();//获取session对象Map<String,Object>session=ctx.getSession();HttpServletRequestrequest=(HttpServletRequest)ctx.get(ServletActionContext.HTTP_REQUEST);//获取session中user的值UserLoginuserLogin=(UserLogin)session.get("userLogin");if(userLogin!=null){StringuserName=userLogin.getUserName();if(userName==null){returnAction.LOGIN;}else{MDC.put("userLoginId",userLogin.getId());MDC.put("idAddress",request.getLocalAddr());//**********************************************************//只有此处能获取到mdc的value,其他地方都能不获取log.info("userLoginIdis:"+userLogin.getId());//***********************************************************}}else{returnAction.LOGIN;}//继续执行actionreturninvocation.invoke();}}
配置文件log4j.rootLogger=fatal,stdout,D,DATABASElog4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender#与数据库建立连接log4j.appender.DATABASE.URL=log4j.appender.DATABASE.driver=com.microsoft.sqlserver.jdbc.SQLServerDriverlog4j.appender.DATABASE.user=log4j.appender.DATABASE.password=log4j.appender.DATABASE.Threshold=FATAL#指定要插入数据库的格式,具体参数的格式看一开始给出的文档log4j.appender.DATABASE.sql=INSERTINTOT_LogInfo(userLoginId,ipAddress,time,action)VALUES('%X{userId}','%X{ipAddress}','%d{yyyy-MM-ddHH:mm:ss}','%m')log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout
在线急求!!!!!!!!!!!
解决方案
解决方案二:
该回复于2012-08-06 13:27:18被版主删除
解决方案三:
MDCput进的key分别是userLoginId,idAddress:MDC.put("userLoginId",userLogin.getId());MDC.put("idAddress",request.getLocalAddr());log4j配置文件,配置的确是:'%X{userId}','%X{ipAddress}'key没有对上,楼主是不是写错了。
解决方案四:
如1L说的,你的key不一样不过很奇怪LZ的注释的地方写着,//只有此处能获取到mdc的value,其他地方都能不获取应该在该处使用程序中的keyuserLoginId了吧,如果你使用的配置文件的key,应该是取不到的吧
解决方案五:
该回复于2012-08-06 15:19:18被版主删除
解决方案六:
引用2楼的回复:
MDCput进的key分别是userLoginId,idAddress:MDC.put("userLoginId",userLogin.getId());MDC.put("idAddress",request.getLocalAddr());log4j配置文件,配置的确是:'%X{userId}','%X{ipAddress}'key没有对上,楼主是不是写错了……
嗯嗯,这块没主意,这是后来又测试,写错了,开始是正确的,但是也获取不到
解决方案七:
引用3楼的回复:
如1L说的,你的key不一样不过很奇怪LZ的注释的地方写着,//只有此处能获取到mdc的value,其他地方都能不获取应该在该处使用程序中的keyuserLoginId了吧,如果你使用的配置文件的key,应该是取不到的吧
我的意思只有在注释那(过滤器)能获取到将userId,ipAddress正常的存入数据库在其他的类中就不能获取到mdc的values了
解决方案八:
其他类?是同一个线程中调用吗?或有父子线程关系?