2010-12-01 49 views
2

我已成功配置了一個應用程序,該應用程序使用log4j進行日誌記錄以登錄到MySQL數據庫。 (使用org.apache.log4j.jdbc.JDBCAppender)。log4j JDBCAppender循環表名

我也有一些Perl登錄到數據庫的應用程序。我的perl應用程序已設置,以便數據庫表的名稱每個月都會更改(log_2010_11,log_2010_10等)。在每個月的月底,我在剛剛完成的月份運行報告腳本,將錶轉儲到外部文件(壓縮和歸檔),然後刪除表。通過這種方式,日誌數據庫的總大小保持在合理的範圍內。

我想對log4j做同樣的事情,但似乎沒有適合這個目的的log4j appender。

是否有可能做這樣的事情:

log4j.appender.SQ=org.apache.log4j.jdbc.JDBCRollingAppender 

log4j.appender.SQ.Driver=com.mysql.jdbc.Driver 

log4j.appender.SQ.URL=jdbc:mysql://localhost:3306/logs_{%year}_{%month} 

謝謝。

回答

1

我想通了,如何做到這一點:

log4j.appender.SQ=org.apache.log4j.jdbc.JDBCAppender 
log4j.appender.SQ.Driver=com.mysql.jdbc.Driver 
log4j.appender.SQ.URL=jdbc:mysql://localhost:3306/logs 
log4j.appender.SQ.sql=INSERT INTO accesslog_%d{yyyy_MM} (date, time, tz, ... 

看樣子你可以把日期格式字符串到SQL語句,並JDBCAppender將擴大他們登錄到coresponding表。

但是,它不會在新月開始時創建新表,所以目前我必須事先手動創建表,這非常不理想。

+0

我應該說。日期格式字符串在java.text.SimpleDateFormat(標準java庫的一部分)中定義, – chrestomanci 2011-02-07 15:12:12

0

你必須寫你自己的appender來做到這一點。

另一種選擇是留在現有的appender和做到這一點:

您的命名log數據庫中的表。爲什麼不製作一個perl腳本,在每個月末創建一個新表格,例如1233年的log_12,複製從loglog_12的所有內容,然後從log刪除所有內容?這樣你就不必亂用另一個appender。

0

腳本如何每月運行並將該特定錶轉儲爲備份文件,然後將其壓縮以歸檔。完成後,截斷表格或刪除日期範圍內的行。