Les meilleures pratiques pour l'enregistrement de Java à partir de plusieurs threads?

Je veux avoir un journal de diagnostic qui est produite par plusieurs tâches de gestion des données. Ces tâches peuvent être dans plusieurs threads. Chaque tâche doit écrire un élément (avec éventuellement des sous-éléments) pour le journal; entrer et sortir rapidement. Si c'était une seule tâche situation, je voudrais utiliser XMLStreamWriter comme il semble être le meilleur match pour des raisons de simplicité, fonctionnalité sans avoir à tenir un ballon document XML en mémoire.

Mais ce n'est pas une simple tâche de la situation, et je ne suis pas sûr de savoir comment mieux faire sûr que c'est "thread-safe", où "thread-safe" dans cette application signifie que chaque journal élément doit être écrit dans le journal correctement et en série (l'un après l'autre et non entrelacé en quelque sorte).

Des suggestions? J'ai une vague intuition que le chemin à parcourir est d'utiliser une file d'attente de journal éléments (avec chacune d'elles pouvant être produit rapidement: mon application est en train de faire le travail réel que les performances sensibles), et avoir un thread qui gère le journal éléments et les envoie à un fichier de journalisation de ne pas interrompre les producteurs.

La journalisation n'est pas nécessairement le XML, mais je ne veux pas qu'il soit structuré et lisible à la machine.

edit: j'ai mis "thread-safe" entre guillemets. Log4j semble être le choix évident (nouveau pour moi, mais les vieux de la communauté), pourquoi réinventer la roue...

  • J'ai le même problème, mais n'a pas besoin d'afficher le journal en temps réel (seulement après que tous les threads d'exécution). Ma solution est d'ajouter un système de temps au début de chaque message, et de les trier sur le temps.
  • Temps de système n'est pas fiable, après tout -, certaines opérations sont si proches qu'ils ont le même temps en millisecondes. Le tri peut mener à un changement de l'ordre. Donc, une autre chose que j'ai essayé était à l'aide de Colllections.synchronizedList() pour envelopper une liste de tableaux de Chaînes de messages. L'ajout de la chaîne d'horodatage montre que même de cette manière n'est pas parfait. Certains messages dans mon cas, ont été de l'ordre (par un ou deux millisecondes), mais cela est probablement dû à la mise en attente du délai pour l'appel add() de la synchronisation de la liste.
InformationsquelleAutor Jason S | 2009-02-19