Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Reconfigure NLog LoggingConfiguration filters programmatically

Tags:

.net

logging

nlog

This is my first time using the NLog package for logging but so far its been great to work with.

In my scenario I need to initialize my NLog LoggingConfiguration settings programmatically rather than thru the more typical config file scenario. I've tested this and got it all working the way I want it by default. But how would I go about modifying my settings programmatically at run-time?

Probably the most common scenario here is one where the application's logging level is set to ERROR by default but a bug arises in a particular module that I want to switch the logging level to be much more verbose to track down the error.

I'd like to write a little web interface so I can easily tweak these settings at runtime but I want to make sure I am taking the right approach with this.

like image 382
snappymcsnap Avatar asked Apr 24 '12 17:04

snappymcsnap


People also ask

What can be configured with this NLog config file?

The following types can be configured: Targets - the destinations of a logevent, e.g. file, database, console. Layout - the layout e.g. json, csv, plain-text (default) Layout renderers - the template markers, e.g. ${message}, ${exception}, ${date}


2 Answers

I know I'm a year late but I just ran into similar scenario where I needed to provide dynamic control of the logger to users. Fortunately, this is relatively easy with nlog. Here I'm just enabling Trace level logging to an already created Logger but obviously you could do anything you wanted including adding new Targets/Rules or just completely replace the LoggerConfiguration with your programmatically generated one.

Basic ColoredConsole nlog.config:

<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">   <targets>     <target xsi:type="ColoredConsole" name="c"             layout="${longdate} ${uppercase:${level}} ${message}" />   </targets>   <rules>     <logger name="*" minlevel="Error" writeTo="c" />   </rules> </nlog> 

Simple console application:

public class Program  {   //Initialize default Logger from config file   private static readonly Logger m_log = LogManager.GetCurrentClassLogger();    public static Logger Log    {       get { return m_log; }   }    public static void Main(string[] args)    {     Log.Trace("You won't see me because config is at LogLevel.Error");     EnabledTraceForAllRules();     Log.Trace("You will see me now though!");      //Pause console window     Console.WriteLine("Press any key to continue...");     Console.ReadKey(true);      /* Prints:     2013-05-07 16:04:22.7050 TRACE You will see me now though!     Press any key to continue...     */   }    public static void EnabledTraceForAllRules()    {     foreach(var rule in LogManager.Configuration.LoggingRules)     {       rule.EnableLoggingForLevel(LogLevel.Trace);     }      //Call to update existing Loggers created with GetLogger() or      //GetCurrentClassLogger()     LogManager.ReconfigExistingLoggers();   } } 

If you need to alter the Logging configuration from outside the process and it has to be done programmatically, I would suggest going with WCF. You could expose a small WCF service from either your application or website that provides methods for reconfiguring nlog.

like image 60
Lee Hiles Avatar answered Sep 21 '22 00:09

Lee Hiles


I found "Configuration API" in NLog documentation (https://github.com/NLog/NLog/wiki/Configure-from-code), may be this help you. Look at NLog.Config namespace in NLog assembly too.

See also: https://github.com/NLog/NLog/wiki/Reinitialize-NLog-configuration

like image 36
Michał Zalewski Avatar answered Sep 21 '22 00:09

Michał Zalewski