要求审核日志进入数据库。因此我遵循登录数据库的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
答案 0 :(得分:0)
您可以在此处查看代码
org.apache.log4j.jdbc.JDBCAppender#flushBuffer
如果抛出了sql异常,它将由errorHandler处理。默认情况下,它是OnlyOnceErrorHandler,它会将错误打印到strerr(但只是第一次)。 还有另一种错误处理实现:FallbackErrorHandler。 您可以找到如何配置错误处理程序。
答案 1 :(得分:0)
如果应用程序无法以某种方式登录到数据库,那么它应该登录到一个文件(只有失败的数据)
使用FailoverAppender,它包含按顺序调用的多个appender,仅在主要失败时调用备份appender。