Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added Setup-extension-method WriteToColoredConsole #5389

Merged
merged 1 commit into from
Oct 29, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
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