2009-06-23 15 views
1

Y a-t-il un moyen que je peux attraper quand une méthode génère une écriture dans STDERR? J'essaye de pré-attacher quelques informations avec chaque écriture STDERR.Comment ajouter des informations à STDERR lorsqu'une méthode génère stderr?

disons que notre méthode est:

parser.thatGeneratesSTDERR(); 

ça va générer quelque chose comme

ligne 37:29 pas d'alternative viable au caractère 'a'

puis-je envelopper juste avec quelque chose qui attrape le stderr à écrire et pré-pend quelques informations donc ça va ressembler à ceci:

Fichier: mybadfile.txt - ligne 37:29 aucune alternative viable au caractère « a »

Je sais que je pourrais probablement creuser à travers le code réel qui fait l'écriture STDERR mais je ne veux vraiment pas fais ça - je préfère juste emballer du code autour de cette méthode à la place.

Je dois noter que cette méthode ne génère pas toujours STDERR - la raison pour laquelle j'essaie de les attraper, c'est qu'elle NE DEVRAIT PAS générer de STDERR - mais puisque cela est appelé sur plusieurs fichiers (plus de 40) Je ne sais jamais quel fichier génère le message d'erreur - il faut toujours trouver.

MISE À JOUR si Yeh, nous pouvons changer notre STDERR - Je viens oubliais que je dois remplacer mon println dans ma nouvelle STDERR ... voici le code correspondant:

public static String errfile = ""; 

static { 
    final PrintStream currentErr = System.err; 
    PrintStream newErr = new PrintStream(currentErr) 
    { 
    public void println(String string) { 
     print("File: " + errfile + " --"); 
     print(string); 
     super.println(); 
    } 
    }; 

    System.setErr(newErr); 
} 

puis pour chaque fichier que je teste tout ce que j'ai à faire est de changer errfile pour le nom de fichier et ma sortie sort attendue ...

merci beaucoup!

+0

Je ne suis pas sûr que ce soit une bonne pratique pour faire la finale PrintStream. - Il semble y avoir aussi un bug dans votre code, puisque je ne pouvais pas le faire fonctionner. –

Répondre

1

Je ne sais pas si cela fonctionnera, étant donné que System.setErr fonctionne.

Je voudrais créer une nouvelle classe qui étend le flux d'impression et écrase les méthodes pour ajouter votre commentaire. Ensuite, définissez le flux d'erreur sur votre nouvel impression. N'appelez pas System.err.printxxx à partir de cette nouvelle classe.

ex ...

class PrependPrintStream extends PrintStream { 

PrependPrintStream(PrintStream ps, String pre){...} 
... 
public void print(boolean b) { 
super.print(this.pre); 
super.print(b); 
} 
... 

J'ai regardé dans les PrintStream impl du soleil, et il semble que tous les délégués printxxx écrire (String) qui est privée au lieu de protéger. Je suppose que vous pouvez copier/coller le code.

EDIT ::

Une meilleure solution beaucoup est d'utiliser l'enregistrement au lieu de System.err. Cela vous permet d'activer et de désactiver vos instructions et vous permet de créer un gestionnaire d'erreurs personnalisé. Votre gestionnaire spécifique peut ajouter l'instruction que vous souhaitez à la chaîne avant d'imprimer dans System.err. Cela a également l'avantage que seules les instructions qui utilisent votre enregistreur spécifique auraient le texte préfixé et d'autres appels à System.err ne le feraient pas.

+0

yeh .. malheureusement je ne suis nulle part même envisager de fouiller dans le code qui se connecte à stderr .. Je veux juste qu'il soit surchargé et ça fonctionne maintenant - thnx – eyberg

1

Semble que vous voulez probablement regarder la programmation orientée aspect (AOP). En utilisant AOP, vous pouvez créer un proxy à l'analyseur que vous appelez. Avant que la méthode appelle thatGeneratesSTDERR() vous pouvez l'appeler appeler. À partir de votre appel, vous pouvez envoyer les informations que vous voulez.

Notez qu'il faut un peu de lecture pour comprendre le fonctionnement de l'AOP.

AspectJ - http://www.eclipse.org/aspectj/

AOP Alliance - http://sourceforge.net/projects/aopalliance