2009-10-21 152 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(); 
    } 
}