Skip to content

Commit d40bc43

Browse files
desdesdesRob-Hague
andauthored
Refactor logging to allow a loggerfactory per session (#1673)
* Refactor logging to allow a loggerfactory per session specified in the ConnectionInfo. This commit introduces an `ILoggerFactory` to various classes, replacing the static logger factory with an instance-based approach for more flexible and session-specific logging. These changes improve the logging framework's flexibility and maintainability and allow unit testing of logging. * Improvements bases on feedback. Fixed tests. Added documentation. * Update src/Renci.SshNet/ConnectionInfo.cs --------- Co-authored-by: Rob Hague <[email protected]>
1 parent fc988bd commit d40bc43

File tree

138 files changed

+387
-64
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

138 files changed

+387
-64
lines changed

docfx/logging.md

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,31 @@
11
Logging
22
=================
33

4-
SSH.NET uses the [Microsoft.Extensions.Logging](https://learn.microsoft.com/dotnet/core/extensions/logging) API to log diagnostic messages. In order to access the log messages of SSH.NET in your own application for diagnosis, register your own `ILoggerFactory` before using the SSH.NET APIs, for example:
4+
SSH.NET uses the [Microsoft.Extensions.Logging](https://learn.microsoft.com/dotnet/core/extensions/logging) API to log diagnostic messages.
5+
6+
It is possible to specify a logger in the `ConnectionInfo`, for example:
7+
8+
```cs
9+
using Microsoft.Extensions.Logging;
10+
11+
ILoggerFactory loggerFactory = LoggerFactory.Create(builder =>
12+
{
13+
builder.SetMinimumLevel(LogLevel.Debug);
14+
builder.AddConsole();
15+
});
16+
17+
var connectionInfo = new ConnectionInfo("sftp.foo.com",
18+
"guest",
19+
new PasswordAuthenticationMethod("guest", "pwd"));
20+
21+
connectionInfo.LoggerFactory = loggerFactory;
22+
using (var client = new SftpClient(connectionInfo))
23+
{
24+
client.Connect();
25+
}
26+
```
27+
28+
You can also register an application-wide `ILoggerFactory` before using the SSH.NET APIs, this will be used as a fallback if the `ConnectionInfo` is not set, for example:
529

630
```cs
731
using Microsoft.Extensions.Logging;

src/Renci.SshNet/BaseClient.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,7 @@ private protected BaseClient(ConnectionInfo connectionInfo, bool ownsConnectionI
192192
_connectionInfo = connectionInfo;
193193
_ownsConnectionInfo = ownsConnectionInfo;
194194
_serviceFactory = serviceFactory;
195-
_logger = SshNetLoggingConfiguration.LoggerFactory.CreateLogger(GetType());
195+
_logger = (connectionInfo.LoggerFactory ?? SshNetLoggingConfiguration.LoggerFactory).CreateLogger(GetType());
196196
_keepAliveInterval = Timeout.InfiniteTimeSpan;
197197
}
198198

src/Renci.SshNet/Channels/Channel.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ protected Channel(ISession session, uint localChannelNumber, uint localWindowSiz
8484
LocalChannelNumber = localChannelNumber;
8585
LocalPacketSize = localPacketSize;
8686
LocalWindowSize = localWindowSize;
87-
_logger = SshNetLoggingConfiguration.LoggerFactory.CreateLogger(GetType());
87+
_logger = session.SessionLoggerFactory.CreateLogger(GetType());
8888

8989
session.ChannelWindowAdjustReceived += OnChannelWindowAdjust;
9090
session.ChannelDataReceived += OnChannelData;

src/Renci.SshNet/Channels/ChannelDirectTcpip.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ internal sealed class ChannelDirectTcpip : ClientChannel, IChannelDirectTcpip
3333
public ChannelDirectTcpip(ISession session, uint localChannelNumber, uint localWindowSize, uint localPacketSize)
3434
: base(session, localChannelNumber, localWindowSize, localPacketSize)
3535
{
36-
_logger = SshNetLoggingConfiguration.LoggerFactory.CreateLogger<ChannelDirectTcpip>();
36+
_logger = session.SessionLoggerFactory.CreateLogger<ChannelDirectTcpip>();
3737
}
3838

3939
/// <summary>

src/Renci.SshNet/Channels/ChannelForwardedTcpip.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ internal ChannelForwardedTcpip(ISession session,
4848
remoteWindowSize,
4949
remotePacketSize)
5050
{
51-
_logger = SshNetLoggingConfiguration.LoggerFactory.CreateLogger<ChannelForwardedTcpip>();
51+
_logger = session.SessionLoggerFactory.CreateLogger<ChannelForwardedTcpip>();
5252
}
5353

5454
/// <summary>

src/Renci.SshNet/Connection/ConnectorBase.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,12 @@ internal abstract class ConnectorBase : IConnector
1616
{
1717
private readonly ILogger _logger;
1818

19-
protected ConnectorBase(ISocketFactory socketFactory)
19+
protected ConnectorBase(ISocketFactory socketFactory, ILoggerFactory loggerFactory)
2020
{
2121
ThrowHelper.ThrowIfNull(socketFactory);
2222

2323
SocketFactory = socketFactory;
24-
_logger = SshNetLoggingConfiguration.LoggerFactory.CreateLogger(GetType());
24+
_logger = loggerFactory.CreateLogger(GetType());
2525
}
2626

2727
internal ISocketFactory SocketFactory { get; private set; }

src/Renci.SshNet/Connection/DirectConnector.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,14 @@
22
using System.Net.Sockets;
33
using System.Threading;
44

5+
using Microsoft.Extensions.Logging;
6+
57
namespace Renci.SshNet.Connection
68
{
79
internal sealed class DirectConnector : ConnectorBase
810
{
9-
public DirectConnector(ISocketFactory socketFactory)
10-
: base(socketFactory)
11+
public DirectConnector(ISocketFactory socketFactory, ILoggerFactory loggerFactory)
12+
: base(socketFactory, loggerFactory)
1113
{
1214
}
1315

src/Renci.SshNet/Connection/HttpConnector.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
using System.Net.Sockets;
66
using System.Text.RegularExpressions;
77

8+
using Microsoft.Extensions.Logging;
9+
810
using Renci.SshNet.Abstractions;
911
using Renci.SshNet.Common;
1012

@@ -48,8 +50,8 @@ internal sealed partial class HttpConnector : ProxyConnector
4850
private static readonly Regex HttpHeaderRegex = new Regex(HttpHeaderPattern, RegexOptions.Compiled);
4951
#endif
5052

51-
public HttpConnector(ISocketFactory socketFactory)
52-
: base(socketFactory)
53+
public HttpConnector(ISocketFactory socketFactory, ILoggerFactory loggerFactory)
54+
: base(socketFactory, loggerFactory)
5355
{
5456
}
5557

src/Renci.SshNet/Connection/ProxyConnector.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
using System.Threading;
55
using System.Threading.Tasks;
66

7+
using Microsoft.Extensions.Logging;
8+
79
namespace Renci.SshNet.Connection
810
{
911
/// <summary>
@@ -12,8 +14,8 @@ namespace Renci.SshNet.Connection
1214
/// </summary>
1315
internal abstract class ProxyConnector : ConnectorBase
1416
{
15-
protected ProxyConnector(ISocketFactory socketFactory)
16-
: base(socketFactory)
17+
protected ProxyConnector(ISocketFactory socketFactory, ILoggerFactory loggerFactory)
18+
: base(socketFactory, loggerFactory)
1719
{
1820
}
1921

src/Renci.SshNet/Connection/Socks4Connector.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
using System.Net.Sockets;
55
using System.Text;
66

7+
using Microsoft.Extensions.Logging;
8+
79
using Renci.SshNet.Abstractions;
810
using Renci.SshNet.Common;
911

@@ -17,8 +19,8 @@ namespace Renci.SshNet.Connection
1719
/// </remarks>
1820
internal sealed class Socks4Connector : ProxyConnector
1921
{
20-
public Socks4Connector(ISocketFactory socketFactory)
21-
: base(socketFactory)
22+
public Socks4Connector(ISocketFactory socketFactory, ILoggerFactory loggerFactory)
23+
: base(socketFactory, loggerFactory)
2224
{
2325
}
2426

0 commit comments

Comments
 (0)