Java log4j 2.0 JDBC ConnectionFactory到DB2不向日志表添加记录(log4j2.xml)

Java log4j 2.0 JDBC ConnectionFactory到DB2不向日志表添加记录(log4j2.xml),java,jdbc,db2,ibm-midrange,log4j2,Java,Jdbc,Db2,Ibm Midrange,Log4j2,我正在尝试在我的应用程序上运行log4j2.0。我在应用程序中设置了两个记录器: 一个是将内容输出到控制台,这样您就可以看到发生了什么 另一种方法是将测试运行结果输出到DB2表。这是一个完全不同的日志,用于跟踪测试运行的时间和结果 我的问题是DB2记录器。我似乎无法将记录写入表中。我知道我就快到了,因为: 如果使用虚拟库或表名,则在配置期间会出现log4j错误 如果使用伪造的用户ID或密码,则在配置过程中会出现log4j错误 如果我使用了一个有效的用户ID/密码,但没有对该文件的权限,那么在配

我正在尝试在我的应用程序上运行log4j2.0。我在应用程序中设置了两个记录器:

  • 一个是将内容输出到控制台,这样您就可以看到发生了什么

  • 另一种方法是将测试运行结果输出到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 ==");
    }
    
    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 ==");
    }
    
    这是我的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(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 ==");
    }
    
    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:08224调试ServletContext不存在-未添加WebLookup
    行与JDBC日志记录无关。Log4J在web容器中执行一些额外的初始化。如果找不到web容器,则不需要进行初始化。

    您正在调用:
    LogManager.getLogger(myProcedure)您不需要2个变量来存储它,您可以在那里有一个单一的
    最终记录器日志
    检查“使用Log4j 2”部分。我不明白这是怎么回答我的问题的。看起来您在推荐另一个库,而不是配置多个日志的格式。也许我遗漏了什么。第一条评论是关于使用完全相同的变量,它是一个静态资源
    LogManager.getLogger(myProcedure)
    它不会获取console和db logger,因为您将它们存储在不同的变量中。在您的类中,
    记录器控制台
    记录器mytestlog
    完全相同,因此,如果记录器是控制台,则两者都将登录到控制台。如果记录器是DBLogger,两者都将记录到db。我建议您检查外部资源,它可能是您所需要的。除了appender存在之外,我在log4j2文档中没有发现任何jdbc引用。可能您缺少如何配置多个记录器,您正在将console设置为root。。我不记得这是否会覆盖上一个。这些评论可能不能回答你的全部问题,这就是为什么它是评论而不是答案。