log4j mdc 问题

问题描述

最近在配置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了
解决方案八:
其他类?是同一个线程中调用吗?或有父子线程关系?

时间: 2024-12-08 14:27:32

log4j mdc 问题的相关文章

《Log4j2官方文档》从Log4j 1.x迁移

从Log4j 1.x迁移 使用Log4j 1.x桥接 转换到Log4j 2的最简单方法,也许就是把log4j 1.x的jar文件替换为Log4j 2的log4j-1.2-api.jar.然而,要让这个方式可以使用,应用必须满足以下要求: 不能访问Log4j 1.x的内部实现的方法和类,例如Appenders, LoggerRepository或者Category的callAppenders方法. 不能以编程方式配置Log4j. 不能通过调用类DOMConfigurator或PropertyCon

log4j 自定义的参数在业务中怎样获取?

问题描述 log4j.rootLogger=DEBUG,DATABASE log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender log4j.appender.DATABASE.URL=jdbc:db2://10.1.16.210:50000/TKLPF_DBlog4j.appender.DATABASE.driver=com.ibm.db2.jcc.DB2Driverlog4j.appender.DATABASE.user=admi

集中式日志管理部署下的Log输出

集中式日志管理部署下的Log输出 Log是程序记录执行过程,辅助排查问题的必备良药.随着后台程序越来越复杂,集群规模越来越大,通常会引入集中式程序日志管理,比如使用splunk或者ELK统一管理日志.Log打的好,排错无烦恼,但是往往打不好.下面就聊聊怎么打Log,特别是在使用集中式日志管理架构时. 为什么Log输出变得越来越难 一句话描述Log查找的需求:根据查询条件,返回并且仅返回所关注的用例相关的所有上下文. 怎么变难的: 单线程同步:有时间戳和重要参数值就差不多了 多线程同步:你可能需要

Java日志终极指南

Java日志基础Java使用了一种自定义的.可扩展的方法来输出日志.虽然Java通过java.util.logging包提供了一套基本的日志处理API,但你可以很轻松的使用一种或者多种其它日志解决方案.这些解决方案尽管使用不同的方法来创建日志数据,但它们的最终目标是一样的,即将日志从你的应用程序输出到目标地址. 在这一节中,我们会探索Java日志背后的原理,并说明如何通过日志来让你成为一个更好的Java开发人员. Java日志组件 Java日志API由以下三个核心组件组成: Loggers:Lo

《SLF4J官方文档》传统桥接API

通常,有些组件取决或依赖Logging API,而不是SLF4J.你也可以假设不久的将来这些组件不会转变成SLF4J.为了处理这种情况,SLF4J装载了几个可以重定向调用的桥接模块,这些模块使得log4j, JCL and java.util.logging APIs 表现得仿佛他们是SLF4J的代替.下图阐述了这个想法. 请注意在你控制下的源代码,你真得应该用slf4j-migrator.本页所描述的基于二进制的解决方案是适合超出你控制范围的软件. 从Jakarta Commons Loggi

eclipse-mapreduce编程出现错误:Job running in uber mode : false?

问题描述 mapreduce编程出现错误:Job running in uber mode : false? eclipse编写mapreduce程序,实现统计多个目录下所有文件的文件行数总数. 代码如下: package ZhangBo; import java.io.IOException; //import java.util.StringTokenizer; import org.apache.hadoop.conf.Configuration; import org.apache.ha

Log4j输出到mysql数据库

问题描述 Log4j输出到mysql数据库 用MDC.put()将值放进去,再使用log.info()触发.但是触发前总会有一行空白的字段自动添加进去.这是什么原因?怎么设置自定义级别呢?就是当我想输出到数据库就输出,不想就不输出,应该怎么写呢? 解决方案 http://blog.csdn.net/yaerfeng/article/details/18151339 解决方案二: http://xialiang19851204.blog.163.com/blog/static/3720773520

[Java开发之路](16)学习log4j日志

1. 新建一个Java工程,导入Jar包(log4j-1.2.17.jar) Jar包下载地址:点击打开链接 2. 配置文件:创建并设置log4j.properties # 设置 log4j.rootLogger = debug,stdout,D,E   # 输出信息到控制台 log4j.appender.stdout = org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target = System.out log4j.append

log4j_slf4j log4j.properties

hibernate 使用的日志是slf4j,而 slf4j又有各种实现策略. 使用log4j 就是其中一种方式. 需要的jar 包: log4j-1.2.16.jar slf4j-api-1.6.1.jar slf4j-log4j12-1.6.1.jar   配置文件放在 src 根目录下,配置文件名称是log4j.properties 范例:   log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdo