2016-07-01 92 views
0

審覈日誌需要進入數據庫。因此,我有以下登錄到數據庫的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 

回答

0

您可以點擊這裏

org.apache.log4j.jdbc.JDBCAppender#flushBuffer 

代碼如果SQL異常被拋出,將通過的ErrorHandler處理。默認情況下它是OnlyOnceErrorHandler,它會將錯誤打印到strerr(但只是第一次)。 還有另一個錯誤處理實現:FallbackErrorHandler。 您可以找到如何配置錯誤處理程序。

+0

謝謝你@承諾人,你的回答完全符合我的要求。我感謝您的幫助:-) – Aditya

0

如果莫名其妙的應用程序無法登錄到數據庫中,那麼它應該登錄到一個文件中(只有失敗的數據)

使用FailoverAppender,它封裝多個追加程序所調用的順序,只調用備份appender(s)如果主要失敗(s)。

+0

謝謝@copeg爲您的迴應它確實回答我的問題,但FailoverAppender是log4j2的一部分,我正在使用log4j 1.2.17版本。 :-) – Aditya