2009-10-23 6 views
5

Mon application utilise plusieurs threads avec des noms bien définis (c'est-à-dire, pas un pool de threads avec des threads «anonymes»). À l'heure actuelle, tous ces threads envoient leurs messages de journalisation à un fichier - et bien que l'ID de thread fasse partie de la ligne de journal, cela rend très difficile l'analyse du comportement de l'application. Ainsi, je veux que chaque thread se connecte dans son propre fichier journal.Comment se connecter à des fichiers séparés par thread avec Log4Net?

Il semble que Log4Net n'offre aucune option intégrée pour choisir un appender basé sur le thread. Est-ce que quelqu'un connaît une solution à cela? Notez que je préférerais de préférence ne pas passer à une autre bibliothèque de journalisation.

+0

Qu'avez-vous fini par faire avec ceci? J'ai la même exigence à l'exception du nombre de threads et les noms des threads ne sont pas connus ou définis avant l'exécution. –

+0

Je n'ai pas résolu le problème parce que j'ai eu un nouveau travail. Quoi qu'il en soit, la solution de Peter aurait fonctionné pour moi, et j'imagine que créer la configuration de l'appender via l'API fonctionne pour vous. –

+0

Si quelqu'un d'autre a besoin d'une solution simple à ce voir la réponse ici http://stackoverflow.com/questions/6956064/logging-to-an-individual-log-file-for-each-individual-thread –

Répondre

3

Le moyen de "choisir" les loggers est de filtrer. Dans votre scénario, vous aurez besoin d'un moyen de configurer un certain nombre d'appenders, chacun représentant un thread bien défini, et des filtres dans chaque appender traversant les messages uniquement à partir de leur thread respectif.

Puisque l'ID de thread n'est pas déterministe, vous aurez besoin de quelque chose d'autre pour faire votre filtrage. Je suppose que vous contrôlez la création de ces threads vous-même et suggère que chaque thread enregistre un identifiant dans une propriété dans the ThreadContext. Ensuite, vous pouvez ensuite utiliser the PropertyFilter pour filtrer les messages en fonction des identificateurs.

Voici un exemple de configuration de configuration qui a deux appenders, chacun ajoutant des messages où la valeur actuelle de la propriété threadId correspond à un identifiant donné.

<appender name="x"> 
    <filter type="log4net.Filter.Property"> 
     <key value="threadId" /> 
     <stringToMatch value="threadX" /> 
    </filter> 
    <filter type="log4net.Filter.DenyAllFilter" /> 
    ... 
</appender> 

<appender name="y"> 
    <filter type="log4net.Filter.Property"> 
     <key value="threadId" /> 
     <stringToMatch value="threadY" /> 
    </filter> 
    <filter type="log4net.Filter.DenyAllFilter" /> 
    ... 
</appender> 

<root> 
    <appender-ref name="x" /> 
    <appender-ref name="y" /> 
</root> 
+0

Comment feriez-vous ceci si le nombre de threads et leurs noms n'étaient pas connus jusqu'à l'exécution? –

+2

@goku_da_master vous pouvez créer la configuration de l'appender en code, ce qui pourrait être une approche, du moins si vous contrôlez la création de thread. Sinon, je dirais que la meilleure option est de se connecter à une source commune (par exemple une base de données) qui peut être plus facilement interrogée en fonction de l'identifiant du thread. –

Questions connexes