我正在尝试在我的应用程序上运行log4j 2.0。我是我的应用程序,我正在设置两个记录器:
-
一个将内容输出到控制台,以便您可以看到发生了什么。
-
另一个用于将测试运行结果输出到 DB2 表。这是一个完全不同的日志,仅用于跟踪测试的运行时间和结果。
我的麻烦在于 DB2 记录器。我似乎无法将记录写入表格。我知道我快到了,因为:
- 如果我使用虚拟库或表名,则在配置过程中会出现 log4j 错误。
- 如果我使用伪造的用户标识或密码,则在配置过程中会出现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 ==");
}
这是我的日志4j2.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 容器,则不需要执行此初始化。