log4j Database Appender 不能正常工作

log4j Database Appender does not work properly

我的 log4j.properties 文件看起来像

log4j.rootLogger = ERROR,sql, Appender1

log4j.logger.com.endeca=ERROR
log4j.logger.com.endeca.itl.web.metrics=ERROR

log4j.appender.sql=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.sql.URL=jdbc:mysql://192.168.70.39:3306/cortex_mcss_ip
log4j.appender.sql.driver=com.mysql.jdbc.Driver
log4j.appender.sql.user=root
log4j.appender.sql.password=123456
log4j.appender.sql.sql=INSERT INTO errorlog(Level,Msg,CreatedDate) VALUES ('%p','%m',now())
log4j.appender.sql.layout=org.apache.log4j.PatternLayout


log4j.appender.Appender1=org.apache.log4j.ConsoleAppender
log4j.appender.Appender1.layout=org.apache.log4j.PatternLayout
log4j.appender.Appender1.layout.ConversionPattern=%-7p %d [%t] %c %x - %m%n

log4j.appender.Appender2=org.apache.log4j.FileAppender
log4j.appender.Appender2.File=D:/Logs/Log4jWebDemo.log
log4j.appender.Appender2.layout=org.apache.log4j.PatternLayout
log4j.appender.Appender2.layout.ConversionPattern=%-7p %d [%t] %c %x - %m%n

发生错误时它在控制台和文件追加器上工作正常,但不会向数据库中插入任何东西?

注意:数据库参数在每个角落都是 100% 准确的。

谁能帮我解决这个问题...请...

直接回答您的问题: 你应该调试这个 appender 看看会发生什么。

  1. 确保数据库驱动程序(在本例中为 mysql)出现在应用程序的类路径中。

  2. 确保 table / schema 存在,因为这个 appender 本身不会为你创建一个 schema

  3. 请注意,它有一个 "bufferSize" 参数,因此只有当未存储的消息计数超过缓冲区时,才会执行实际的数据库请求。

  4. org.apache.log4j.jdbc.JDBCAppender#execute上打个断点,看看它到底是怎么执行的

总体 observation/side 注释,与您的答案没有直接关系,但仍然很有价值。 这个附加程序真的已经过时了,对于现代生产应用程序来说并不是一个很好的解决方案(除非你的日志数量非常少)。

此附加程序不使用可能所有现代 RDBMS 都支持的批量插入。 此附加程序不使用准备好的语句。

如今,在 RDBMS 中全面存储日志没有任何意义,日志是用来读取和分析的,而 RDBMS 并没有为此提供真正方便的工具(无论是从视觉上还是从维护的角度来看) : 如何删除过时的消息?批量删除非常昂贵,分区?许多 RDBMS 并不真正支持记录的保留策略...

因此,更现代的方法是使用 ElasticSearch + Kibana(+ 一些日志传送器)等工具,甚至将日志流式传输到云端(如 Logz.io)