Skip to content

Commit 1c92dcf

Browse files
authored
chore: Add DebugLogLevelEnabled property to default logger implementation (#928)
1 parent f867967 commit 1c92dcf

File tree

8 files changed

+95
-58
lines changed

8 files changed

+95
-58
lines changed

src/Testcontainers/Builders/ContainerBuilder`3.cs

-6
Original file line numberDiff line numberDiff line change
@@ -255,12 +255,6 @@ public TBuilderEntity WithTmpfsMount(string destination, AccessMode accessMode)
255255
return WithMount(new TmpfsMount(destination, accessMode));
256256
}
257257

258-
/// <inheritdoc />
259-
public TBuilderEntity WithNetwork(string id, string name)
260-
{
261-
return WithNetwork(name);
262-
}
263-
264258
/// <inheritdoc />
265259
public TBuilderEntity WithNetwork(string name)
266260
{

src/Testcontainers/Clients/DockerContainerOperations.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -102,13 +102,13 @@ public Task RemoveAsync(string id, CancellationToken ct = default)
102102

103103
public Task ExtractArchiveToContainerAsync(string id, string path, Stream tarStream, CancellationToken ct = default)
104104
{
105-
_logger.ExtractArchiveToDockerContainer(id, path);
105+
_logger.CopyArchiveToDockerContainer(id, path);
106106
return Docker.Containers.ExtractArchiveToContainerAsync(id, new ContainerPathStatParameters { Path = path, AllowOverwriteDirWithFile = false }, tarStream, ct);
107107
}
108108

109109
public async Task<Stream> GetArchiveFromContainerAsync(string id, string path, CancellationToken ct = default)
110110
{
111-
_logger.GetArchiveFromDockerContainer(id, path);
111+
_logger.ReadArchiveFromDockerContainer(id, path);
112112

113113
var tarResponse = await Docker.Containers.GetArchiveFromContainerAsync(id, new GetArchiveFromContainerParameters { Path = path }, false, ct)
114114
.ConfigureAwait(false);

src/Testcontainers/Clients/TraceProgress.cs

+3-3
Original file line numberDiff line numberDiff line change
@@ -19,17 +19,17 @@ public void Report(JSONMessage value)
1919

2020
if (!string.IsNullOrWhiteSpace(value.Status))
2121
{
22-
_logger.LogTrace(value.Status);
22+
_logger.LogDebug(value.Status);
2323
}
2424

2525
if (!string.IsNullOrWhiteSpace(value.Stream))
2626
{
27-
_logger.LogTrace(value.Stream);
27+
_logger.LogDebug(value.Stream);
2828
}
2929

3030
if (!string.IsNullOrWhiteSpace(value.ProgressMessage))
3131
{
32-
_logger.LogTrace(value.ProgressMessage);
32+
_logger.LogDebug(value.ProgressMessage);
3333
}
3434

3535
if (!string.IsNullOrWhiteSpace(value.ErrorMessage))

src/Testcontainers/Configurations/TestcontainersSettings.cs

+9-4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
namespace DotNet.Testcontainers.Configurations
22
{
33
using System;
4+
using System.Collections.Generic;
45
using System.Globalization;
56
using System.Linq;
67
using System.Runtime.InteropServices;
@@ -167,7 +168,7 @@ static TestcontainersSettings()
167168
/// </summary>
168169
[NotNull]
169170
public static ILogger Logger { get; set; }
170-
= new Logger();
171+
= ConsoleLogger.Instance;
171172

172173
/// <summary>
173174
/// Gets or sets the host operating system.
@@ -184,12 +185,16 @@ public static WaitHandle SettingsInitialized
184185
=> ManualResetEvent.WaitHandle;
185186

186187
/// <inheritdoc cref="PortForwardingContainer.ExposeHostPortsAsync" />
187-
public static async Task ExposeHostPortsAsync(params ushort[] ports)
188+
public static Task ExposeHostPortsAsync(ushort port, CancellationToken ct = default)
189+
=> ExposeHostPortsAsync(new[] { port }, ct);
190+
191+
/// <inheritdoc cref="PortForwardingContainer.ExposeHostPortsAsync" />
192+
public static async Task ExposeHostPortsAsync(IEnumerable<ushort> ports, CancellationToken ct = default)
188193
{
189-
await PortForwardingContainer.Instance.StartAsync()
194+
await PortForwardingContainer.Instance.StartAsync(ct)
190195
.ConfigureAwait(false);
191196

192-
await PortForwardingContainer.Instance.ExposeHostPortsAsync(ports)
197+
await PortForwardingContainer.Instance.ExposeHostPortsAsync(ports, ct)
193198
.ConfigureAwait(false);
194199
}
195200
}

src/Testcontainers/Containers/DockerContainer.cs

+4
Original file line numberDiff line numberDiff line change
@@ -440,12 +440,16 @@ await WaitStrategy.WaitUntilAsync(CheckPortBindingsAsync, TimeSpan.FromSeconds(1
440440
await _configuration.StartupCallback(this, ct)
441441
.ConfigureAwait(false);
442442

443+
Logger.StartReadinessCheck(_container.ID);
444+
443445
foreach (var waitStrategy in _configuration.WaitStrategies)
444446
{
445447
await WaitStrategy.WaitUntilAsync(() => CheckWaitStrategyAsync(waitStrategy), TimeSpan.FromSeconds(1), Timeout.InfiniteTimeSpan, ct)
446448
.ConfigureAwait(false);
447449
}
448450

451+
Logger.CompleteReadinessCheck(_container.ID);
452+
449453
Started?.Invoke(this, EventArgs.Empty);
450454
}
451455

src/Testcontainers/Containers/PortForwarding.cs

+4-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
namespace DotNet.Testcontainers.Containers
22
{
3+
using System.Collections.Generic;
34
using System.Linq;
45
using System.Net;
6+
using System.Threading;
57
using System.Threading.Tasks;
68
using Docker.DotNet.Models;
79
using DotNet.Testcontainers.Builders;
@@ -41,8 +43,9 @@ private PortForwardingContainer(PortForwardingConfiguration configuration, ILogg
4143
/// Exposes the host ports using SSH port forwarding.
4244
/// </summary>
4345
/// <param name="ports">The host ports to forward.</param>
46+
/// <param name="ct">Cancellation token.</param>
4447
/// <returns>A task that completes when the host ports are forwarded.</returns>
45-
public Task ExposeHostPortsAsync(params ushort[] ports)
48+
public Task ExposeHostPortsAsync(IEnumerable<ushort> ports, CancellationToken ct = default)
4649
{
4750
var sshClient = new SshClient(Hostname, GetMappedPublicPort(PortForwardingBuilder.SshdPort), _configuration.Username, _configuration.Password);
4851
sshClient.Connect();

src/Testcontainers/Logger.cs

+36-26
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,8 @@ namespace DotNet.Testcontainers
22
{
33
using System;
44
using System.Diagnostics;
5-
using System.Globalization;
6-
using System.IO;
75
using System.Runtime.InteropServices;
6+
using JetBrains.Annotations;
87
using Microsoft.Extensions.Logging;
98

109
/// <summary>
@@ -55,54 +54,65 @@ namespace DotNet.Testcontainers
5554
/// }
5655
/// </code>
5756
/// </example>
58-
internal sealed class Logger : ILogger, IDisposable
57+
[PublicAPI]
58+
public sealed class ConsoleLogger : ILogger, IDisposable
5959
{
6060
private readonly Stopwatch _stopwatch = Stopwatch.StartNew();
6161

62-
public Logger()
62+
private LogLevel _minLogLevel = LogLevel.Information;
63+
64+
private ConsoleLogger()
6365
{
6466
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows) && !Console.IsOutputRedirected && !Console.IsErrorRedirected)
6567
{
6668
Console.BufferWidth = short.MaxValue - 1;
6769
}
6870
}
6971

72+
/// <summary>
73+
/// Gets the <see cref="ConsoleLogger" /> instance.
74+
/// </summary>
75+
public static ConsoleLogger Instance { get; }
76+
= new ConsoleLogger();
77+
78+
/// <summary>
79+
/// Gets a value indicating whether the debug log level is enabled or not.
80+
/// </summary>
81+
public bool DebugLogLevelEnabled
82+
{
83+
get
84+
{
85+
return LogLevel.Debug.Equals(_minLogLevel);
86+
}
87+
88+
set
89+
{
90+
_minLogLevel = value ? LogLevel.Debug : LogLevel.Information;
91+
}
92+
}
93+
94+
/// <inheritdoc />
7095
public void Dispose()
7196
{
72-
// The default logger does not support scopes. We return itself as IDisposable implementation.
97+
// The default console logger does not support scopes. We return itself as IDisposable implementation.
7398
}
7499

100+
/// <inheritdoc />
75101
public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter)
76102
{
77-
TextWriter console;
78-
79-
switch (logLevel)
103+
if (IsEnabled(logLevel))
80104
{
81-
case LogLevel.Information:
82-
console = Console.Out;
83-
break;
84-
case LogLevel.Warning:
85-
console = Console.Out;
86-
break;
87-
case LogLevel.Error:
88-
console = Console.Error;
89-
break;
90-
case LogLevel.Critical:
91-
console = Console.Error;
92-
break;
93-
default:
94-
return;
105+
Console.Out.WriteLine("[testcontainers.org {0:hh\\:mm\\:ss\\.ff}] {1}", _stopwatch.Elapsed, formatter.Invoke(state, exception));
95106
}
96-
97-
var message = string.Format(CultureInfo.CurrentCulture, "[testcontainers.org {0:hh\\:mm\\:ss\\.ff}] {1}", _stopwatch.Elapsed, formatter.Invoke(state, exception));
98-
console.WriteLine(message);
99107
}
100108

109+
/// <inheritdoc />
101110
public bool IsEnabled(LogLevel logLevel)
102111
{
103-
return true;
112+
return logLevel >= _minLogLevel;
104113
}
105114

115+
/// <inheritdoc />
106116
public IDisposable BeginScope<TState>(TState state)
107117
{
108118
return this;

src/Testcontainers/Logging.cs

+37-16
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,16 @@ private static readonly Action<ILogger, string, Exception> _StopDockerContainer
2525
private static readonly Action<ILogger, string, Exception> _DeleteDockerContainer
2626
= LoggerMessage.Define<string>(LogLevel.Information, default, "Delete Docker container {Id}");
2727

28-
private static readonly Action<ILogger, string, string, Exception> _ExtractArchiveToDockerContainer
29-
= LoggerMessage.Define<string, string>(LogLevel.Information, default, "Copy tar archive to \"{Path}\" at Docker container {Id}");
28+
private static readonly Action<ILogger, string, Exception> _StartReadinessCheck
29+
= LoggerMessage.Define<string>(LogLevel.Information, default, "Wait for Docker container {Id} to complete readiness checks");
3030

31-
private static readonly Action<ILogger, string, string, Exception> _GetArchiveFromDockerContainer
31+
private static readonly Action<ILogger, string, Exception> _CompleteReadinessCheck
32+
= LoggerMessage.Define<string>(LogLevel.Information, default, "Docker container {Id} ready");
33+
34+
private static readonly Action<ILogger, string, string, Exception> _CopyArchiveToDockerContainer
35+
= LoggerMessage.Define<string, string>(LogLevel.Information, default, "Copy tar archive to \"{Path}\" to Docker container {Id}");
36+
37+
private static readonly Action<ILogger, string, string, Exception> _ReadArchiveFromDockerContainer
3238
= LoggerMessage.Define<string, string>(LogLevel.Information, default, "Read \"{Path}\" from Docker container {Id}");
3339

3440
private static readonly Action<ILogger, Type, string, Exception> _AttachToDockerContainer
@@ -91,47 +97,57 @@ public static void IgnorePatternAdded(this ILogger logger, Regex ignorePattern)
9197

9298
public static void DockerContainerCreated(this ILogger logger, string id)
9399
{
94-
_DockerContainerCreated(logger, id, null);
100+
_DockerContainerCreated(logger, TruncId(id), null);
95101
}
96102

97103
public static void StartDockerContainer(this ILogger logger, string id)
98104
{
99-
_StartDockerContainer(logger, id, null);
105+
_StartDockerContainer(logger, TruncId(id), null);
100106
}
101107

102108
public static void StopDockerContainer(this ILogger logger, string id)
103109
{
104-
_StopDockerContainer(logger, id, null);
110+
_StopDockerContainer(logger, TruncId(id), null);
105111
}
106112

107113
public static void DeleteDockerContainer(this ILogger logger, string id)
108114
{
109-
_DeleteDockerContainer(logger, id, null);
115+
_DeleteDockerContainer(logger, TruncId(id), null);
116+
}
117+
118+
public static void StartReadinessCheck(this ILogger logger, string id)
119+
{
120+
_StartReadinessCheck(logger, TruncId(id), null);
110121
}
111122

112-
public static void ExtractArchiveToDockerContainer(this ILogger logger, string id, string path)
123+
public static void CompleteReadinessCheck(this ILogger logger, string id)
113124
{
114-
_ExtractArchiveToDockerContainer(logger, path, id, null);
125+
_CompleteReadinessCheck(logger, TruncId(id), null);
115126
}
116127

117-
public static void GetArchiveFromDockerContainer(this ILogger logger, string id, string path)
128+
public static void CopyArchiveToDockerContainer(this ILogger logger, string id, string path)
118129
{
119-
_GetArchiveFromDockerContainer(logger, path, id, null);
130+
_CopyArchiveToDockerContainer(logger, path, TruncId(id), null);
131+
}
132+
133+
public static void ReadArchiveFromDockerContainer(this ILogger logger, string id, string path)
134+
{
135+
_ReadArchiveFromDockerContainer(logger, path, TruncId(id), null);
120136
}
121137

122138
public static void AttachToDockerContainer(this ILogger logger, string id, Type type)
123139
{
124-
_AttachToDockerContainer(logger, type, id, null);
140+
_AttachToDockerContainer(logger, type, TruncId(id), null);
125141
}
126142

127143
public static void ConnectToDockerNetwork(this ILogger logger, string networkId, string containerId)
128144
{
129-
_ConnectToDockerNetwork(logger, containerId, networkId, null);
145+
_ConnectToDockerNetwork(logger, TruncId(containerId), TruncId(networkId), null);
130146
}
131147

132148
public static void ExecuteCommandInDockerContainer(this ILogger logger, string id, IEnumerable<string> command)
133149
{
134-
_ExecuteCommandInDockerContainer(logger, string.Join(" ", command), id, null);
150+
_ExecuteCommandInDockerContainer(logger, string.Join(" ", command), TruncId(id), null);
135151
}
136152

137153
public static void DockerImageCreated(this ILogger logger, IImage image)
@@ -151,12 +167,12 @@ public static void DeleteDockerImage(this ILogger logger, IImage image)
151167

152168
public static void DockerNetworkCreated(this ILogger logger, string id)
153169
{
154-
_DockerNetworkCreated(logger, id, null);
170+
_DockerNetworkCreated(logger, TruncId(id), null);
155171
}
156172

157173
public static void DeleteDockerNetwork(this ILogger logger, string id)
158174
{
159-
_DeleteDockerNetwork(logger, id, null);
175+
_DeleteDockerNetwork(logger, TruncId(id), null);
160176
}
161177

162178
public static void DockerVolumeCreated(this ILogger logger, string name)
@@ -205,5 +221,10 @@ public static void DockerRegistryCredentialFound(this ILogger logger, string doc
205221
{
206222
_DockerRegistryCredentialFound(logger, dockerRegistry, null);
207223
}
224+
225+
private static string TruncId(string id)
226+
{
227+
return id.Substring(0, Math.Min(12, id.Length));
228+
}
208229
}
209230
}

0 commit comments

Comments
 (0)