如果log4j无法登录数据库,如何登录文件?

时间:2016-07-01 15:55:27

标签: java log4j

要求审核日志进入数据库。因此我遵循登录数据库的log4j设置。此审核日志包含重要信息,因此如果应用程序无法以某种方式登录到数据库,那么它应该登录到文件(仅失败的数据)。即使这种情况很少见,我也必须将失败的日志消息存储到文件中。

# Define the DB appender
log4j.appender.DB=org.apache.log4j.jdbc.JDBCAppender

# Set JDBC URL
log4j.appender.DB.URL=url

# Set Database Driver
log4j.appender.DB.driver=oracle.jdbc.driver.OracleDriver

# Set database user name and password
log4j.appender.DB.user=pwd
log4j.appender.DB.password=user

# Set the SQL statement to be executed.
log4j.appender.DB.sql=INSERT INTO audit_log(loglevel, logger, message) VALUES('%p', '%C{1}:%L','%m%n')

# Define the layout for db appender
log4j.appender.DB.layout=org.apache.log4j.PatternLayout

我创建了另一个可以记录此类场景的文件appender,但我怎么知道数据库日志记录失败了?所有日志记录功能都是无效的(信息,错误,警告,致命),因此没有回调知道数据库日志失败。有没有人遇到这样的情况,找到了解决方案或绕过实现这一目标。或者此方案的其他日志记录机制,允许登录数据库和文件。

log4j.appender.failedToLog=org.apache.log4j.RollingFileAppender
log4j.appender.failedToLog.File=./logs/failedToLog/failedToAuditLog.log
log4j.appender.failedToLog.MaxFileSize=5MB
log4j.appender.failedToLog.MaxBackupIndex=10
log4j.appender.failedToLog.layout=org.apache.log4j.PatternLayout
log4j.appender.failedToLog.layout.ConversionPattern=%-5p [%d{dd-MMM-yyyy HH:mm:ss.SSS z}] - [%C{1}:%L] - %m%n


log4j.category.failedAuditLogger=DEBUG, failedToLog
log4j.additivity.failedAuditLogger=false

2 个答案:

答案 0 :(得分:0)

您可以在此处查看代码

org.apache.log4j.jdbc.JDBCAppender#flushBuffer

如果抛出了sql异常,它将由errorHandler处理。默认情况下,它是OnlyOnceErrorHandler,它会将错误打印到strerr(但只是第一次)。 还有另一种错误处理实现:FallbackErrorHandler。 您可以找到如何配置错误处理程序。

答案 1 :(得分:0)

  

如果应用程序无法以某种方式登录到数据库,那么它应该登录到一个文件(只有失败的数据)

使用FailoverAppender,它包含按顺序调用的多个appender,仅在主要失败时调用备份appender。