2009-10-21 8 views
3

Notre application envoie le contenu du fichier derby.log à notre serveur chaque fois que Apache Derby lance une exception SQLException dans notre application. Pour obtenir des journaux détaillés, nous définissons la propriété 'derby.infolog.append' sur true. Pour obtenir des journaux détaillés, utilisez la propriété 'derby.infolog.append'. Cependant, nous remarquons des fichiers journaux extrêmement volumineux, car les journaux contiennent également une sortie de démarrage chaque fois qu'une connexion est établie avec la base de données.Limite Derby Taille du fichier journal

REMARQUE: nous utilisons Derby en mode intégré.

Existe-t-il un moyen d'avoir derby limiter le nombre total de lignes qu'il enregistre dans le fichier derby.log? Par exemple, consigner uniquement les 1000 dernières lignes de journaux, puis commencer à remplacer les entrées les plus anciennes.

Notre objectif est d'obtenir des informations de débogage utiles auprès des utilisateurs finaux, mais d'empêcher les fichiers journaux de prendre des tailles impossibles à gérer.

Merci à l'avance,

Jim

Répondre

1

Je ne suis pas familier avec le derby, mais je ne pouvais pas trouver un moyen « facile » de le faire.

Mais il existe des propriétés derby que vous pourriez définir pour l'implémenter vous-même.

Vérifier ces

derby.stream.error.field

derby.stream.error.file

derby.stream.error.method

derby.stream.error.logSeverityLevel

Je vous imagine écrire une classe qui sous-classes ou java.io.OutputStreamjava.io.Writer puis vous soit

  • implémente le comportement désiré ou
  • le font similaire à How do I limit the size of log file? + envelopper comme l'un des plus haut ou
  • vous Ripp-off obtenir quelques idées pour un RollingFileLoggerClass d'un autre projet (RollingFileAppender log4j, RollingFileWriter clapper, ...)
0

Une autre façon de gérer ce serait d'écrire votre propre code qui tourne, tronque, compresse, ou autrement pares sur le fichier derby.log entre-deux pistes de Derby.

Vous ne mentionnez pas la version de Derby que vous utilisez, mais je pensais que la sortie ligne par connexion avait été supprimée dans une version plus récente. Ou peut-être était-il seulement retiré de la sortie de Network Server plutôt que de la sortie de derby.log? Si c'est la sortie ligne par connexion qui gonfle votre fichier derby.log, vous pouvez envisager d'utiliser des techniques de regroupement de connexions afin de ne pas effectuer autant de connexions.En règle générale, vous pouvez vous connecter aux connexions pendant la durée de vie de votre application. vous n'avez pas à les créer et à les détruire très souvent. Si vous pensez qu'il y a un excès de sortie inutile dans derby.log, vous pouvez enregistrer une requête d'amélioration sur le traqueur de bogues de la communauté Derby avec des exemples, pour vous assurer que les futures versions de Derby n'enregistrent pas les données inutiles.

1

Vous pouvez créer une classe de journalisation personnalisée et la spécifier en utilisant derby.stream.error.field comme indiqué ci-dessus. La classe de journalisation ne doit pas être implémentée en tant que fichier - si vous limitez la taille des données de journalisation, vous pouvez facilement la conserver en mémoire. Le deuxième avantage est que lorsque vous rencontrez un problème, vous disposez d'une grande flexibilité quant à l'utilisation des données de journalisation. Peut-être compresser (ou crypter) les données et ouvrir automatiquement un ticket dans votre système d'aide (à titre d'exemple).

Voici un exemple d'une solution d'enregistrement personnalisé très simple:

import java.io.CharArrayWriter; 

public class CustomLog { 

    public static CharArrayWriter log = new CharArrayWriter(); 

    public static void dump() { 
     System.out.println(log.toString()); 
    } 
} 

Vous pouvez remplacer le CharArrayWriter avec une taille mémoire tampon limitée de quelque sorte, et ajouter une implémentation de décharge() pour faire ce que vous voudrez les données de journal résultantes.

Un programme court exemple qui démontre ce qui suit:

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