カスタム・ロギング・クラスを作成し、上記のように derby.stream.error.field を使用してこれを指定できます。ロギング クラスはファイルとして実装する必要はありません。ロギング データのサイズを制限する場合は、簡単にメモリに保持できます。
これの 2 つ目の利点は、問題が発生したときに、ログ データをどう処理するかについて非常に柔軟に対応できることです。おそらく、データを圧縮 (または暗号化) し、ヘルプ システムでチケットを自動的に開きます (例として)。
非常に単純なカスタム ロギング ソリューションの例を次に示します。
import java.io.CharArrayWriter;
public class CustomLog {
public static CharArrayWriter log = new CharArrayWriter();
public static void dump() {
System.out.println(log.toString());
}
}
CharArrayWriter をサイズが制限された何らかの種類のバッファーに置き換え、dump() の実装を追加して、結果のログ データを処理することができます。
これを示す短いプログラム例は次のとおりです。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class DerbyLoggingExample {
public DerbyLoggingExample() {
System.setProperty( "derby.stream.error.field", "CustomLog.log");
String driver = "org.apache.derby.jdbc.EmbeddedDriver";
String dbName = "logdemoDB";
String connectionURL = "jdbc:derby:" + dbName + ";create=true";
String createCommand = "create table test_table ("
+ "test_id int not null generated always as identity, "
+ "test_name varchar(20)"
+ ")";
try {
Class.forName(driver);
}
catch( java.lang.ClassNotFoundException e ) {
System.out.println( "Could not load Derby driver." );
return;
}
Connection conn = null;
Statement statement = null;
try {
conn = DriverManager.getConnection(connectionURL);
statement = conn.createStatement();
statement.execute(createCommand);
}
catch( SQLException sqle ) {
sqle.printStackTrace();
System.out.println( "SQLException encountered. Dumping log.");
CustomLog.dump();
return;
}
finally {
try {
statement.close();
conn.close();
}
catch( SQLException e ) {
// Do nothing.
}
}
System.out.println( "Processing done. Dumping log." );
CustomLog.dump();
}
public static void main(String[] argv) {
DerbyLoggingExample thisApp = new DerbyLoggingExample();
}
}