Question

J'ai une application en couches en Java qui a une couche d'accès aux données multi-thread qui est appelée à partir de différents points. Un seul appel à cette couche est susceptible de générer plusieurs threads pour paralléliser les demandes adressées à la base de données.

Ce que je recherche, c’est un outil de journalisation qui me permettrait de définir des "activités". qui sont composés par divers fils. Par conséquent, la même méthode dans la couche d'accès aux données devrait consigner différentes sorties en fonction de l'appelant. La possibilité de regrouper différents produits pour résumer le coût total d’une opération est également importante.

Bien que l'application soit en Java, le langage n'est pas une restriction. ce dont j'ai besoin, ce sont les directives de conception afin de pouvoir finalement le mettre en œuvre. Nous utilisons actuellement log4j, mais nous ne pouvons pas obtenir ce comportement.

Était-ce utile?

La solution

Vous devriez également consulter le imbriqué. contexte de diagnostic caractéristique de log4j. Transférer différents contextes dans le consignateur pour différents appelants pourrait faire l'affaire pour vous.

Autres conseils

Vous devriez être en mesure de faire passer un enregistreur. Vous devez donc créer un enregistreur basé sur des paramètres "communs". pour les données de la tâche - nom d'utilisateur, etc., puis transmettez cet enregistreur en tant que paramètre à toutes les méthodes dont vous avez besoin. De cette façon, vous pourrez définir différents filtres et / ou règles dans votre fichier de configuration log4j. Ou pour supprimer le fichier de sortie en fonction du nom de l'enregistreur.

EDIT: vérifiez également les classes MDC et NDC dans log4j. Vous pouvez y ajouter des données de contexte.

Dans log4j, vous pouvez enregistrer le nom du fil avec le "% t " modèle. Voir la disposition de modèle log4j .

Dans l'une de mes applications (Web), j'utilise un enregistreur ThreadLocal qui capture les informations de journalisation dans un StringBuilder. L'objet enregistreur est initialisé dans la méthode de service HttpServlet #, si un paramètre de trace est défini (s'il n'est pas défini, il existe un enregistreur nul très rapide). La sortie résultante est soit sauvegardée sous forme de commentaire HTML dans la page demandeuse, soit écrite dans un fichier journal en un segment.

En Java5 (et versions ultérieures), vous pouvez appeler

StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();

Inspectez la trace de la pile à la profondeur souhaitée et connectez-vous en conséquence.

En Java 1.4, vous pouvez obtenir les mêmes informations avec

StackTraceElement[] stackTrace = new Exception().getStackTrace();

Je pense que vous souhaitez associer des objets de journalisation à des threads. Une variable ThreadLocal contenant une instance de journal log4j pour chaque thread pourrait aider:

http://java.sun.com /javase/6/docs/api/java/lang/ThreadLocal.html

Vous devrez passer une structure à la couche d'accès aux données qui identifie "l'activité" actuelle. Vous avez peut-être déjà une classe "Activité" qui a du sens, vous pouvez utiliser une instance de journal comme suggestion de Sunny ou vous pouvez utiliser une troisième structure pour garder une trace du contexte de l'activité.

Dans tous les cas, depuis votre "activité" est traité sur plusieurs threads; vous ne pouvez pas utiliser thread-local-storage pour garder une trace de "l'activité" actuelle, comme le suggèrent la plupart des autres réponses actuelles. Vous devrez le faire circuler explicitement.

Je suggérerais de créer une petite façade au-dessus de log4j qui étend l'interface avec des méthodes telles que

void debug(Activity activity, String message);

et en y passant le contexte d'activité depuis la couche d'accès aux données.

Vous devrez apporter quelques modifications à la couche d'accès aux données pour vous permettre de lui transmettre l'activité en cours, mais la meilleure façon de le faire dépend fortement de l'interface actuelle. Si vous utilisez le modèle Workspace, vous devrez peut-être simplement ajouter une méthode setActivity () sur la classe Workspace, mais un autre modèle d'interface nécessitera peut-être l'ajout d'un paramètre Activity à toutes les méthodes.

Si, pour une raison quelconque, vous ne pouvez ou ne souhaitez pas modifier la couche d'accès aux données, vous pouvez naturellement stocker le contexte de l'activité dans le stockage local du thread avant d'appeler la couche d'accès aux données et de la récupérer juste avant de générer les sous-threads. ou enchâssant les travaux dans la couche d'accès aux données. C’est une solution viable, mais c’est un peu dangereux de transmettre des informations de cette façon.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top