سؤال

ما الذي يجب أن يكون النفقات العامة المتوقعة للتسجيل؟ لقد جربت هذا المثال

 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()));
  }

مع قيم Maxtest قدرها 100،500،1000 ، 5000

ينتج عنه Maxtest ، Nologging ، التسجيل

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

من المسلم به أنه ربما لن يقوم أبدًا بتسجيل هذا المبلغ المفرط ، لكن هذا هو الأداء الذي يتوقعه المرء؟

لقد حاولت أيضًا استخدام Asyncwrapper في التكوين

 <target name="asyncFile" xsi:type="AsyncWrapper">
   <target name="file" xsi:type="File" fileName="${basedir}/log.txt" />
 </target>
هل كانت مفيدة؟

المحلول

تحتاج فقط إلى إضافة ملف async تنسب إلى الخاص بك targets عنصر:

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

بدلاً من

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

أعتقد أنني لم أذهب إلى هذا الوثائق ؛-)

يتيح غلاف الهدف غير المتزامن لرمز المسجل أن يتم تنفيذه بسرعة أكبر ، من خلال طوابير الرسائل ومعالجتها في مؤشر ترابط منفصل. يجب عليك لف الأهداف التي تنفق قدراً غير مستمد من الوقت في طريقة الكتابة () مع الهدف غير المتزامن لتسريع التسجيل. نظرًا لأن التسجيل غير المتزامن هو سيناريو شائع تمامًا ، فإن NLOG يدعم تدوينًا مختصرًا لالتفاف جميع الأهداف باستخدام Asyncwrapper. فقط أضف async = "true" إلى العنصر في ملف التكوين. ... أهدافك تذهب هنا ...

ضع في اعتبارك أن استخدام التسجيل ASYNC يمكن أن يتسبب في تجاهل رسائل معينة. هذا هو من تصمبم.


المرجع: https://github.com/nlog/nlog/wiki/asyncwrapper-target#async-attribute-and-asyncwrapper

سمة ASYNC و ASYNCWRAPPER

لا تجمع بين سمة Async و Asyncwrapper. هذا سوف يبطئ المعالجة فقط وسيتصرف بشكل لا يمكن الاعتماد عليه.

ستواجه السمة ASYNC بشكل افتراضي

سمة Async هي اختصار لـ:

xsi:type="AsyncWrapper overflowAction="Discard" queueLimit="10000" batchSize="100" timeToSleepBetweenBatches="50"

نصائح أخرى

بالنسبة لأي شخص يحتاج إلى فقدان هذا النفقات العامة ويتم تكوينه حسب الرمز ، لا يبدو أنه يمكنك تعيين جميع الأهداف على غير متزامن افتراضيًا - يجب عليك تحديده لكل هدف:

// 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);

كن حذرًا من ذلك افتراضيًا إذا قمت بإعداد عدد كبير جدًا OverflowAction = AsyncTargetWrapperOverflowAction.Block للعودة إلى السلوك المتزامن.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top