A NuGet-package is available here.
NlogViewer is a ui control library to visualize NLog logs in your personal application. It is mainly based on Sentinel and its controls.
supported Frameworks: .NETCoreApp v3.0, .NETCoreApp v3.1, .NET Framework 4.6.1
Add a namespace to your Window
xmlns:dj="clr-namespace:DJ;assembly=NLogViewer"use the control
<dj:NLogViewer/>NlogViewer is subscribing to CacheTarget. By default, the NlogViewer is automatically creating a CacheTarget with loggingPattern "*" and LogLevel "Trace".
If you want to customize the loggingPattern and LogLevel, add the following to your 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">
<extensions>
<add assembly="NLogViewer"/>
</extensions>
<targets async="true">
<target
xsi:type="CacheTarget"
name="cache"/>
</targets>
<rules>
<logger name="*" writeTo="cache" minlevel="Debug"/>
</rules>
</nlog>Customize foreground or background of every logLevel
Use more than one instance of NLogViewer to match different rules.
Create 2 targets with their own rules.
<targets async="true">
<target xsi:type="CacheTarget" name="target1"/>
<target xsi:type="CacheTarget" name="target2"/>
</targets>
<rules>
<logger name="*" writeTo="target1" maxlevel="Info"/>
<logger name="*" writeTo="target2" minlevel="Warn"/>
</rules>Set TargetName property to link them.
<dj:NLogViewer TargetName="target1"/>
<dj:NLogViewer TargetName="target2"/>To format the output of a LogEventInfo, implement a new instance of ILogEventInfoResolver and bind it to the Resolver you want to customize:
/// <summary>
/// Reformat the DateTime
/// </summary>
public class FooTimeStampResolver : ILogEventInfoResolver
{
public string Resolve(LogEventInfo logEventInfo)
{
return logEventInfo.TimeStamp.ToUniversalTime().ToString();
}
}NLogViewer1.TimeStampResolver = new FooTimeStampResolver();Create a new Window and add a default NLogViewer
<dj:NLogViewer TargetName="target1"/>Open the new Window
TestPopup popup = new TestPopup();
popup.Show();Below is a sample how you could create a NLogViewer for a task
// create unique target name
var taskNumber = _RandomTaskCounter++;
string targetName = $"task{taskNumber}";
// create a unique logger
var loggerName = $"MyFoo.Logger.{taskNumber}";
var logger = LogManager.GetLogger(loggerName);
// create new CacheTarget
CacheTarget target = new CacheTarget
{
Name = targetName
};
// get config // https://stackoverflow.com/a/3603571/6229375
var config = LogManager.Configuration;
// add target
config.AddTarget(targetName, target);
// create a logging rule for the new logger
LoggingRule loggingRule = new LoggingRule(loggerName, LogLevel.Trace, target);
// add the logger to the existing configuration
config.LoggingRules.Add(loggingRule);
// reassign config back to NLog
LogManager.Configuration = config;
// create a new NLogViewer Control with the unique logger target name
NLogViewer nLogViewer = new NLogViewer
{
TargetName = targetName,
};
// add it to the tab control
var tabItem = new TabItem { Header = $"Task {taskNumber}", Content = nLogViewer };
TabControl1.Items.Add(tabItem);
TabControl1.SelectedItem = tabItem;
// create task which produces some output
var task = new Task(async () =>
{
while (true)
{
logger.Info($"Hello from task nr. {taskNumber}. It's {DateTime.Now.ToLongTimeString()}");
await Task.Delay(1000);
}
});There is already a NLogViewerTarget, which is used for Sentinel. See here
<target
xsi:type="NLogViewer"
name="sentinel"
address="udp://127.0.0.1:9999"/>Feel free to make a PullRequest or open an Issue to extend this library!



