Skip to content

Commit

Permalink
Added Setup-extension-method WriteToColoredConsole (#5389)
Browse files Browse the repository at this point in the history
  • Loading branch information
snakefoot committed Oct 29, 2023
1 parent 8f77b61 commit 6239851
Show file tree
Hide file tree
Showing 2 changed files with 110 additions and 0 deletions.
62 changes: 62 additions & 0 deletions src/NLog/SetupLoadConfigurationExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -468,6 +468,68 @@ public static ISetupConfigurationTargetBuilder WriteToConsole(this ISetupConfigu
return configBuilder.WriteTo(consoleTarget);
}

/// <summary>
/// Write to <see cref="NLog.Targets.ColoredConsoleTarget"/> and color log-messages based on <see cref="LogLevel"/>
/// </summary>
/// <param name="configBuilder">Fluent interface parameter.</param>
/// <param name="layout">Override the default Layout for output</param>
/// <param name="highlightWordLevel">Highlight only the Level-part</param>
/// <param name="encoding">Override the default Encoding for output (Ex. UTF8)</param>
/// <param name="stderr">Write to stderr instead of standard output (stdout)</param>
/// <param name="detectConsoleAvailable">Skip overhead from writing to console, when not available (Ex. running as Windows Service)</param>
/// <param name="enableAnsiOutput">Enables output using ANSI Color Codes (Windows console does not support this by default)</param>
public static ISetupConfigurationTargetBuilder WriteToColoredConsole(this ISetupConfigurationTargetBuilder configBuilder, Layout layout = null, bool highlightWordLevel = false, System.Text.Encoding encoding = null, bool stderr = false, bool detectConsoleAvailable = false, bool enableAnsiOutput = false)
{
var consoleTarget = new ColoredConsoleTarget();
if (layout != null)
consoleTarget.Layout = layout;
if (encoding != null)
consoleTarget.Encoding = encoding;
consoleTarget.StdErr = stderr;
consoleTarget.DetectConsoleAvailable = detectConsoleAvailable;
consoleTarget.EnableAnsiOutput = enableAnsiOutput;
consoleTarget.UseDefaultRowHighlightingRules = false;

if (enableAnsiOutput)
{
if (highlightWordLevel)
{
consoleTarget.WordHighlightingRules.Add(new ConsoleWordHighlightingRule("Fatal", ConsoleOutputColor.DarkRed, ConsoleOutputColor.NoChange) { Condition = "level == LogLevel.Fatal", IgnoreCase = true, WholeWords = true });
consoleTarget.WordHighlightingRules.Add(new ConsoleWordHighlightingRule("Error", ConsoleOutputColor.DarkRed, ConsoleOutputColor.NoChange) { Condition = "level == LogLevel.Error", IgnoreCase = true, WholeWords = true });
consoleTarget.WordHighlightingRules.Add(new ConsoleWordHighlightingRule("Warn", ConsoleOutputColor.DarkYellow, ConsoleOutputColor.NoChange) { Condition = "level == LogLevel.Warn", IgnoreCase = true, WholeWords = true });
}
else
{
consoleTarget.RowHighlightingRules.Add(new ConsoleRowHighlightingRule("level == LogLevel.Fatal", ConsoleOutputColor.DarkRed, ConsoleOutputColor.NoChange));
consoleTarget.RowHighlightingRules.Add(new ConsoleRowHighlightingRule("level == LogLevel.Error", ConsoleOutputColor.DarkRed, ConsoleOutputColor.NoChange));
consoleTarget.RowHighlightingRules.Add(new ConsoleRowHighlightingRule("level == LogLevel.Warn", ConsoleOutputColor.DarkYellow, ConsoleOutputColor.NoChange));
consoleTarget.RowHighlightingRules.Add(new ConsoleRowHighlightingRule("level == LogLevel.Info", ConsoleOutputColor.NoChange, ConsoleOutputColor.NoChange));
consoleTarget.RowHighlightingRules.Add(new ConsoleRowHighlightingRule("level == LogLevel.Debug", ConsoleOutputColor.NoChange, ConsoleOutputColor.NoChange));
consoleTarget.RowHighlightingRules.Add(new ConsoleRowHighlightingRule("level == LogLevel.Trace", ConsoleOutputColor.NoChange, ConsoleOutputColor.NoChange));
}
}
else
{
if (highlightWordLevel)
{
consoleTarget.WordHighlightingRules.Add(new ConsoleWordHighlightingRule("Fatal", ConsoleOutputColor.White, ConsoleOutputColor.DarkRed) { Condition = "level == LogLevel.Fatal", IgnoreCase = true, WholeWords = true });
consoleTarget.WordHighlightingRules.Add(new ConsoleWordHighlightingRule("Error", ConsoleOutputColor.Red, ConsoleOutputColor.NoChange) { Condition = "level == LogLevel.Error", IgnoreCase = true, WholeWords = true });
consoleTarget.WordHighlightingRules.Add(new ConsoleWordHighlightingRule("Warn", ConsoleOutputColor.DarkYellow, ConsoleOutputColor.NoChange) { Condition = "level == LogLevel.Warn", IgnoreCase = true, WholeWords = true });
}
else
{
consoleTarget.RowHighlightingRules.Add(new ConsoleRowHighlightingRule("level == LogLevel.Fatal", ConsoleOutputColor.White, ConsoleOutputColor.DarkRed));
consoleTarget.RowHighlightingRules.Add(new ConsoleRowHighlightingRule("level == LogLevel.Error", ConsoleOutputColor.Red, ConsoleOutputColor.NoChange));
consoleTarget.RowHighlightingRules.Add(new ConsoleRowHighlightingRule("level == LogLevel.Warn", ConsoleOutputColor.DarkYellow, ConsoleOutputColor.NoChange));
consoleTarget.RowHighlightingRules.Add(new ConsoleRowHighlightingRule("level == LogLevel.Info", ConsoleOutputColor.White, ConsoleOutputColor.NoChange));
consoleTarget.RowHighlightingRules.Add(new ConsoleRowHighlightingRule("level == LogLevel.Debug", ConsoleOutputColor.Gray, ConsoleOutputColor.NoChange));
consoleTarget.RowHighlightingRules.Add(new ConsoleRowHighlightingRule("level == LogLevel.Trace", ConsoleOutputColor.Gray, ConsoleOutputColor.NoChange));
}
}

return configBuilder.WriteTo(consoleTarget);
}

/// <summary>
/// Write to <see cref="NLog.Targets.TraceTarget"/>
/// </summary>
Expand Down
48 changes: 48 additions & 0 deletions tests/NLog.UnitTests/Targets/ColoredConsoleTargetTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,54 @@ public void ColoredConsoleAnsi_OverlappingWordHighlight_VerificationTest()
new string[] { "The \x1B[31mbig \x1B[35mw\x1B[32ma\x1B[35mrn\x1B[31ming\x1B[0m mess\x1B[32ma\x1B[0mge\x1B[0m" });
}

