Q1:DBへログを出力するには?

以下のように 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ドキュメントを見ると、確かに例外のログを出力しないとあり、これは仕様のようです。また、将来完全に置き換えられるという記述もあるため、将来の版では例外が出力されるようになるかもしれません。


トップページへ戻る