2010-10-05 6 views
38

Quel devrait être le temps système attendu pour la journalisation? J'ai essayé cet exemplePerformances NLog

private class Person 
{ 
    private static Logger logger = LogManager.GetCurrentClassLogger(); 
    public string Name { get; private set; } 
    public Person(string name) 
     { 
      Name = name; 
      logger.Info("New person created with name {0}", name); 
     } 
    } 

    List<Person> people = new List<Person>(); 
    for (int i = 0; i < MAXTEST; i++) 
    { 
     people.Add(new Person(i.ToString())); 
    } 

Avec des valeurs MAXTEST de 100,500,1000, 5000

Résultats dans MAXTEST, NOLOGGING, Connexion

100, 25ms, 186ms  
500, 33ms, 812ms  
1000, 33ms, 1554ms 
5000, 33ms, 7654ms 

Attribuées on log probablement jamais cette quantité excessive, mais c'est ce que l'on attend de la performance?

J'ai également essayé d'utiliser la asyncwrapper dans la configuration

<target name="asyncFile" xsi:type="AsyncWrapper"> 
    <target name="file" xsi:type="File" fileName="${basedir}/log.txt" /> 
</target> 
+0

Que fait votre enregistreur? –

Répondre

68

Il vous suffit d'ajouter l'attribut async à votre élément targets:

<targets async="true"> 
    <target name="asyncFile" xsi:type="AsyncWrapper"> 
     <target name="file" xsi:type="File" fileName="${basedir}/log.txt" /> 
    </target> 

au lieu de

<targets> 
    <target name="asyncFile" xsi:type="AsyncWrapper"> 
     <target name="file" xsi:type="File" fileName="${basedir}/log.txt" /> 
    </target> 

Je suppose que je ne suis pas allé aussi loin dans la documentation ;-)

wrapper cible asynchrone permet le code de l'enregistreur pour exécuter plus rapidement, par des messages qui font la queue et le traitement les dans un thread séparé. Vous devriez wrap cibles qui passent un non-trivial fois dans leur méthode Write() avec une cible asynchrone pour accélérer la journalisation . Parce que la journalisation asynchrone est un scénario assez commun, NLog prend en charge une notation abrégée pour envelopper toutes les cibles avec AsyncWrapper. Ajoutez simplement async = "true" à l'élément dans le fichier de configuration . ... vos objectifs vont ici ...

Gardez à l'esprit que l'utilisation de l'enregistrement async peut provoquer certains messages à être mis au rebut. C'est by design.

+4

Quelle différence cela a-t-il fait? Pouvez-vous publier les heures pour les comparer à votre premier ensemble de résultats? –

+24

il a fini par être ~ 44ms pour 5000 avec la journalisation. Cordialement – Eric

+1

merci pour l'info :) –

18

Pour toute personne qui a besoin de perdre cette surcharge et configure par le code, il ne semble pas que vous pouvez définir toutes les cibles asynchrones par défaut - vous devez définir par cible:

// Set up asynchronous database logging assuming dbTarget is your existing target 
AsyncTargetWrapper asyncWrapper = new AsyncTargetWrapper(dbTarget); 
config.AddTarget("async", asyncWrapper); 

// Define rules 
LoggingRule rule1 = new LoggingRule("*", LogLevel.Trace, asyncWrapper); 
config.LoggingRules.Add(rule1); 

Méfiez-vous que, par défaut, si vous mettez en file d'attente trop d'éléments de journal, il ne vous reste plus qu'à déposer des éléments - regardez OverflowAction = AsyncTargetWrapperOverflowAction.Block pour revenir au comportement synchrone.

+0

C'est ce que je cherchais et merci pour les heads up sur le OverflowAction. – YetAnotherDeveloper

+2

Méfiez-vous également de 'AsyncTargetWrapperOverflowAction.Block' si vous sauvegardez sur la journalisation, il est probable que votre système soit déjà stressé. Forcer la journalisation à bloquer entravera encore vos performances. Il vaut peut-être mieux supprimer les messages de journal que d'arrêter de traiter les demandes. –

+0

J'écris dans une base de données cible. Dans ma section '' 'targets''', j'ai marqué' '' 'async''' comme' '' 'true'''. Ai-je encore besoin d'écrire du code sur mon service Web pour que la journalisation asynchrone ou le framework s'en occupe? – Sameer

Questions connexes