限制德比日志文件大小
只要Apache Derby在我们的应用程序中引发SQLException,我们的应用程序就会将derby.log文件的内容发送到我们的服务器。限制德比日志文件大小
为了获得详细的日志,我们将'derby.infolog.append'属性设置为true。
但是,我们注意到巨大的日志文件,因为日志每次连接到数据库时都包含启动输出。
注意:我们在嵌入模式下使用Derby。
有没有办法让德比限制它登录到derby.log文件的总行数?
例如,只记录最近的1000行日志,然后开始覆盖最旧的条目。
我们的目标是从最终用户获得有用的调试信息,但要防止日志文件增长到无法管理的大小。
由于提前,
吉姆
我没那么熟悉德比,但我无法找到一个“简单”的方式来做到这一点。
但你可以设置一些德比属性来实现这一点。
检查这些
derby.stream.error.logSeverityLevel
所以我想你写一些类的子类java.io.OutputStream或java.io.Writer,然后你要么
- 实现想要的行为或
- 做类似How do I limit the size of log file? +包装成以上的一个或
- 你
石油化工科学研究院断得到其他一些项目的RollingFileLoggerClass一些想法(RollingFileAppender进行log4j的, RollingFileWriter梆子,...)
另一种方式来处理,这将是编写自己的代码,旋转,截断,压缩或以其他方式削去下来的derby.log文件德比运行在两者之间。
你没有提到你正在运行的Derby版本,但是我认为每个连接线的输出在更新版本中被删除。或者也许它只是从网络服务器输出而不是从derby.log输出中删除?
如果是每行连接输出导致derby.log膨胀,那么您可以考虑使用连接池技术,以免造成太多连接。一般来说,您可以在应用程序的整个生命周期内连接到连接;你不必经常创建和销毁它们。
如果您认为有多余的不必要输出转发到derby.log,您可以使用示例在Derby社区bug跟踪器上记录增强请求,以确保未来版本的Derby不会记录不需要的内容。
您可以创建自定义日志记录类,并使用上面提到的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,并添加转储()的实现做什么你会生成的日志数据。
简单例子程序展示这种如下:
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();
}
}