log4j JDBCAppender旋转表名

时间:2010-12-01 14:04:52

标签: log4j

我已经成功配置了一个使用log4j进行日志记录的应用程序,以登录MySQL数据库。 (使用org.apache.log4j.jdbc.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}

谢谢。

3 个答案:

答案 0 :(得分: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会扩展它们并登录到相应的表格。

但是,它不会在新月开始时创建新表,所以目前我必须手动创建表,这远非理想。

答案 1 :(得分:0)

你必须编写自己的appender才能做到这一点。

另一个选择是保持现有的appender并执行此操作:

您的数据库中有一个名为log的表。为什么不制作一个Perl脚本,在每个月末创建一个新表,让我们说12月的log_12,复制从loglog_12的所有内容,然后删除log中的所有内容}?这样你就不用再做另一个appender了。

答案 2 :(得分:0)

如何每月运行一个脚本并将该特定表转储到备份文件中,然后将其压缩以进行存档。完成后,截断表格或删除日期范围内的行。