est-il possible d'intercepter des appels vers system.out.print * et system.err.print * (en Java) et prépendez-les un timbre de temps? Ne vous inquiétez pas, nous utilisons les cadres forestières habituels, mais parfois, certains sys.out fuites et ce serait bien de savoir quand cela se produira afin que nous puissions l'attacher aux fichiers journaux appropriés. P>
3 Réponses :
Vous pouvez le faire.
réaffecte le flux de sortie "standard". Premièrement, s'il existe un gestionnaire de sécurité, sa méthode de checkpermission est appelée à une autorisation de RunTimePermission ("Sétio") pour voir s'il est correct de réaffecter le flux de sortie "standard". P> blockQuote>
xxx pré> p>
Vous devrez remplacer toutes les implémentations d'impression () et d'impression () d'impression () dans PrintStream et de reformater la sortie comme vous le voyez.
@maclema exactement ... j'ai oublié de commenter ici.
Cela devrait être possible. p>
System.out est un PrintStream . P>
Vous pouvez étendre le flux pour ajouter la date et l'heure aux méthodes d'impression et utilisez system.setout () pour définir le flux de manière appropriée. p>
Après coup de réflexion Si vous souhaitez identifier où viennent les relevés d'impression, vous pouvez utiliser:
thread.CurrentThread (). GetStackTrace () [1] .getClassName (); code> p>
Vous pouvez utiliser Programmation orientée de l'aspect pour y parvenir - en particulier le aspectj outil.
L'idée est que vous définissez points de pointe em> qui correspondent aux points de votre code puis écrivez conseils em> qui est exécuté à ces points. Le compilateur Aspectj sera alors weave em> dans vos conseils à ces points. P> Donc, pour votre problème, vous définissez d'abord un point de pointe qui a été capté chaque fois que vous avez appelé un Vous écrivez alors des conseils qui iraient autour de cet appel pour remplacer l'argument si le Imprimer méthode sur un imprimanteam code> p> imprimée code> est system.out code> (vous pouvez faire la même chose avec system.err code>. p> void around(PrintStream ps, String s) : callPrint(ps,s) {
if(ps.equals(System.out)){
String new_string = ...
proceed(new_string);
}
else proceed(s);
}
Vous pouvez utiliser des aspects pour cela. Découvrez AspectJ.