3

Apache Derby がアプリで SQLException をスローするたびに、アプリは derby.log ファイルの内容をサーバーに送信します。

詳細なログを取得するために、「derby.infolog.append」プロパティを true に設定しています。

ただし、ログにはデータベースへの接続が確立されるたびに起動時の出力も含まれるため、ログ ファイルが非常に大きくなっています。

注: Derby を組み込みモードで使用しています。

derby が derby.log ファイルに記録する行の総数を制限する方法はありますか?

たとえば、最新の 1000 行のログのみを記録してから、最も古いエントリを上書きし始めます。

私たちの目標は、エンド ユーザーから有用なデバッグ情報を取得することですが、ログ ファイルが管理できないほど大きくならないようにすることです。

前もって感謝します、

ジム

4

3 に答える 3

1

私はダービーに詳しくありませんが、これを行うための「簡単な」方法を見つけることができませんでした。

しかし、これを自分で実装するために設定できる derby プロパティがいくつかあります。

これらを確認してください

derby.stream.error.field

derby.stream.error.file

derby.stream.error.method

derby.stream.error.logSeverityLevel

したがって、 java.io.OutputStreamまたはjava.io.Writerをサブクラス化するクラスを作成してから、次のいずれかを作成することを想像してください。

于 2009-10-21T08:31:59.730 に答える
1

カスタム・ロギング・クラスを作成し、上記のように 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();
    }
}
于 2009-10-22T17:34:32.210 に答える
0

これを処理する別の方法は、Derby の実行の間に derby.log ファイルをローテーション、切り捨て、圧縮、またはその他の方法で削減する独自のコードを作成することです。

実行している Derby のバージョンについては言及していませんが、最近のリリースでは接続ごとの行の出力が削除されたと思います。それとも、derby.log の出力からではなく、Network Server の出力からのみ削除されたのでしょうか?

derby.log を膨張させているのが接続ごとの行の出力である場合は、あまり多くの接続を作成しないように、接続プーリング手法の使用を検討してください。通常、アプリケーションの存続期間中は接続を維持できます。それらを頻繁に作成および破棄する必要はありません。

不要な出力が derby.log に過剰に記録されていると思われる場合は、Derby コミュニティーのバグ・トラッカーで例を挙げて拡張要求を記録し、Derby の将来のバージョンで不要なものが記録されないようにすることができます。

于 2009-10-21T14:28:37.143 に答える