[Fact]
public void SetupBuilder_WriteToColoredConsole()
{
var logFactory = new LogFactory().Setup().LoadConfiguration(c =>
{
c.ForLogger().FilterMinLevel(LogLevel.Error).WriteToColoredConsole("${level}|${message}", stderr: true, enableAnsiOutput: true);
}).LogFactory;

var consoleErrorWriter = new StringWriter();
TextWriter oldConsoleErrorWriter = Console.Error;
Console.SetError(consoleErrorWriter);

try
{
logFactory.GetCurrentClassLogger().Error("Abort");
logFactory.GetCurrentClassLogger().Info("Continue");
Assert.Equal($"\u001b[31mError|Abort\u001b[0m{System.Environment.NewLine}", consoleErrorWriter.ToString());
}
finally
{
Console.SetError(oldConsoleErrorWriter);
}
}

[Fact]
public void SetupBuilder_WriteToColoredConsole_HighlightWord()
{
var logFactory = new LogFactory().Setup().LoadConfiguration(c =>
{
c.ForLogger().FilterMinLevel(LogLevel.Error).WriteToColoredConsole("${level}|${message}", stderr: true, enableAnsiOutput: true, highlightWordLevel: true);
}).LogFactory;

var consoleErrorWriter = new StringWriter();
TextWriter oldConsoleErrorWriter = Console.Error;
Console.SetError(consoleErrorWriter);

try
{
logFactory.GetCurrentClassLogger().Error("Abort");
logFactory.GetCurrentClassLogger().Info("Continue");
Assert.Equal($"\u001b[31mError\u001b[0m|Abort\u001b[0m{System.Environment.NewLine}", consoleErrorWriter.ToString());
}
finally
{
Console.SetError(oldConsoleErrorWriter);
}
}

[Fact]
public void ColoredConsoleAnsi_RepeatedWordHighlight_VerificationTest()
{
Expand Down

0 comments on commit 6239851

Please sign in to comment.