Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

set the writeTo attribute of Logger in NLog during runtime

Tags:

c#

.net

nlog

My C# program has below NLog.config:

<?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"
      xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
      autoReload="true"
      throwExceptions="false"
      internalLogLevel="Off" internalLogFile="c:\temp\nlog-internal.log">
  <targets>
    <target xsi:type="File" name="file1" fileName="file1.log" layout="${message}" />
    <target xsi:type="File" name="file2" fileName="file2.log" layout="${message}" />
    <target xsi:type="File" name="file3" fileName="file3.log" layout="${message}" />
    <target xsi:type="File" name="file4" fileName="file4.log" layout="${message}" />
    <target xsi:type="File" name="file5" fileName="file5.log" layout="${message}" />
    <target xsi:type="File" name="file6" fileName="file6.log" layout="${message}" />
  </targets>
  <rules>
    <logger name="logger1" minlevel="Debug" writeTo="file1" />    
  </rules>
</nlog>

My program needs to log messages to different sets of log files according user config, for example, sometimes write to "file1,file2" and sometimes write to "file2,file3,file4".

So, is it possible to customize the "writeTo" attribute in "logger1" during runtime according to the user configures?

Thanks a lot.

like image 447
llook Avatar asked Dec 05 '25 16:12

llook


1 Answers

If you want to write to multiple files you can simply use a comma separated string for the "writeTo" attribute in Rule as "file1,file2,file3". There are 6 targets and rule says write to 3 files therefore file1,file2 and file 3 will be considered for logging.

But what you require is to do it at the run time. Below is the C# code.

        Console.Out.WriteLine("Logget started");
        Console.Out.WriteLine("");

        Logger logger = LogManager.GetCurrentClassLogger();
        var config = new LoggingConfiguration();


        //Define targets
        var fileTarget = new FileTarget();
        config.AddTarget("file7", fileTarget);

        var fileTarget2 = new FileTarget();
        config.AddTarget("file8", fileTarget);

        // Set target properties 
        fileTarget.FileName = "file7.log";
        fileTarget.Layout = "${message}";
        fileTarget2.FileName = "file8.log";
        fileTarget2.Layout = "${message}";

        // Define rules
        var rule1 = new LoggingRule("*", LogLevel.Debug, fileTarget);
        config.LoggingRules.Add(rule1);

        var rule2 = new LoggingRule("*", LogLevel.Debug, fileTarget2);
        config.LoggingRules.Add(rule2);
        LogManager.Configuration = config;

        logger.Trace("trace log message");
        logger.Debug("debug log message");
        logger.Info("info log message");
        logger.Warn("warn log message");
        logger.Error("error log message");
        logger.Fatal("fatal log message");

        logger.Log(LogLevel.Info, "Sample informational message");
        Console.ReadKey();
    }

As the code comments explained it defines new targets and rules. NLog.config will be redefined at the runtime.

Below is my NLog.config targets and rules

  <targets>
    <target xsi:type="File" name="file1" fileName="file1.log" layout="${message}" />
    <target xsi:type="File" name="file2" fileName="file2.log" layout="${message}" />
    <target xsi:type="File" name="file3" fileName="file3.log" layout="${message}" />
    <target xsi:type="File" name="file4" fileName="file4.log" layout="${message}" />
    <target xsi:type="File" name="file5" fileName="file5.log" layout="${message}" />
    <target xsi:type="File" name="file6" fileName="file6.log" layout="${message}" />
  </targets>

  <rules>
    <logger name="*" minlevel="Debug" writeTo="file1,file2,file3" />
  </rules>

These targets and rules will be redefined at the run time by our C# code and only file7.log and file8.log will be considered for logging.

like image 167
Buddhi Madarasinghe Avatar answered Dec 08 '25 08:12

Buddhi Madarasinghe



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!