java - log4j 2.0 JDBC ConnectionFactory 到 DB2 未将记录添加到日志表 (log4j2.xml)

标签 java jdbc db2 ibm-midrange log4j2

我正在尝试让 log4j 2.0 在我的应用程序上运行。在我的应用程序中,我设置了两个记录器:

  1. 将内容输出到控制台,以便您可以看到发生了什么。

  2. 另一个将测试运行结果输出到 DB2 表。这是一个完全不同的日志,用于跟踪测试的运行时间和结果。

我的问题出在 DB2 记录器上。我似乎无法将记录写入表中。我知道我已经快到了,因为:

  • 如果我使用虚拟库或表名称,配置期间会出现 log4j 错误。
  • 如果我使用伪造的用户 ID 或密码,配置过程中会出现 log4j 错误。
  • 如果我使用没有文件权限的有效用户 ID/密码,配置期间会出现 log4j 错误。
  • 但是...如果所有这些都正确,没有错误,但也没有写入记录。

在控制台中,我可以看到 log4j 重新配置正确完成:

2013-10-02 11:31:06,261 DEBUG Reconfiguration completed

那么...我错过了什么? log4j 网站上没有太多关于此的文档。

这是应用程序中的代码:

public static void testExists(String myProcedure) {
    final Logger console = LogManager.getLogger(myProcedure);
    final Logger mytestlog = LogManager.getLogger(myProcedure);

.... yadda, yadda, yadda ....
.... and then finally, call the loggers with ....

    console.info("== write this to the console ==");
    mytestlog.info("== write this to the db2 log ==");
}

这是我的 log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="trace">
  <Appenders>
    <Console name="Console" target="SYSTEM_OUT">
      <PatternLayout pattern="%date{HH:mm:ss.SSS} %-5level{lowerCase=false} %logger{36} | %msg%n"/>
    </Console>
    <JDBC name="jdbc" tableName="vqccommon.sptestlog">
        <ConnectionFactory class="foo.bar.chew.Log4jConnect" method="log4jConnect" />
        <Column name="timestamp" isEventTimestamp="true" />
        <Column name="testclass" pattern="%class" />
... some other columns ....
       </JDBC>
     </Appenders>
     <Loggers>
       <Logger name="sptestlog" level="trace">
           <AppenderRef ref="jdbc" ></AppenderRef>
       </Logger>
       <Root level="trace">
         <AppenderRef ref="Console" ></AppenderRef>
       </Root>
     </Loggers>

   </Configuration>

最佳答案

正如 porfiriopartida 在评论中提到的,我认为您已经接近成功,但您只需要更改在(测试)应用程序中创建记录器的方式:

public static void testExists() {
    Logger console = LogManager.getLogger(getClass()); 
    Logger dbLog = LogManager.getLogger("sptestlog"); // match config Logger name!

    console.info("== write this to the console ==");
    dbLog.info("== write this to the db2 log ==");
}

只有使用 LogManager.getLogger("spteSTLog") 创建的记录器才会附加到您配置的 JDBC 附加程序。具有任何其他名称的记录器将记录到控制台。

2013-10-02 11:31:08,224 DEBUG ServletContext not present - WebLookup not added 行与 JDBC 日志记录无关。 Log4J 在 Web 容器中进行一些额外的初始化。如果找不到 Web 容器,则不需要执行此初始化。

关于java - log4j 2.0 JDBC ConnectionFactory 到 DB2 未将记录添加到日志表 (log4j2.xml),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19141111/

相关文章:

java - 当我在 javafx 中使用 Parent As Node 时 TranslateTransition 显示白色背景

java - 当 JDBC 数据库编号在 ResultSet.getInt 期间超过 Java 的 int 大小时会发生什么?

db2 - 对名称中带有点 "."的 DB2 文件运行 SQL 查询?

java - 我需要仅对特定单词进行更改

java - Spring Boot - REST 和 SOAP 组合

postgresql - 在带有 uuid_generate_v4() 的 postgres 上使用光滑代码生成器时出错

java - 如何使用java将Jtable中选中的复选框项保存到mysql?

SQL 从一个表或其他表中选择

java - DB2 错误代码 4499 SQLSTATE=58009

java - 是否可以在 foreach 循环中填充数组