【问题标题】:log4j jdbcappender pass username to database tablelog4j jdbcapender 将用户名传递给数据库表
【发布时间】:2012-05-20 11:33:28
【问题描述】:

我的log4j jdbcappender配置如下:

 <appender name="jdbcAppender" class="bean.CustomJdbcAppender">
        <param name="jndiDataSource" value="myDS"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern"
                   value="INSERT INTO log_table (level, loc, msg) VALUES ( '%p','%C;%L', '%m' )"/>
        </layout>

如何将用户名从 log4j 传递到数据库表?

谢谢

【问题讨论】:

  • 我个人会使用 MDC 或 NDC,否则您需要将其包含在您的消息中。但是“用户名”是什么意思?什么用户?
  • 用户名是登录到我的应用程序的用户。我在没有第三方过滤器(如 Spring)的情况下将用户名用于普通的自定义 NTLM 身份验证。

标签: java log4j


【解决方案1】:

使用 MDC(映射诊断上下文),例如 this example

所以,你需要在某个地方映射用户名,例如:

MDC.put("username", username);

在您的 log4j 配置中,您可以像这样使用它:

<param name="ConversionPattern"
      value="INSERT INTO log_table (level, loc, msg, username) VALUES ( '%p','%C;%L', '%m', '%X{username}' )"/>

【讨论】:

  • 感谢您的回复。我有一个问题,我已经有一个 servlet,用于使用 NTLM 身份验证登录用户到我的应用程序。那么是否可以在我现有的 servlet 中使用 MDC.put("username", username); 来映射用户名?这样我就可以避免像博客中提到的 AuthenticationFilter 这样的 servlet?
  • 我已经添加了 MDC.put("username", uname);在我的 login.jsp 中,当我运行我的应用程序时,我可以看到在控制台中打印的值。但是用户名有时为空,这可能是什么原因?
  • 1) 您在哪个位置执行身份验证(任何特定的 servlet 或过滤器)? 2)把用户名放在MDC那个地方——或者从这里开始调试。
  • 当我打印 MDC.get("username") 的值时,我总是按以下顺序获得 INFO (myManagedBean;60) MDC null INFO (myManagedBean;60) MDC Pon INFO (myManagedBean;60) MDC null INFO (myManagedBean;60) MDC Pon 即或者我得到空值。
  • 登录后我将值放入登陆页面的managedbean构造函数中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-02
  • 2013-06-30
  • 1970-01-01
  • 1970-01-01
  • 2013-03-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多