Skip to content

Refactor: Structured logging. #1201

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

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -19,12 +19,11 @@
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.Common;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using FirebirdSql.Data.Common;
using FirebirdSql.Data.Logging;
using Microsoft.Extensions.Logging;

namespace FirebirdSql.Data.FirebirdClient;

@@ -33,7 +32,7 @@ public sealed class FbBatchCommand : IFbPreparedCommand, IDescriptorFiller, IDis
, IAsyncDisposable
#endif
{
static readonly IFbLogger Log = FbLogManager.CreateLogger(nameof(FbBatchCommand));
static readonly ILogger<FbBatchCommand> Log = FbLogManager.CreateLogger<FbBatchCommand>();

private const int DefaultBatchBufferSize = 16 * 1024 * 1024;

Original file line number Diff line number Diff line change
@@ -25,12 +25,13 @@
using System.Threading.Tasks;
using FirebirdSql.Data.Common;
using FirebirdSql.Data.Logging;
using Microsoft.Extensions.Logging;

namespace FirebirdSql.Data.FirebirdClient;

public sealed class FbCommand : DbCommand, IFbPreparedCommand, IDescriptorFiller, ICloneable
{
static readonly IFbLogger Log = FbLogManager.CreateLogger(nameof(FbCommand));
static readonly ILogger<FbCommand> Log = FbLogManager.CreateLogger<FbCommand>();

#region Fields

Original file line number Diff line number Diff line change
@@ -23,13 +23,14 @@
using System.Threading.Tasks;
using FirebirdSql.Data.Common;
using FirebirdSql.Data.Logging;
using Microsoft.Extensions.Logging;

namespace FirebirdSql.Data.FirebirdClient;

[DefaultEvent("InfoMessage")]
public sealed class FbConnection : DbConnection, ICloneable
{
static readonly IFbLogger Log = FbLogManager.CreateLogger(nameof(FbConnection));
static readonly ILogger<FbConnection> Log = FbLogManager.CreateLogger<FbConnection>();

#region Static Pool Handling Methods

Original file line number Diff line number Diff line change
@@ -22,12 +22,13 @@
using System.Threading.Tasks;
using FirebirdSql.Data.Common;
using FirebirdSql.Data.Logging;
using Microsoft.Extensions.Logging;

namespace FirebirdSql.Data.FirebirdClient;

public sealed class FbTransaction : DbTransaction
{
static readonly IFbLogger Log = FbLogManager.CreateLogger(nameof(FbTransaction));
static readonly ILogger<FbTransaction> Log = FbLogManager.CreateLogger<FbTransaction>();

internal const IsolationLevel DefaultIsolationLevel = IsolationLevel.ReadCommitted;

Original file line number Diff line number Diff line change
@@ -61,6 +61,7 @@
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="8.0.2" />
</ItemGroup>
<ItemGroup>
<Compile Update="FirebirdClient\FbBatchCommand.cs" />

This file was deleted.

28 changes: 0 additions & 28 deletions src/FirebirdSql.Data.FirebirdClient/Logging/FbLogLevel.cs

This file was deleted.

33 changes: 11 additions & 22 deletions src/FirebirdSql.Data.FirebirdClient/Logging/FbLogManager.cs
Original file line number Diff line number Diff line change
@@ -15,37 +15,26 @@

//$Authors = Jiri Cincura (jiri@cincura.net)

using System;
using Microsoft.Extensions.Logging.Abstractions;
using Microsoft.Extensions.Logging;

namespace FirebirdSql.Data.Logging;

public static class FbLogManager
{
public static IFbLoggingProvider Provider
{
get
{
_providerRetrieved = true;
return _provider;
}
set
{
if (_providerRetrieved)
throw new InvalidOperationException("The logging provider must be set before any action is taken");
internal static ILoggerFactory LoggerFactory = NullLoggerFactory.Instance;
internal static bool IsParameterLoggingEnabled = false;

_provider = value ?? throw new ArgumentNullException(nameof(value));
}
public static void UseLoggerFactory(ILoggerFactory loggerFactory)
{
LoggerFactory = loggerFactory;
}

public static bool IsParameterLoggingEnabled { get; set; }

static IFbLoggingProvider _provider;
static bool _providerRetrieved;

static FbLogManager()
public static void EnableParameterLogging(bool enable = true)
{
_provider = new NullLoggingProvider();
IsParameterLoggingEnabled = enable;
}

internal static IFbLogger CreateLogger(string name) => Provider.CreateLogger("FirebirdClient." + name);
internal static ILogger<T> CreateLogger<T>() =>
LoggerFactory.CreateLogger<T>();
}
43 changes: 0 additions & 43 deletions src/FirebirdSql.Data.FirebirdClient/Logging/IFbLogger.cs

This file was deleted.

23 changes: 0 additions & 23 deletions src/FirebirdSql.Data.FirebirdClient/Logging/IFbLoggingProvider.cs

This file was deleted.

308 changes: 78 additions & 230 deletions src/FirebirdSql.Data.FirebirdClient/Logging/LogMessages.cs
Original file line number Diff line number Diff line change
@@ -16,274 +16,122 @@
//$Authors = Jiri Cincura (jiri@cincura.net)

using System;
using System.Text;
using System.Collections.Generic;
using System.Data.Common;
using System.Linq;
using FirebirdSql.Data.FirebirdClient;
using Microsoft.Extensions.Logging;

namespace FirebirdSql.Data.Logging;

static class LogMessages
{
public static void CommandExecution(IFbLogger log, FbCommand command)
public static void CommandExecution(ILogger log, FbCommand command)
{
if (!log.IsEnabled(FbLogLevel.Debug))
return;

var sb = new StringBuilder();
sb.AppendLine("Command execution:");
sb.AppendLine(command.CommandText);
if (FbLogManager.IsParameterLoggingEnabled)
if (!log.IsEnabled(LogLevel.Debug))
{
sb.AppendLine("Parameters:");
if (!command.HasParameters)
{
sb.AppendLine("<no parameters>");
}
else
{
foreach (FbParameter parameter in command.Parameters)
{
var name = parameter.ParameterName;
var type = parameter.FbDbType;
var value = !IsNullParameterValue(parameter.InternalValue) ? parameter.InternalValue : "<null>";
sb.AppendLine($"Name:{name}\tType:{type}\tUsed Value:{value}");
}
}
}
log.Debug(sb.ToString());
}
public static void CommandExecution(IFbLogger log, FbBatchCommand command)
{
if (!log.IsEnabled(FbLogLevel.Debug))
return;
}

var sb = new StringBuilder();
sb.AppendLine("Command execution:");
sb.AppendLine(command.CommandText);
if (FbLogManager.IsParameterLoggingEnabled)
if (!FbLogManager.IsParameterLoggingEnabled || !command.HasParameters)
{
sb.AppendLine("Parameters:");
if (command.HasParameters)
{
sb.AppendLine("<no parameters>");
}
else
{
foreach (var batchParameter in command.BatchParameters)
{
foreach (FbParameter parameter in batchParameter)
{
var name = parameter.ParameterName;
var type = parameter.FbDbType;
var value = !IsNullParameterValue(parameter.InternalValue) ? parameter.InternalValue : "<null>";
sb.AppendLine($"Name:{name}\tType:{type}\tUsed Value:{value}");
}
}
}
log.LogDebug("Command execution: {command}", command.CommandText);
return;
}
log.Debug(sb.ToString());

var parameters = FbParameterCollectionToDictionary(command.Parameters);
log.LogDebug("Command execution: {command}, {parameters}", command.CommandText, parameters);
}

public static void ConnectionOpening(IFbLogger log, FbConnection connection)
public static void CommandExecution(ILogger log, FbBatchCommand command)
{
if (!log.IsEnabled(FbLogLevel.Debug))
if (!log.IsEnabled(LogLevel.Debug))
{
return;
}

var sb = new StringBuilder();
sb.AppendLine("Opening connection:");
sb.AppendLine($"Connection String: {connection.ConnectionString}");
log.Debug(sb.ToString());
}
public static void ConnectionOpened(IFbLogger log, FbConnection connection)
{
if (!log.IsEnabled(FbLogLevel.Debug))
if (!FbLogManager.IsParameterLoggingEnabled || !command.HasParameters)
{
log.LogDebug("Command execution: {command}", command.CommandText);
return;
}

var sb = new StringBuilder();
sb.AppendLine("Opened connection:");
sb.AppendLine($"Connection String: {connection.ConnectionString}");
log.Debug(sb.ToString());
var parameters = command.BatchParameters.SelectMany(FbParameterCollectionToDictionary);
log.LogDebug("Command execution: {command}, {parameters}", command.CommandText, parameters);
}
public static void ConnectionClosing(IFbLogger log, FbConnection connection)
{
if (!log.IsEnabled(FbLogLevel.Debug))
return;

var sb = new StringBuilder();
sb.AppendLine("Closing connection:");
sb.AppendLine($"Connection String: {connection.ConnectionString}");
log.Debug(sb.ToString());
}
public static void ConnectionClosed(IFbLogger log, FbConnection connection)
{
if (!log.IsEnabled(FbLogLevel.Debug))
return;
public static void ConnectionOpening(ILogger log, FbConnection connection) =>
log.LogDebug("Opening connection: {connectionString}", connection.ConnectionString);

var sb = new StringBuilder();
sb.AppendLine("Closed connection:");
sb.AppendLine($"Connection String: {connection.ConnectionString}");
log.Debug(sb.ToString());
}
public static void ConnectionOpened(ILogger log, FbConnection connection) =>
log.LogDebug("Opened connection: {connectionString}", connection.ConnectionString);

public static void TransactionBeginning(IFbLogger log, FbTransaction transaction)
{
if (!log.IsEnabled(FbLogLevel.Debug))
return;
public static void ConnectionClosing(ILogger log, FbConnection connection) =>
log.LogDebug("Closing connection: {connectionString}", connection.ConnectionString);

var sb = new StringBuilder();
sb.AppendLine("Beginning transaction:");
sb.AppendLine($"Isolation Level: {transaction.IsolationLevel}");
log.Debug(sb.ToString());
}
public static void TransactionBegan(IFbLogger log, FbTransaction transaction)
{
if (!log.IsEnabled(FbLogLevel.Debug))
return;
public static void ConnectionClosed(ILogger log, FbConnection connection) =>
log.LogDebug("Closed connection: {connectionString}", connection.ConnectionString);

var sb = new StringBuilder();
sb.AppendLine("Began transaction:");
sb.AppendLine($"Isolation Level: {transaction.IsolationLevel}");
log.Debug(sb.ToString());
}
public static void TransactionCommitting(IFbLogger log, FbTransaction transaction)
{
if (!log.IsEnabled(FbLogLevel.Debug))
return;
public static void TransactionBeginning(ILogger log, FbTransaction transaction) =>
// TODO: Transaction Id?
log.LogDebug("Beginning transaction: {isolationLevel}", transaction.IsolationLevel);

var sb = new StringBuilder();
sb.AppendLine("Committing transaction:");
sb.AppendLine($"Isolation Level: {transaction.IsolationLevel}");
log.Debug(sb.ToString());
}
public static void TransactionCommitted(IFbLogger log, FbTransaction transaction)
{
if (!log.IsEnabled(FbLogLevel.Debug))
return;
public static void TransactionBegan(ILogger log, FbTransaction transaction) =>
log.LogDebug("Began transaction: {isolationLevel}", transaction.IsolationLevel);

var sb = new StringBuilder();
sb.AppendLine("Committed transaction:");
sb.AppendLine($"Isolation Level: {transaction.IsolationLevel}");
log.Debug(sb.ToString());
}
public static void TransactionRollingBack(IFbLogger log, FbTransaction transaction)
{
if (!log.IsEnabled(FbLogLevel.Debug))
return;
public static void TransactionCommitting(ILogger log, FbTransaction transaction) =>
log.LogDebug("Committing transaction: {isolationLevel}", transaction.IsolationLevel);

var sb = new StringBuilder();
sb.AppendLine("Rolling back transaction:");
sb.AppendLine($"Isolation Level: {transaction.IsolationLevel}");
log.Debug(sb.ToString());
}
public static void TransactionRolledBack(IFbLogger log, FbTransaction transaction)
{
if (!log.IsEnabled(FbLogLevel.Debug))
return;
public static void TransactionCommitted(ILogger log, FbTransaction transaction) =>
log.LogDebug("Committed transaction: {isolationLevel}", transaction.IsolationLevel);

var sb = new StringBuilder();
sb.AppendLine("Rolled back transaction:");
sb.AppendLine($"Isolation Level: {transaction.IsolationLevel}");
log.Debug(sb.ToString());
}
public static void TransactionSaving(IFbLogger log, FbTransaction transaction)
{
if (!log.IsEnabled(FbLogLevel.Debug))
return;
public static void TransactionRollingBack(ILogger log, FbTransaction transaction) =>
log.LogDebug("Rolling back transaction: {isolationLevel}", transaction.IsolationLevel);

var sb = new StringBuilder();
sb.AppendLine("Creating savepoint:");
sb.AppendLine($"Isolation Level: {transaction.IsolationLevel}");
log.Debug(sb.ToString());
}
public static void TransactionSaved(IFbLogger log, FbTransaction transaction)
{
if (!log.IsEnabled(FbLogLevel.Debug))
return;
public static void TransactionRolledBack(ILogger log, FbTransaction transaction) =>
log.LogDebug("Rolled back transaction: {isolationLevel}", transaction.IsolationLevel);

var sb = new StringBuilder();
sb.AppendLine("Created savepoint:");
sb.AppendLine($"Isolation Level: {transaction.IsolationLevel}");
log.Debug(sb.ToString());
}
public static void TransactionReleasingSavepoint(IFbLogger log, FbTransaction transaction)
{
if (!log.IsEnabled(FbLogLevel.Debug))
return;
public static void TransactionSaving(ILogger log, FbTransaction transaction) =>
log.LogDebug("Creating savepoint: {isolationLevel}", transaction.IsolationLevel);

var sb = new StringBuilder();
sb.AppendLine("Releasing savepoint:");
sb.AppendLine($"Isolation Level: {transaction.IsolationLevel}");
log.Debug(sb.ToString());
}
public static void TransactionReleasedSavepoint(IFbLogger log, FbTransaction transaction)
{
if (!log.IsEnabled(FbLogLevel.Debug))
return;
public static void TransactionSaved(ILogger log, FbTransaction transaction) =>
log.LogDebug("Created savepoint: {isolationLevel}", transaction.IsolationLevel);

var sb = new StringBuilder();
sb.AppendLine("Released savepoint:");
sb.AppendLine($"Isolation Level: {transaction.IsolationLevel}");
log.Debug(sb.ToString());
}
public static void TransactionRollingBackSavepoint(IFbLogger log, FbTransaction transaction)
{
if (!log.IsEnabled(FbLogLevel.Debug))
return;
public static void TransactionReleasingSavepoint(ILogger log, FbTransaction transaction) =>
log.LogDebug("Releasing savepoint: {isolationLevel}", transaction.IsolationLevel);

var sb = new StringBuilder();
sb.AppendLine("Rolling back savepoint:");
sb.AppendLine($"Isolation Level: {transaction.IsolationLevel}");
log.Debug(sb.ToString());
}
public static void TransactionRolledBackSavepoint(IFbLogger log, FbTransaction transaction)
{
if (!log.IsEnabled(FbLogLevel.Debug))
return;
public static void TransactionReleasedSavepoint(ILogger log, FbTransaction transaction) =>
log.LogDebug("Released savepoint: {isolationLevel}", transaction.IsolationLevel);

var sb = new StringBuilder();
sb.AppendLine("Rolled back savepoint:");
sb.AppendLine($"Isolation Level: {transaction.IsolationLevel}");
log.Debug(sb.ToString());
}
public static void TransactionCommittingRetaining(IFbLogger log, FbTransaction transaction)
{
if (!log.IsEnabled(FbLogLevel.Debug))
return;
public static void TransactionRollingBackSavepoint(ILogger log, FbTransaction transaction) =>
log.LogDebug("Rolling back savepoint: {isolationLevel}", transaction.IsolationLevel);

var sb = new StringBuilder();
sb.AppendLine("Committing (retaining) transaction:");
sb.AppendLine($"Isolation Level: {transaction.IsolationLevel}");
log.Debug(sb.ToString());
}
public static void TransactionCommittedRetaining(IFbLogger log, FbTransaction transaction)
{
if (!log.IsEnabled(FbLogLevel.Debug))
return;
public static void TransactionRolledBackSavepoint(ILogger log, FbTransaction transaction) =>
log.LogDebug("Rolled back savepoint: {isolationLevel}", transaction.IsolationLevel);

var sb = new StringBuilder();
sb.AppendLine("Committed (retaining) transaction:");
sb.AppendLine($"Isolation Level: {transaction.IsolationLevel}");
log.Debug(sb.ToString());
}
public static void TransactionRollingBackRetaining(IFbLogger log, FbTransaction transaction)
{
if (!log.IsEnabled(FbLogLevel.Debug))
return;
public static void TransactionCommittingRetaining(ILogger log, FbTransaction transaction) =>
log.LogDebug("Committing (retaining) transaction: {isolationLevel}", transaction.IsolationLevel);

var sb = new StringBuilder();
sb.AppendLine("Rolling back (retaining) transaction:");
sb.AppendLine($"Isolation Level: {transaction.IsolationLevel}");
log.Debug(sb.ToString());
}
public static void TransactionRolledBackRetaining(IFbLogger log, FbTransaction transaction)
{
if (!log.IsEnabled(FbLogLevel.Debug))
return;
public static void TransactionCommittedRetaining(ILogger log, FbTransaction transaction) =>
log.LogDebug("Committed (retaining) transaction: {isolationLevel}", transaction.IsolationLevel);

var sb = new StringBuilder();
sb.AppendLine("Rolled back (retaining) transaction:");
sb.AppendLine($"Isolation Level: {transaction.IsolationLevel}");
log.Debug(sb.ToString());
}
public static void TransactionRollingBackRetaining(ILogger log, FbTransaction transaction) =>
log.LogDebug("Rolling back (retaining) transaction: {isolationLevel}", transaction.IsolationLevel);

public static void TransactionRolledBackRetaining(ILogger log, FbTransaction transaction) =>
log.LogDebug("Rolled back (retaining) transaction: {isolationLevel}", transaction.IsolationLevel);

private static object NormalizeDbNull(object value) =>
value == DBNull.Value || value == null
? null
: value;

static bool IsNullParameterValue(object value) => value == DBNull.Value || value == null;
private static Dictionary<string, object> FbParameterCollectionToDictionary(FbParameterCollection parameters) =>
parameters
.Cast<DbParameter>()
.ToList()
.ToDictionary(
p => p.ParameterName,
p => NormalizeDbNull(p.Value)
);
}
36 changes: 0 additions & 36 deletions src/FirebirdSql.Data.FirebirdClient/Logging/NullLoggingProvider.cs

This file was deleted.