* 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>
49 lines
1.5 KiB
C#
49 lines
1.5 KiB
C#
using Elsa.Logging.Services;
|
|
using Elsa.Logging.Contracts;
|
|
using Elsa.Logging.Options;
|
|
using Microsoft.Extensions.Logging;
|
|
using Microsoft.Extensions.Options;
|
|
using Moq;
|
|
|
|
namespace Elsa.Logging.Core.UnitTests;
|
|
|
|
public class LogSinkRouterTests
|
|
{
|
|
[Fact]
|
|
public async Task WriteAsync_ShouldCallSinkWithLogEntry()
|
|
{
|
|
var sinkMock = new Mock<ILogSink>();
|
|
sinkMock.Setup(s => s.Name).Returns("TestSink");
|
|
sinkMock.Setup(s => s.WriteAsync(
|
|
It.IsAny<string>(),
|
|
It.IsAny<LogLevel>(),
|
|
It.IsAny<string>(),
|
|
It.IsAny<object>(),
|
|
It.IsAny<IDictionary<string, object?>>(),
|
|
It.IsAny<CancellationToken>())).Returns(ValueTask.CompletedTask);
|
|
|
|
var catalogMock = new Mock<ILogSinkCatalog>();
|
|
catalogMock.Setup(c => c.ListAsync(CancellationToken.None)).ReturnsAsync(new List<ILogSink>
|
|
{
|
|
sinkMock.Object
|
|
});
|
|
|
|
var optionsMock = new Mock<IOptions<LoggingOptions>>();
|
|
optionsMock.Setup(o => o.Value).Returns(new LoggingOptions
|
|
{
|
|
Defaults = ["TestSink"]
|
|
});
|
|
|
|
var router = new LogSinkRouter(catalogMock.Object, optionsMock.Object);
|
|
await router.WriteAsync([
|
|
"TestSink"
|
|
], "TestLogger", LogLevel.Information, "Test message", null, null);
|
|
sinkMock.Verify(s => s.WriteAsync(
|
|
"TestLogger",
|
|
LogLevel.Information,
|
|
"Test message",
|
|
null,
|
|
null,
|
|
It.IsAny<CancellationToken>()), Times.Once);
|
|
}
|
|
} |