1

I am pasting my code snippet using log4Net,

-Just in brief:

I am creating a new rolling appender and a memory appender and attaching them to a logger in logger repository for every new thread.

Whatever I write in rolling appender, automatically got in memory appender of specific thread.

I want to achieve same using NLog

I tried NLog but I got two behaviour

  1. all file targets writing into same memory target, not thread specific target.
  2. After setting new appender everything is getting written in new appender.

    class Program {
    private static Random rnd = new Random();
    private static object sync = new object();
    
    static void Main(string[] args)
    {
        List<Task> tasks = new List<Task>();
        // Execute the task 10 times.
        for (int ctr = 1; ctr <= 5; ctr++)
        {
            tasks.Add(Task.Factory.StartNew(FirstWorldTask));
            Thread.Sleep(10);
        }
        Task.WaitAll(tasks.ToArray());
    }
    
    private static void FirstWorldTask()
    {
        string loggerName = "Logger";
        string randomName = rnd.Next().ToString();
    
        lock (sync)
        {
            loggerName += randomName;
            Console.WriteLine(loggerName);
        }
    
        log4net.Layout.PatternLayout patternLayout = new log4net.Layout.PatternLayout("%message%newline");
        patternLayout.ActivateOptions();
    
        RollingFileAppender rollingFileAppender = new RollingFileAppender();
        rollingFileAppender.AppendToFile = false;
        rollingFileAppender.RollingStyle = RollingFileAppender.RollingMode.Size;
        rollingFileAppender.MaxSizeRollBackups = 0;
        rollingFileAppender.MaximumFileSize = "20MB";
        rollingFileAppender.Layout = patternLayout;
        rollingFileAppender.File = "./" + randomName + "/logfile.txt";
        //appender.File = GlobalSettings.FOLDER_NAME + "logfile" + currentCount.ToString() + ".txt";
        rollingFileAppender.ActivateOptions();
    
        MemoryAppender memoryAppender = new MemoryAppender();
        memoryAppender.AddFilter(new log4net.Filter.LevelRangeFilter() { LevelMin = log4net.Core.Level.Info, LevelMax = log4net.Core.Level.Fatal });
    
        log4net.Repository.Hierarchy.Hierarchy hierarchy = (log4net.Repository.Hierarchy.Hierarchy)log4net.LogManager.GetRepository();
        log4net.Repository.Hierarchy.Logger logger = hierarchy.GetLogger(loggerName) as log4net.Repository.Hierarchy.Logger;
    
        logger.AddAppender(rollingFileAppender);
        logger.AddAppender(memoryAppender);
        hierarchy.Configured = true;
    
        var m_log = log4net.LogManager.GetLogger(loggerName);
    
    
        for (int i = 0; i < 5; i++)
        {
            m_log.Info(i + " " + randomName);
            Thread.Sleep(10);
        }
    
        StringBuilder stringBuilder = new StringBuilder();
        foreach (var loggingEvent in memoryAppender.GetEvents())
        {
            stringBuilder.AppendLine(loggingEvent.MessageObject.ToString());
        }
    
        memoryAppender.Clear();
        Console.WriteLine(stringBuilder.ToString());
    }
    

    }

NLog Config:

    <target name="LogFile"
            xsi:type="File"
            fileName="${mdc:item=LogsDirectory}/logfile.txt"
            layout="${message}"
            maxArchiveFiles="10"
            archiveAboveSize="20000000"
            archiveNumbering="Sequence"
            archiveFileName="${mdc:item=LogsDirectory}/logfile.{#}.txt"/>
    <target name="Memory" xsi:type="Memory" layout="${message}"/>

  <rules>
    <logger name="LogFile" minlevel="Debug" writeTo="LogFile" />
    <logger name="LogFile" minlevel="Info" writeTo="Memory" />
</rules>

NLog Code for FirstWorldTask

    private static void FirstWorldTask()
    {
        var folderName = rnd.Next();
        NLog.MappedDiagnosticsContext.Set("LogsDirectory", folderName);
        ILog logger = LogManager.GetLogger("LogFile");
        var memoryTarget = (MemoryTarget)NLog.LogManager.Configuration.FindTargetByName("Memory");
        memoryTarget.Logs.Clear();
        for (int i = 0; i < 5; i++)
        {
            logger.Info(i + " " + folderName);
            Thread.Sleep(10);
        }
        int j = 0;

        while (j < memoryTarget.Logs.Count)
        {
            Console.WriteLine(memoryTarget.Logs[j] + "\t" + folderName);
            memoryTarget.Logs.RemoveAt(j);

            j++;
        }
    }
vipin
  • 21
  • 4

0 Answers0