Skip to content

Commit 9891df6

Browse files
committed
chore: update code based on review comment
1 parent 956d44c commit 9891df6

6 files changed

Lines changed: 62 additions & 63 deletions

File tree

src/BenchmarkDotNet/Loggers/CompositeLogger.cs

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
namespace BenchmarkDotNet.Loggers
88
{
9-
internal class CompositeLogger : ILogger
9+
internal class CompositeLogger : ILogger, ILinkLogger
1010
{
1111
private readonly ImmutableHashSet<ILogger> loggers;
1212

@@ -61,11 +61,5 @@ public void Flush()
6161
}
6262
}
6363
}
64-
65-
public bool TryGetConsoleLogger([NotNullWhen(true)] out IConsoleLogger? consoleLogger)
66-
{
67-
consoleLogger = loggers.OfType<IConsoleLogger>().SingleOrDefault();
68-
return consoleLogger != null;
69-
}
7064
}
7165
}

src/BenchmarkDotNet/Loggers/ConsoleLogger.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
namespace BenchmarkDotNet.Loggers
1111
{
12-
public sealed class ConsoleLogger : ILogger, IConsoleLogger
12+
public sealed class ConsoleLogger : ILogger, ILinkLogger
1313
{
1414
private const ConsoleColor DefaultColor = ConsoleColor.Gray;
1515

src/BenchmarkDotNet/Loggers/IConsoleLogger.cs

Lines changed: 0 additions & 48 deletions
This file was deleted.
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
namespace BenchmarkDotNet.Loggers;
2+
3+
/// <summary>
4+
/// Marker interface for a logger that supports clickable link with ANSI escape sequence.
5+
/// </summary>
6+
internal interface ILinkLogger : ILogger
7+
{
8+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
using BenchmarkDotNet.Helpers;
2+
3+
namespace BenchmarkDotNet.Loggers;
4+
5+
#nullable enable
6+
7+
public static class ILoggerExtensions
8+
{
9+
/// <summary>
10+
/// Write clickable link to logger.
11+
/// If the logger doesn't implement <see cref="ILinkLogger"/>. It's written as plain text.
12+
/// </summary>
13+
public static void WriteLink(this ILogger logger, string link, string? linkCaption = null, LogKind logKind = LogKind.Info)
14+
{
15+
if (logger is ILinkLogger)
16+
{
17+
if (ConsoleHelper.TryGetClickableLink(link, linkCaption, out var clickableLink))
18+
link = clickableLink;
19+
}
20+
21+
logger.Write(logKind, link);
22+
}
23+
24+
/// <summary>
25+
/// Write clickable link to logger.
26+
/// If the logger doesn't implement <see cref="ILinkLogger"/>. It's written as plain text.
27+
/// </summary>
28+
public static void WriteLineLink(this ILogger logger, string link, string? linkCaption = null, string prefixText = "", string suffixText = "", LogKind logKind = LogKind.Info)
29+
{
30+
if (logger is ILinkLogger)
31+
{
32+
if (ConsoleHelper.TryGetClickableLink(link, linkCaption, out var clickableLink))
33+
{
34+
link = clickableLink;
35+
36+
// Temporary workaround for Windows Terminal.
37+
// To avoid link style corruption issue when output ends with a clickable link and window is resized.
38+
if (ConsoleHelper.IsWindowsTerminal && suffixText == "")
39+
suffixText = " ";
40+
}
41+
}
42+
43+
logger.WriteLine(logKind, $"{prefixText}{link}{suffixText}");
44+
}
45+
}

src/BenchmarkDotNet/Running/BenchmarkRunnerClean.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -194,17 +194,17 @@ internal static Summary[] Run(BenchmarkRunInfo[] benchmarkRunInfos)
194194

195195
// Output additional information to console.
196196
var logFileEnabled = benchmarkRunInfos.All(info => !info.Config.Options.IsSet(ConfigOptions.DisableLogFile));
197-
if (logFileEnabled && compositeLogger.TryGetConsoleLogger(out var consoleLogger))
197+
if (logFileEnabled)
198198
{
199199
var artifactDirectoryFullPath = Path.GetFullPath(rootArtifactsFolderPath);
200200
var logFileFullPath = Path.GetFullPath(logFilePath);
201201
var logFileRelativePath = PathHelper.GetRelativePath(artifactDirectoryFullPath, logFileFullPath);
202202

203-
consoleLogger.WriteLine();
204-
consoleLogger.WriteLineHeader("// * Benchmark LogFile *");
205-
consoleLogger.WriteLineLink(artifactDirectoryFullPath);
206-
consoleLogger.WriteLineLink(logFileFullPath, linkCaption: logFileRelativePath, prefixText: " ");
207-
consoleLogger.Flush();
203+
compositeLogger.WriteLine();
204+
compositeLogger.WriteLineHeader("// * Benchmark LogFile *");
205+
compositeLogger.WriteLineLink(artifactDirectoryFullPath);
206+
compositeLogger.WriteLineLink(logFileFullPath, linkCaption: logFileRelativePath, prefixText: " ");
207+
compositeLogger.Flush();
208208
}
209209

210210
eventProcessor.OnEndRunStage();
@@ -768,7 +768,7 @@ private static StreamWriter GetLogFileStreamWriter(BenchmarkRunInfo[] benchmarkR
768768
return new StreamWriter(logFilePath, append: false);
769769
}
770770

771-
private static CompositeLogger CreateCompositeLogger(BenchmarkRunInfo[] benchmarkRunInfos, StreamLogger streamLogger)
771+
private static ILogger CreateCompositeLogger(BenchmarkRunInfo[] benchmarkRunInfos, StreamLogger streamLogger)
772772
{
773773
var loggers = new Dictionary<string, ILogger>();
774774

0 commit comments

Comments
 (0)