Comment se connecter à plusieurs threads dans les différents fichiers de log?
J'ai une classe JAVA qui commence à diverses discussions qui ont des Identifiants uniques.
Chaque thread doit consigner dans un journal unique fichier, nommé d'après l'ID.journal.
Parce que je seulement obtenir l'ID unique au moment de l'exécution, j'ai configurer Log4J par programmation:
//Get the jobID
myJobID = aJobID;
//Initialize the logger
myLogger = Logger.getLogger(myJobID);
FileAppender myFileAppender;
try
{
myFileAppender = new FileAppender(new SimpleLayout(), myJobID + ".log", false);
BasicConfigurator.resetConfiguration();
BasicConfigurator.configure(myFileAppender);
} catch (IOException e1) {
//TODO Auto-generated catch block
e1.printStackTrace();
}
Maintenant cela fonctionne bien si je commence emplois de façon séquentielle - mais quand je commence à 2 fils (de la même classe) en même temps, les deux journaux sont créés, mais les journaux sont mélangés: Le deuxième fil des journaux dans le premier comme le deuxième journal.
Comment pourrais-je faire en sorte que chaque instance est-elle unique ?
J'ai déjà essayé de donner un nom unique à chaque enregistreur exemple, mais il n'a pas changer quoi que ce soit.
- Est-il vraiment une bonne raison pour laquelle vous voulez faire cette distinction dans le code java? La pratique générale est de tenir un journal dans un fichier et exécuter un peu de post-traitement pour extraire, de les regrouper? Également reportez-vous à logging.apache.org/log4j/1.2/faq.html#a3.1
- Double de Comment puis-je configurer propriétés log4j de sorte que chaque thread sorties de son propre fichier de log?
Vous devez vous connecter pour publier un commentaire.
Logback a un appender appelé SiftingAppender qui offre une très belle solution pour le type de problèmes que vous décrivez. Un SiftingAppender peut être utilisé pour séparer (ou une eipd) enregistrement selon l'une quelconque exécution attribut, y compris l'id de thread.
LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory(); context.reset();
Et je suis en train de faire cela avant la création de chaque Appenders et d'utiliser ce contexte pour définir ces appenders. Mais alors que l'un Appender fonctionne. Mais si j'ai un communcontext
pour les deux, puis les deux fonctionneront. Aucune idée de pourquoi ça fait ça ?Pour log4j v2 vous pouvez utiliser RoutingAppender dynamique d'acheminer les messages. Vous pouvez mettre la valeur de la clé 'threadId" dans le ThreadContext carte et ensuite utiliser cet id, comme une partie du nom de fichier. Il y a un exemple que j'ai facilement appliquée pour le même but que le vôtre. Voir http://logging.apache.org/log4j/2.x/faq.html#separate_log_files
Être conscient de quand à mettre des valeurs dans ThradContext carte: "Un enfant thread hérite automatiquement une copie de la mappé contexte diagnostique de son parent." Donc, si vous avez mis une valeur pour la clé 'threadId" dans le thread parent et finit par créer plusieurs threads, puis tous les threads enfants hériteront de la valeur de 'threadId de valeur. Je n'étais pas en mesure de simplement remplacer cette valeur par l'utilisation de put() une fois de plus - vous devez utiliser ThreadContext.clear() ou explicitement remove() la valeur de contexte de thread carte.
Voici mon travail log4j.xml:
@havexz s 'approche est assez bonne: écrit tout sur le même fichier journal et utilisant des contextes de diagnostic.
Si votre préoccupation est de savoir plusieurs machines virtuelles écrit à la même FileAppender, alors je vous suggère deux choses:
Voici l'extrait du code de Routage à partir d'un travail log4j.xml fichier.
La touche 'logFileName" peut être ajouté au contexte de thread carte dans la méthode run() de la classe Runnable comme suit,
En outre, la bonne log4j les paquets doivent être importées, comme illustré ci-dessous.
Veuillez noter que les importations suivantes ne fonctionneront pas. LogManager et l'Enregistreur de données doit également provenir de org.apache.la journalisation.log4j.
Que sur l'ajout d'une instance statique variable de compteur pour votre classe. Ensuite, vous avez besoin d'une méthode synchronisée qui augmente le compteur pour chaque objet créé et créer le nom du fichier journal à partir de cette valeur. Quelque chose comme ceci:
Aussi loin que je peux dire ThreadLocal API a été conçu pour faire ce que vous décrivez.
Code comme ci-dessous établirait par thread enregistreurs de chaque utilisation propre (par thread) FileAppender: