2009-10-21 148 views
3

只要Apache Derby在我们的应用程序中引发SQLException,我们的应用程序就会将derby.log文件的内容发送到我们的服务器。限制德比日志文件大小

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

但是,我们注意到巨大的日志文件,因为日志每次连接到数据库时都包含启动输出。

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

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

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

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

由于提前,

吉姆

回答

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? +包装成以上的一个或
  • 石油化工科学研究院断得到其他一些项目的RollingFileLoggerClass一些想法(RollingFileAppender进行log4j的, RollingFileWriter梆子,...)
0

另一种方式来处理,这将是编写自己的代码,旋转,截断,压缩或以其他方式削去下来的derby.log文件德比运行在两者之间。

你没有提到你正在运行的Derby版本,但是我认为每个连接线的输出在更新版本中被删除。或者也许它只是从网络服务器输出而不是从derby.log输出中删除?

如果是每行连接输出导致derby.log膨胀,那么您可以考虑使用连接池技术,以免造成太多连接。一般来说,您可以在应用程序的整个生命周期内连接到连接;你不必经常创建和销毁它们。

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

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,并添加转储()的实现做什么你会生成的日志数据。

简单例子程序展示这种如下:

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