2016-03-08 2 views
1

J'ai fait un certain système et maintenant je veux garder une trace de quelques statistiques à ce sujet pendant qu'il fonctionne. J'ai décidé d'utiliser le formulaire TSV pour écrire ces statistiques. Tout en recherchant la meilleure lib existante (si je pouvais, je voudrais éviter de l'implémenter de mon propre chef), j'ai trouvé que FileHandler lib est presque exactement ce que je veux. Puisque les statistiques seront rassemblées chaque seconde, je suppose que j'ai besoin d'une sorte de rotation des fichiers journaux à la limite de taille, ce que File handler offre, MAIS ce qui me manque encore et ce qui est important pour moi dans tous les fichiers journaux. Donc, j'aimerais faire tourner la première ligne personnalisée dans tous les fichiers journaux (contenant la signification des colonnes au format TSV) et le reste des lignes serait de vrais chiffres statistiques.Java tournant journaux avec en-tête constante

Est-ce que quelqu'un a une idée de la façon d'accomplir cela? Je n'ai pas pu trouver de bibliothèque adaptée à moi ou à d'autres questions similaires.

Aussi, si vous connaissez d'autres lib qui pourraient accomplir ceci, je serais disposé à abandonner FileHandler en faveur de celui-là.

Merci d'avance!

EDIT: Donc, basé sur la réponse fournie par @jmehrens j'ai fait le code suivant et ça fonctionne comme le charme! Voici une classe formatter personnalisée:

class CustomFormatter extends Formatter { 
    @Override 
    public String format(LogRecord record) { 
     return record.getMessage() + "\n"; 
    } 
    @Override 
    public String getHead(Handler h) { 
     return "header\n"; 
    } 
} 

est le code de travail ici:

String path = "/tmp/temp2"; 
FileHandler fileHandler = new FileHandler(path, 300, 5); 
fileHandler.setFormatter(new CustomFormatter()); 

Logger logger = Logger.getLogger("sam.logging"); 
logger.addHandler(fileHandler); 

for(int i = 0; i < 10000; i++) 
    logger.log(new LogRecord(Level.INFO, i+" aaaaaaaaaaaaaa.")); 

Et voici par exemple les sorties:

[/tmp] -> cat temp2.3 
header 
9957 aaaaaaaaaaaaaa. 
9958 aaaaaaaaaaaaaa. 
9959 aaaaaaaaaaaaaa. 
9960 aaaaaaaaaaaaaa. 


[/tmp] -> cat temp2.1 
header 
9985 aaaaaaaaaaaaaa. 
9986 aaaaaaaaaaaaaa. 
9987 aaaaaaaaaaaaaa. 
9988 aaaaaaaaaaaaaa. 
9989 aaaaaaaaaaaaaa. 
+0

Peut-être une préférence personnelle, mais je n'aurais pas cherché une bibliothèque pour faire une telle chose. De votre explication des exigences, il semble que ce type d'application serait assez simple pour écrire dans un délai raisonnable. –

+0

Peut-être que vous avez raison, si aucune réponse élégante ne se produit, je vais le faire. Mais il est toujours préférable de réutiliser le code fini si possible :) – crollywood

Répondre

2

Vous devez créer un custom java.util.Formatter et install it sur votre FileHandler. La méthode Formatter.getHead est utilisée pour écrire vos en-têtes et est appelée chaque fois que le FileHandler est ouvert ou tourne. La méthode Formatter.format serait utilisée dans ce cas pour générer une ligne de données par LogRecord donné. Vous devez donc générer (ou réutiliser) un LogRecord toutes les secondes et publish vers le FileHandler.

+0

Merci pour votre aide! J'ai ajouté la solution finale à la question; une note tho, il n'y avait pas besoin de réutiliser même LogRecord – crollywood