2009-08-06 6 views
5

J'ai une application PSVM héritée dont je voudrais rediriger la sortie de journalisation vers des fichiers uniques par exécution. Donc, si je l'invoque à 10h00, faites-le rediriger vers {thread-id} -10: 00.log; et un autre thread d'exécution peut commencer une exécution à 10:01, et sa sortie ira à {thread-id} -10: 01.log. Je comprends que ce n'est pas élégant.créer et détruire dynamiquement des appenders de journalisation

Mes questions sont les suivantes:

  • est-ce possible?
  • Est-ce que quelqu'un a une idée de la façon d'aborder?
  • est-il possible de libérer/détruire un appender quand il n'est plus nécessaire?

Merci!

Répondre

4

Je commencerai par FileAppender et je dériverai de cela pour créer le vôtre. Il suffit de modifier votre version pour obtenir l'ID de thread en cours et ajouter un ID de thread/timestamp approprié au fichier avant la création. Vous maintenez (disons) une carte de (buffered) FileWriters tapé sur l'ID de thread.

Écrire des appenders est assez trivial - here's a Javaworld guide sur la façon de le faire.

Dans ce qui précède, est-il probable que votre programme démarrera deux fois en une minute? Souhaitez-vous ajouter un ID de processus ou similaire pour conserver l'unicité?

+0

merci pour la réponse rapide! ce n'est pas le cas pour un thread de le faire plus d'une fois. Mais, dans tous les cas, ce n'est qu'un exemple à des fins de discussion. le nom serait limité pour l'unicité. Des idées sur la façon de libérer l'auteur de fichier? –

+0

+1 Bon lien tutoriel – WolfmanDragon

+0

Re. libération. Je pense que vous devriez vider l'écrivain après chaque message de journal (pour assurer l'écriture sur le disque), et ne vous inquiétez pas de le libérer. Laissez la JVM prendre tout. Sauf si vous écrivez beaucoup de discussions et avez beaucoup de fichiers ouverts. Ensuite, vous voudrez peut-être simplement laisser les 'n' écrivains ouverts à la fois et en fermer quand ils ne sont pas connectés. Cela peut entraîner un peu de thrash, cependant :-) –

1

Ce n'est pas possible, du moins pas facile à faire dans log4j. Cependant, si vous regardez SiftingAppender expédition avec le logback (le successeur de log4j), il est conçu pour manipuler la création des appenders sur des critères d'exécution aussi bien que leur suppression quand plus besoin.

Si votre application doit créer un seul fichier journal par lancement d'application, vous pouvez simplement nommer votre fichier journal en fonction d'un horodatage. Crier sur la liste de diffusion de l'utilisateur de logback si vous avez besoin d'aide supplémentaire.

+0

Je suis curieux d'avoir plus d'informations sur les raisons pour lesquelles cela n'est pas possible. Cela semble être relativement simple. J'ai suivi avec une publication à l'utilisateur de logback. J'espère que vous pouvez le trouver là et élaborer. Merci! –

+0

Cela dépend si vous souhaitez configurer l'appender personnalisé par programme ou via un fichier de configuration. Il y a aussi la question de la gestion des fichiers journaux (un par thread) dans une application multithread. La question initiale n'était pas très précise concernant ces deux questions. – Ceki

Questions connexes