Rediriger System.out et System.err
J'ai un code existant (ou plutôt un peu de code nous n'avons pas le contrôle, mais nous devons l'utiliser) qui écrit beaucoup d'états du système./err.
Dans le même temps, nous sommes à l'aide d'un cadre qui utilise un système de journalisation personnalisé enroulé autour de log4j (encore une fois, nous n'avons malheureusement pas de contrôle).
Donc j'essaye de rediriger la sortie out et err flux personnalisé PrintStream qui va utiliser le système de journalisation. J'ai lu sur l' System.setLog()
et System.setErr()
méthodes, mais le problème est que j'aurais besoin d'écrire ma propre classe PrintStream qui s'enroule autour du système d'enregistrement en cours d'utilisation. Ce serait un mal de tête énorme.
Est-il un moyen simple pour y parvenir?
source d'informationauteur Giovanni Botta
Vous devez vous connecter pour publier un commentaire.
Juste pour ajouter à Rick et Mikhail solutions, qui sont vraiment la seule option dans ce scénario, j'ai voulu donner un exemple de comment créer un OutputStream peut potentiellement conduire à des pas si facile à détecter/corriger les problèmes. Voici un code:
Cet exemple montre les pièges de l'aide personnalisée au flux de sortie. Pour des raisons de simplicité de l'écriture() fonction utilise un enregistreur de log4j, mais cela peut être remplacé par n'importe quel custom installation de logging (comme dans mon cas). La fonction principale crée un PrintStream qui encapsule une CustomOutputStream et de définir le flux de sortie à point. Puis il exécute un Système..println (). Cette déclaration est redirigé vers la CustomOutputStream qui redirige vers un enregistreur. Malheureusement, depuis l'enregistreur de données est paresseux initialisé, il fera l'acquisition d'une copie de la console de flux de sortie (par le fichier de configuration log4j qui définit un ConsoleAppender) trop tard, c'est à dire, le flux de sortie le CustomOutputStream que nous venons de créer provoquant une redirection en boucle et donc un StackOverflowError au moment de l'exécution.
Maintenant, avec log4j c'est facile à corriger: il suffit d'initialiser la log4j cadre avant nous appelons Système.sera(), par exemple, en décommentant la première ligne de la fonction principale. Heureusement pour moi, la journalisation personnalisé de la facilité que j'ai à traiter est juste un wrapper autour de log4j et je sais qu'il va obtenir initialisé avant qu'il ne soit trop tard. Toutefois, dans le cas d'un totalement personnalisé, l'exploitation forestière installation qui utilise le Système./err sous le couvert, sauf si le code source est accessible, il est impossible de savoir si et où diriger les appels Système./err sont exécutées à la place des appels à un PrintStream de référence acquises au cours de l'initialisation. Le seul travail autour de je pense, pour ce cas particulier pourrait être de récupérer la pile d'appel et de détecter les boucles de redirection, depuis l'écriture de fonctions() ne devraient pas être récursive.
Vous ne devriez pas avoir à s'enrouler autour de la journalisation personnalisé que vous utilisez. Lorsque l'application initialise, il suffit de créer un LoggingOutputStream et jeu de stream sur le Système.sera() et du Système.setErr() avec le niveau d'enregistrement que vous désirez pour chaque. À partir de ce moment, de n'importe quel Système.une déclaration d'rencontrés dans l'application devrait aller directement au journal.
Prendre un coup d'oeil à l'constructeurs fournis par PrintStream. Vous pouvez passer à la journalisation OutputStream directement à PrintStream, puis de configurer le Système.et du Système.euh pour utiliser le PrintStream.
Edit:
Voici un simple cas de test:
La sortie est:
Il suffit d'écrire votre propre OutputStream puis l'envelopper dans la norme PrintStream. OutputStream a seulement 1 méthode qui doit être mis en œuvre et une autre qui vaut la peine d'être remplacé pour des raisons de performances.
Le seul truc, c'est de la tranche de flux d'octets en séparer les messages de journal, par exemple par '\n', mais ce n'est pas trop difficile à mettre en œuvre.