Skip to content

Commit e8f02e9

Browse files
authored
[dotnet] Improve logging performance when it is disabled (#13464)
* Use IsEnabledFor before allocate log message * Rename to `IsEnabled` * Simplify determination of logger's level
1 parent 7bf6286 commit e8f02e9

File tree

9 files changed

+58
-11
lines changed

9 files changed

+58
-11
lines changed

dotnet/src/webdriver/DriverService.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,10 @@ protected virtual bool IsInitialized
239239
}
240240
catch (Exception ex) when (ex is HttpRequestException || ex is TaskCanceledException)
241241
{
242-
logger.Trace(ex.ToString());
242+
if (logger.IsEnabled(LogEventLevel.Trace))
243+
{
244+
logger.Trace(ex.ToString());
245+
}
243246
}
244247

245248
return isInitialized;

dotnet/src/webdriver/Internal/FileUtilities.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,10 @@ public static void DeleteDirectory(string directoryToDelete)
102102

103103
if (Directory.Exists(directoryToDelete))
104104
{
105-
logger.Trace($"Unable to delete directory '{directoryToDelete}'");
105+
if (logger.IsEnabled(LogEventLevel.Trace))
106+
{
107+
logger.Trace($"Unable to delete directory '{directoryToDelete}'");
108+
}
106109
}
107110
}
108111

dotnet/src/webdriver/Internal/Logging/ILogContext.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,14 @@ public interface ILogContext : IDisposable
5252
/// <returns>An instance of <see cref="ILogger"/> for the specified type.</returns>
5353
internal ILogger GetLogger(Type type);
5454

55+
/// <summary>
56+
/// Checks whether logs emitting is enabled for a logger and a log event level.
57+
/// </summary>
58+
/// <param name="logger">The specified logger instance to be checked.</param>
59+
/// <param name="level">The specified log event level to be checked.</param>
60+
/// <returns><c>true</c> if log messages emmiting is enabled for the specified logger and log event level, otherwise <c>false</c>.</returns>
61+
internal bool IsEnabled(ILogger logger, LogEventLevel level);
62+
5563
/// <summary>
5664
/// Emits a log message using the specified logger, log level, and message.
5765
/// </summary>

dotnet/src/webdriver/Internal/Logging/ILogger.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,5 +64,12 @@ internal interface ILogger
6464
/// Gets the type of the logger issuer.
6565
/// </summary>
6666
Type Issuer { get; }
67+
68+
/// <summary>
69+
/// Checks whether logs emitting is enabled for this logger and a log event level.
70+
/// </summary>
71+
/// <param name="level">The specified log event level to be checked.</param>
72+
/// <returns><c>true</c> if log messages emmiting is enabled for the specified log event level, otherwise <c>false</c>.</returns>
73+
bool IsEnabled(LogEventLevel level);
6774
}
6875
}

dotnet/src/webdriver/Internal/Logging/LogContext.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,9 +96,14 @@ public ILogger GetLogger(Type type)
9696
return _loggers.GetOrAdd(type, _ => new Logger(type, _level));
9797
}
9898

99+
public bool IsEnabled(ILogger logger, LogEventLevel level)
100+
{
101+
return Handlers != null && level >= _level && level >= logger.Level;
102+
}
103+
99104
public void EmitMessage(ILogger logger, LogEventLevel level, string message)
100105
{
101-
if (Handlers != null && level >= _level && level >= GetLogger(logger.Issuer).Level)
106+
if (IsEnabled(logger, level))
102107
{
103108
var logEvent = new LogEvent(logger.Issuer, DateTimeOffset.Now, level, message);
104109

dotnet/src/webdriver/Internal/Logging/Logger.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,11 @@ public void Error(string message)
6161
LogMessage(LogEventLevel.Error, message);
6262
}
6363

64+
public bool IsEnabled(LogEventLevel level)
65+
{
66+
return Log.CurrentContext.IsEnabled(this, level);
67+
}
68+
6469
private void LogMessage(LogEventLevel level, string message)
6570
{
6671
Log.CurrentContext.EmitMessage(this, level, message);

dotnet/src/webdriver/Remote/HttpCommandExecutor.cs

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,12 @@
1818

1919
using System;
2020
using System.Collections.Generic;
21-
using System.Diagnostics;
2221
using System.Globalization;
2322
using System.Linq;
2423
using System.Net;
2524
using System.Net.Http;
2625
using System.Net.Http.Headers;
2726
using System.Text;
28-
using System.Threading;
2927
using System.Threading.Tasks;
3028
using OpenQA.Selenium.Internal;
3129
using OpenQA.Selenium.Internal.Logging;
@@ -166,7 +164,10 @@ public virtual Response Execute(Command commandToExecute)
166164
throw new ArgumentNullException(nameof(commandToExecute), "commandToExecute cannot be null");
167165
}
168166

169-
_logger.Debug($"Executing command: {commandToExecute}");
167+
if (_logger.IsEnabled(LogEventLevel.Debug))
168+
{
169+
_logger.Debug($"Executing command: {commandToExecute}");
170+
}
170171

171172
HttpCommandInfo info = this.commandInfoRepository.GetCommandInfo<HttpCommandInfo>(commandToExecute.Name);
172173
if (info == null)
@@ -198,7 +199,10 @@ public virtual Response Execute(Command commandToExecute)
198199

199200
Response toReturn = this.CreateResponse(responseInfo);
200201

201-
_logger.Debug($"Response: {toReturn}");
202+
if (_logger.IsEnabled(LogEventLevel.Debug))
203+
{
204+
_logger.Debug($"Response: {toReturn}");
205+
}
202206

203207
return toReturn;
204208
}
@@ -279,11 +283,17 @@ private async Task<HttpResponseInfo> MakeHttpRequest(HttpRequestInfo requestInfo
279283
requestMessage.Content.Headers.ContentType = contentTypeHeader;
280284
}
281285

282-
_logger.Trace($">> {requestMessage}");
286+
if (_logger.IsEnabled(LogEventLevel.Trace))
287+
{
288+
_logger.Trace($">> {requestMessage}");
289+
}
283290

284291
using (HttpResponseMessage responseMessage = await this.client.SendAsync(requestMessage).ConfigureAwait(false))
285292
{
286-
_logger.Trace($"<< {responseMessage}");
293+
if (_logger.IsEnabled(LogEventLevel.Trace))
294+
{
295+
_logger.Trace($"<< {responseMessage}");
296+
}
287297

288298
HttpResponseInfo httpResponseInfo = new HttpResponseInfo();
289299
httpResponseInfo.Body = await responseMessage.Content.ReadAsStringAsync().ConfigureAwait(false);

dotnet/src/webdriver/Safari/SafariDriverService.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,10 @@ protected override bool IsInitialized
130130
// check.
131131
catch (Exception ex) when (ex is HttpRequestException || ex is TaskCanceledException)
132132
{
133-
logger.Trace(ex.ToString());
133+
if (logger.IsEnabled(LogEventLevel.Trace))
134+
{
135+
logger.Trace(ex.ToString());
136+
}
134137
}
135138
}
136139
}

dotnet/src/webdriver/SeleniumManager.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,10 @@ public static string DriverPath(DriverOptions options)
121121

122122
var driverPath = (string)output["driver_path"];
123123

124-
_logger.Trace($"Driver path: {driverPath}");
124+
if (_logger.IsEnabled(LogEventLevel.Trace))
125+
{
126+
_logger.Trace($"Driver path: {driverPath}");
127+
}
125128

126129
return driverPath;
127130
}

0 commit comments

Comments
 (0)