Overview

edit

Meziantou.Extensions.Logging.InMemory provides a logger that keeps every entry in a collection, with its level, its category, its message, its parameters and its scopes. Tests pass the logger to the code under test, then assert on the entries.

using var loggerProvider = new InMemoryLoggerProvider();
var logger = loggerProvider.CreateLogger("sample");
var typedLogger = loggerProvider.CreateLogger<Sample>();

// Short version if you need a single logger instance:
var singleLogger = InMemoryLogger.CreateLogger("sample");
var singleTypedLogger = InMemoryLogger.CreateLogger<Sample>();

// do stuff with the logger
logger.LogInformation(new EventId(1), "This is a test");
typedLogger.LogWarning("Something to check");
singleLogger.LogInformation("Only in the logs of singleLogger");

Assert.Empty(loggerProvider.Logs.Errors);
Assert.Single(loggerProvider.Logs, log => log.Message.Contains("test", StringComparison.Ordinal) && log.EventId.Id == 1);
Assert.Single(loggerProvider.Logs.Warnings);
Assert.Single(singleLogger.Logs);
Assert.Empty(singleTypedLogger.Logs);

There are two ways to create a logger:

The category of CreateLogger<T>() is the full name of T, as with ILogger<T>.

The logger accepts every level but LogLevel.None. When it is created by a logger factory or a host, the filters of the logging configuration apply as for any provider.

Pages