只要Apache Derby在我们的应用程序中抛出SQLException,我们的应用程序就会将derby.log文件的内容发送到我们的服务器。
为了获得详细的日志,我们将'derby.infolog.append'属性设置为true。
但是,我们注意到非常大的日志文件,因为每次与数据库建立连接时,日志也包含启动输出。
注意:我们在嵌入模式下使用Derby。
有没有办法让德比限制它记录到derby.log文件的总行数?
例如,仅记录最近的1000行日志,然后开始覆盖最旧的条目。
我们的目标是从最终用户那里获得有用的调试信息,但要防止日志文件增长到无法管理的大小。
提前致谢,
吉姆
答案 0 :(得分:1)
我不熟悉德比,但我找不到一个“简单”的方法来做到这一点。
但是你可以设置一些德比属性来自己实现。
检查这些
derby.stream.error.logSeverityLevel
所以我想你在编写一些子类java.io.OutputStream或java.io.Writer,然后你要么
答案 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不会记录不需要的内容。