* Initial implementation of log activity + base sink * Refactor logging implementation: replace `Elsa.ProcessLogging` with a new modular `Elsa.Logging` framework, introducing support for configurable log sinks, enhanced logging extensibility, and updated dependencies in consuming projects. * Enhance logging framework: introduce custom `NullableBoolConverter` and update JSON serialization/deserialization logic for log sink handling. * Update description for `Log` activity input: clarify target sinks configuration * Set default value of `SinkNames` input in `Log` activity to non-nullable collection * Set `DisplayName` for `Sinks` input in `Log` activity * Refactor logging framework: update `ILogSink` and `ILogSinkRouter` to support arguments and attributes, enhance `Log` activity to use updated interfaces, and add default category handling. * Refactor logging framework: simplify argument handling in `ILogSink` and `ILogSinkRouter`, update `Log` activity inputs, and improve message formatting in `MelLogSink`. * Update logging framework to simplify log sink creation, enhance category filtering, and refactor `ILogSink`/`ILogSinkRouter` interface methods. * Introduce modular logging framework enhancements: add `Console` and `Serilog` logging features, refactor `ILogSink` framework, and update projects to align with a modular architecture. * Refactor logging framework: introduce `AddCategoryFilters` extension, replace `DefaultCategory` handling with enhanced category filters, and update sink creation logic for consistency. * Refactor logging framework: rename `SinkOptions` to `LogSinkOptions`, standardize naming across log sink types, and update configuration and sink factory logic for consistency. * Enhance logging framework: add `ConfigureDefaults` methods, update `ILogSinkCatalog` to use `IServiceScopeFactory`, and improve logging configuration handling and defaults setup. * Introduce asynchronous log entry processing: add `ILogEntryQueue`, `LogEntryBackgroundWorker`, and related models to enable queue-based logging and background processing. Update `Log` activity to enqueue log entries for processing. * Add unit and integration tests for `Elsa.Logging.Core` library, refactor logger setup in `Elsa.Server.Web`, enhance logging configuration, and standardize `Directory.Packages.props` file. * Apply suggestion from @Copilot Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Add documentation comments to logging framework classes, interfaces, methods, and factories to enhance code readability and maintainability. Remove unused `CustomPurpleConsoleFormatter` class and `logs` folder from server project. * Apply suggestion from @Copilot Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Make `LogEntryInstruction` and `LogEntryQueue` classes public and simplify return statement in `LogSinkCatalog.ListAsync` method. * Standardize terminology in `ILogSink` interface and `LoggerSink` implementation: rename `properties` to `attributes`. Update project files and solution structure to reflect integration test additions. * Apply suggestion from @Copilot Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Apply suggestion from @Copilot Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update documentation comments in `LoggingFeature` and `LogEntryInstruction` to clarify functionality and improve precision. * Add README for `Elsa.Logging` module with configuration examples, usage details, and extension guidance. * Add `Dictionary` UI hint to `InputUIHints` and update `Attributes` in `Log` activity to use it. * Update `Log` activity default category to "Process", add integration tests for logging, and enhance null safety in `ConfigurationLogSinkProvider`. * Remove `UseLoggingFramework` middleware from `Program.cs` to streamline workflow initialization. --------- Co-authored-by: lucas.hipolito <lukhipolito@yahoo.com.br> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
60 lines
2 KiB
C#
60 lines
2 KiB
C#
using System.Collections.Immutable;
|
|
using Elsa.Logging.Activities;
|
|
using Elsa.Logging.Contracts;
|
|
using Elsa.Logging.Extensions;
|
|
using Elsa.Logging.Models;
|
|
using Elsa.Testing.Shared;
|
|
using Microsoft.Extensions.DependencyInjection;
|
|
using Microsoft.Extensions.Logging;
|
|
using Xunit.Abstractions;
|
|
|
|
namespace Elsa.Logging.Core.IntegrationTests;
|
|
|
|
public class LogActivityTests
|
|
{
|
|
private readonly CapturingTextWriter _capturingTextWriter = new();
|
|
private readonly IServiceProvider _services;
|
|
|
|
public LogActivityTests(ITestOutputHelper testOutputHelper)
|
|
{
|
|
var applicationBuilder = new TestApplicationBuilder(testOutputHelper)
|
|
.WithCapturingTextWriter(_capturingTextWriter)
|
|
.ConfigureElsa(elsa =>
|
|
{
|
|
elsa.Services.AddSingleton<ILogEntryQueue, TestLogEntryQueue>();
|
|
elsa.UseLoggingFramework();
|
|
});
|
|
_services = applicationBuilder.Build();
|
|
}
|
|
|
|
[Fact(DisplayName = "The Log activity logs the expected message")]
|
|
public async Task Test1()
|
|
{
|
|
var activity = new Log("Hello {Name}", LogLevel.Debug);
|
|
await _services.RunActivityAsync(activity);
|
|
var logEntryQueue = _services.GetRequiredService<ILogEntryQueue>();
|
|
var logEntry = await logEntryQueue.DequeueAsync().FirstAsync();
|
|
Assert.Equal("Hello {Name}", logEntry.Message);
|
|
Assert.Equal(LogLevel.Debug, logEntry.Level);
|
|
Assert.Equal("Process", logEntry.Category);
|
|
}
|
|
}
|
|
|
|
public class TestLogEntryQueue : ILogEntryQueue
|
|
{
|
|
private IImmutableQueue<LogEntryInstruction> _queue = ImmutableQueue<LogEntryInstruction>.Empty;
|
|
public ValueTask EnqueueAsync(LogEntryInstruction instruction)
|
|
{
|
|
_queue = _queue.Enqueue(instruction);
|
|
return ValueTask.CompletedTask;
|
|
}
|
|
|
|
public async IAsyncEnumerable<LogEntryInstruction> DequeueAsync()
|
|
{
|
|
while (!_queue.IsEmpty)
|
|
{
|
|
_queue = _queue.Dequeue(out var instruction);
|
|
yield return instruction;
|
|
}
|
|
}
|
|
} |