限制Derby日志文件大小

时间:2009-10-21 06:27:14

标签: java derby

只要Apache Derby在我们的应用程序中抛出SQLException,我们的应用程序就会将derby.log文件的内容发送到我们的服务器。

为了获得详细的日志,我们将'derby.infolog.append'属性设置为true。

但是,我们注意到非常大的日志文件,因为每次与数据库建立连接时,日志也包含启动输出。

注意:我们在嵌入模式下使用Derby。

有没有办法让德比限制它记录到derby.log文件的总行数?

例如,仅记录最近的1000行日志,然后开始覆盖最旧的条目。

我们的目标是从最终用户那里获得有用的调试信息,但要防止日志文件增长到无法管理的大小。

提前致谢,

吉姆

3 个答案:

答案 0 :(得分:1)

我不熟悉德比,但我找不到一个“简单”的方法来做到这一点。

但是你可以设置一些德比属性来自己实现。

检查这些

derby.stream.error.field

derby.stream.error.file

derby.stream.error.method

derby.stream.error.logSeverityLevel

所以我想你在编写一些子类java.io.OutputStreamjava.io.Writer,然后你要么

  • 实现想要的行为或
  • 类似于How do I limit the size of log file? +包装为上述之一或
  • ripp-off 从其他项目中获取RollingFileLoggerClass的一些想法(RollingFileAppender log4j,RollingFileWriter clapper,...)

答案 1 :(得分:1)

您可以创建自定义日志记录类,并使用上面提到的derby.stream.error.field指定它。日志记录类不必实现为文件 - 如果您将限制日志记录数据的大小,您可以轻松地将其保存在内存中。

这样做的第二个好处是,遇到问题时,您可以在如何处理日志记录数据方面拥有很大的灵活性。也许压缩(或加密)数据并自动在帮助系统中打开票证(作为示例)。

以下是一个非常简单的自定义日志记录解决方案的示例:

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();
    }
}

答案 2 :(得分:0)

另一种处理此问题的方法是编写自己的代码,在Derby运行之间旋转,截断,压缩或以其他方式削减derby.log文件。

您没有提到您正在运行的Derby版本,但我认为在最近的版本中删除了每个连接线的输出。或者它可能只从网络服务器输出中删除而不是从derby.log输出中删除?

如果是连接线输出会使你的derby.log膨胀,那么你可能会考虑使用连接池技术,这样你就不会建立这么多连接。通常,您可以在应用程序的生命周期内连接到连接;你不必经常创造和销毁它们。

如果您认为有多余的不必要输出发送到derby.log,您可以在Derby社区错误跟踪器上记录一个增强请求,并提供示例,以确保未来版本的Derby不会记录不需要的内容。