以下のように JDBCAppender を使用します。以下は接続先 DB が Postgresql の場合の設定です。
<appender name="JDBC" class="org.apache.log4j.jdbc.JDBCAppender">
<param name="URL" value="jdbc:postgresql://ホスト名/データベース名" />
<param name="user" value="ユーザ名" />
<param name="password" value="パスワード" />
<param name="driver" value="org.postgresql.Driver" />
<param name="bufferSize" value="1" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="INSERT INTO LOGTABLE (PRIORITY, LOGGER,
LINE, MESSAGE, DATE) VALUES ('%p', '%c', '%L', '%m', '%d');" />
</layout>
</appender>
アペンダでは以下のパラメータを設定します。
| パラメータ | 値 |
|---|---|
| URL | JDBCドライバのURL |
| user | ユーザ名 |
| password | パスワード |
| driver | JDBCドライバのクラス名 |
| bufferSize | バッファリングするログイベントのサイズ。 上の設定では1としているため、ログイベントが発生するたびにDBへ格納される。 |
layout の ConversionPattern パラメータの値には、INSERT 文を記述します。格納する値には、PatternLayout の変換パターン記号が使えます。
もちろんログを格納する DB が動作している必要がありますし、挿入対象テーブルが既に存在していなければなりません。尚、上の例では LOGTABLE というテーブルへログを挿入する設定にしています。この LOGTABLE テーブルの生成は以下の SQL で行いました。
CREATE TABLE logtable ( priority varchar(8), logger varchar(100), line varchar(6), message varchar(1024), date varchar(50) )
以下のコードを実行すると、
public void printLog() {
logger.debug("DEBUG message");
logger.info("INFO 日本語テスト 〜①");
logger.warn("WARN message");
logger.error("ERROR message", new Exception("error exception"));
logger.fatal("FATAL message", new Throwable("fatal exception"));
}
以下のように DB へ行が挿入されます。

ERROR と FATAL レベルでは例外もログ出力しているはずですが、DB へは格納されません。JDBCAppender のAPIドキュメントを見ると、確かに例外のログを出力しないとあり、これは仕様のようです。また、将来完全に置き換えられるという記述もあるため、将来の版では例外が出力されるようになるかもしれません。