NLogger дает противоречивые данные после каждого запуска - PullRequest
0 голосов
/ 17 февраля 2020

Я использовал NLog для регистрации входа и выхода из функций в моем коде. Но при разных запусках одного и того же приложения я получаю разные журналы. Это многопоточное приложение. И я использую asyn c для регистрации информации.

Ниже моя конфигурация:

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 

  <targets>
    <target name="asynclogger" xsi:type="AsyncWrapper" overflowAction="Grow" queueLimit="100000" batchSize="5000" timeToSleepBetweenBatches="1">
      <target name="logfile" xsi:type="File" fileName="D:\IALogs\${processname}_${processid}_${threadid}.ialog"  layout ="${longdate} ${processname} ${processid} ${threadid} ${mdlc:item=threadid} ${level} ${message}"/>
    </target>
  </targets>

  <rules>
    <logger name="*" minlevel="Info" writeTo="asynclogger" />
  </rules>
</nlog>

Ниже приведен код регистратора.

class Program
    {
        private static readonly NLog.Logger nLogger = NLog.LogManager.GetCurrentClassLogger();
        static void Main(string[] args)
        {
            Thread th1 = new Thread(() => print(5000000));
            th1.Start();

            Thread th2 = new Thread(() => print(5000000));

            th2.Start();

            th1.Join();
            th2.Join();

            print(10000);

            Console.WriteLine("Done!!!!");
            Console.ReadLine();
        }

        private static void print(int noOfItems)
        {
            for (int i = 1; i <= noOfItems; i++)
            {
                nLogger.Info("Printing i =" + i);
            }
        }
    } 

С Console.Readline () журналы полностью записываются, если нет Console.Readline (), журналы каждый раз отличаются, а также третий вызов метода Print из основного потока ничего не регистрирует, если нет Console.Readline (). Если Console.Readline () присутствует, то 3-й оператор печати записывает всю информацию

1 Ответ

1 голос
/ 18 февраля 2020

Полагаю, ваше предложение «Я получаю разные журналы» следует перевести на «Я пропускаю некоторые журналы».

При включении асинхронных c -операций для целей NLog, важно, чтобы грипп sh, потому что запись происходит в фоновых потоках. Необходимо дождаться их, прежде чем выходить из приложения:

NLog.LogManager.Flush()

См. Также: NLog Tutorial - Помните о гриппе sh

...