2010-12-01 20 views
2

これは、log4jを使ってMySQLデータベースにログインするためのログを作成するアプリケーションを正常に設定しました。 (org.apache.log4j.jdbc.JDBCAppenderの使用)。log4j JDBCAppenderテーブル名をローテート

また、データベースにログインするいくつかのperlアプリケーションもあります。私のperlアプリケーションは、データベーステーブルの名前が毎月変わるように設定されています(log_2010_11、log_2010_10など)。毎月末に、私はちょうど完了した月にレポーティングスクリプトを実行し、テーブルを外部ファイル(圧縮およびアーカイブされます)にダンプして、テーブルをドロップします。この方法では、ロギングデータベースの合計サイズはかなりの制限内にとどまります。

私はlog4jでも同じことをしたいと思いますが、目的に適したlog4jアペンダーがないようです。

はこのような何かをすることが可能です:

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テーブルにログインされます表示されます。

理想からかけ離れである、しかし、それは新しい月の開始時に新しいテーブルを作成しませんので、現在、私は事前にテーブルを作成してmanualyする必要があります。

+0

私は言っていたはずです。日付書式文字列はjava.text.SimpleDateFormatで定義されています(標準Javaライブラリの一部) – chrestomanci

0

これを行うには、独自のアペンダーを作成する必要があります。

別のオプションは、既存のアペンダに滞在し、これを行うには、次のようになります。

あなたはlogという名前のデータベース内のテーブルを持っています。毎月末に新しいテーブルを作成するPerlスクリプトを作って12月にlog_12と言うと、logからlog_12までのすべてをコピーしてから、logからすべてを削除してみましょう。そうすれば、別のアペンダーを作っていなくても構いません。

0

毎月実行してその特定のテーブルをバックアップファイルにダンプしてからアーカイブして解凍するのはいかがですか。完了したら、テーブルを切り捨てるか、日付範囲内の行を削除します。

関連する問題