Invex.Extensions.Logging.File
0.3.0
See the version list below for details.
dotnet add package Invex.Extensions.Logging.File --version 0.3.0
NuGet\Install-Package Invex.Extensions.Logging.File -Version 0.3.0
<PackageReference Include="Invex.Extensions.Logging.File" Version="0.3.0" />
<PackageVersion Include="Invex.Extensions.Logging.File" Version="0.3.0" />
<PackageReference Include="Invex.Extensions.Logging.File" />
paket add Invex.Extensions.Logging.File --version 0.3.0
#r "nuget: Invex.Extensions.Logging.File, 0.3.0"
#:package Invex.Extensions.Logging.File@0.3.0
#addin nuget:?package=Invex.Extensions.Logging.File&version=0.3.0
#tool nuget:?package=Invex.Extensions.Logging.File&version=0.3.0
Invex Logging Extensions
Useful utilities for Microsoft.Extensions.Logging.
Package
Invex.Extensions.Logging.File is a
dependency-light file logger provider with:
- size- and elapsed-time-based rollover;
- per-log-name retention limits;
- optional routing by log level;
- buffered or synchronous writing; and
- runtime configuration reload through the standard options pipeline.
The package targets net10.0, net9.0, net8.0, and netstandard2.0.
Quick start
Install the package:
dotnet add package Invex.Extensions.Logging.File
Register the provider with an ASP.NET Core or Generic Host application:
using Invex.Extensions.Logging.File;
var builder = WebApplication.CreateBuilder(args);
builder.Logging.AddFile();
var app = builder.Build();
It can also be used with a manually created logger factory:
using Invex.Extensions.Logging.File;
using Microsoft.Extensions.Logging;
using var loggerFactory = LoggerFactory.Create(logging => logging.AddFile());
var logger = loggerFactory.CreateLogger<Program>();
logger.LogInformation("Hello from the file logger!");
The default configuration writes to a Logs directory relative to the current working directory. The
active file is named after AppDomain.CurrentDomain.FriendlyName, rolls over daily or at 100 MiB
(whichever happens first), and retains up to 10 GiB of rolled-over files.
Buffered writing is the default. Dispose the host or ILoggerFactory during graceful shutdown so
queued entries are flushed. Entries still in memory can be lost if the process crashes or is killed.
Configuration
The provider uses the alias File, so its settings belong under Logging:File:
{
"Logging": {
"File": {
"LogDirectory": "Logs",
"LogName": "my-app",
"FileSizeLimitBytes": 104857600,
"RolloverInterval": "Day",
"MaxTotalSizeBytes": 10737418240,
"PerLevelLogName": {
"Error": "my-app-errors",
"Critical": "my-app-errors"
}
}
}
}
The same settings can be supplied in code. Values configured by the delegate are applied after values
bound from Logging:File:
using Invex.Extensions.Logging.File;
using Invex.Extensions.Logging.File.Configuration;
using Microsoft.Extensions.Logging;
builder.Logging.AddFile(options =>
{
options.LogDirectory = "Logs";
options.LogName = "my-app";
options.FileSizeLimitBytes = 50L * 1024 * 1024;
options.RolloverInterval = FileRolloverInterval.Hour;
options.MaxTotalSizeBytes = 1L * 1024 * 1024 * 1024;
options.PerLevelLogName[LogLevel.Error] = "my-app-errors";
});
| Option | Default | Description |
|---|---|---|
LogDirectory |
"Logs" |
Absolute directory, or a directory relative to the current working directory. Created when needed. |
LogName |
null |
Active base name without .log; null uses the application domain friendly name. |
PerLevelLogName |
empty | Alternative base names for selected levels. A mapped null also uses the application domain friendly name. |
FileSizeLimitBytes |
100 MiB | Rolls over before a write that would make the active file reach this size. |
RolloverInterval |
Day |
Elapsed interval from file creation: Infinite, Year (365 days), Month (30 days), Day, Hour, or Minute. |
MaxTotalSizeBytes |
10 GiB | Maximum total size of rolled-over files for each base name. The oldest rolled-over file is removed when the limit is reached. |
Configuration changes from reloadable sources are picked up for subsequent writes without restarting. See the configuration guide for the complete reference.
Files, rollover, and retention
The active file is {LogName}.log. When rollover occurs, it is renamed to
{LogName}_{yyMMdd-HHmmss}.log; collisions receive _1, _2, and later suffixes. Time rollover uses
elapsed durations, not calendar boundaries, and checks occur only when an entry is written.
Retention is evaluated independently for each base name and never deletes the active file. Since one rolled-over file is deleted per rollover, an existing directory may take several rollovers to converge after the retention limit is lowered. See file rollover and retention.
Buffered versus direct writing
Buffered mode is the default. Log calls enqueue formatted entries on an unbounded in-memory queue, and a dedicated background thread writes batches of up to 10 entries. This keeps file I/O off application threads, but queued entries may be lost on abrupt process termination.
Use direct mode when the entry must be written before the log call returns:
builder.Logging.AddFile(buffered: false);
Direct mode performs rollover, retention, and file I/O synchronously on the calling thread. Both modes retry failed writes up to five times, report failures to console/debug output, and drop entries that still cannot be written. See buffered versus direct writing.
Filtering and output format
The provider does not apply log-level filtering itself. Use standard logging rules, scoped to the File
provider alias when needed:
{
"Logging": {
"File": {
"LogLevel": {
"Default": "Warning",
"MyApp.Services": "Information"
}
}
}
}
Entries use the format:
[2026-06-11 09:41:23.123 +10:00 INF MyApp.Services.OrderService] Order 42 submitted
Structured message placeholders are rendered by Microsoft.Extensions.Logging; scopes are not included,
and empty formatted messages are skipped. See the log format guide.
Documentation
- Getting started
- Configuration
- File rollover and retention
- Buffered versus direct writing
- Log output format
- API reference
License
Licensed under the terms of LICENSE.txt.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 is compatible. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
| .NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
| .NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen40 was computed. tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.0
- JetBrains.Annotations (>= 2026.2.0)
- Microsoft.Bcl.TimeProvider (>= 10.0.10)
- Microsoft.Extensions.Logging.Configuration (>= 10.0.10)
- System.IO.Abstractions (>= 22.2.0)
- System.Threading.Channels (>= 10.0.10)
-
net10.0
- JetBrains.Annotations (>= 2026.2.0)
- Microsoft.Extensions.Logging.Configuration (>= 10.0.10)
- System.IO.Abstractions (>= 22.2.0)
-
net8.0
- JetBrains.Annotations (>= 2026.2.0)
- Microsoft.Extensions.Logging.Configuration (>= 10.0.10)
- System.IO.Abstractions (>= 22.2.0)
-
net9.0
- JetBrains.Annotations (>= 2026.2.0)
- Microsoft.Extensions.Logging.Configuration (>= 10.0.10)
- System.IO.Abstractions (>= 22.2.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 0.4.0-rc.4 | 32 | 8/14/2026 |
| 0.4.0-rc.2 | 54 | 8/7/2026 |
| 0.3.0 | 100 | 8/3/2026 |
| 0.3.0-rc.5 | 54 | 8/3/2026 |
| 0.3.0-rc.4 | 55 | 7/24/2026 |
| 0.3.0-rc.2 | 59 | 7/17/2026 |
| 0.2.0 | 106 | 7/13/2026 |
| 0.2.0-rc.33 | 50 | 7/13/2026 |
| 0.2.0-rc.30 | 80 | 7/10/2026 |
| 0.2.0-rc.28 | 62 | 7/9/2026 |
| 0.2.0-rc.24 | 59 | 7/5/2026 |
| 0.2.0-rc.20 | 59 | 6/30/2026 |
| 0.2.0-rc.18 | 69 | 6/29/2026 |
| 0.2.0-rc.16 | 63 | 6/25/2026 |
| 0.2.0-rc.14 | 70 | 6/24/2026 |
| 0.2.0-rc.10 | 66 | 6/22/2026 |
| 0.2.0-rc.8 | 67 | 6/19/2026 |
| 0.2.0-rc.6 | 74 | 6/17/2026 |
| 0.2.0-rc.4 | 75 | 6/15/2026 |
| 0.2.0-rc.2 | 64 | 6/12/2026 |