Invex.Extensions.Logging.File 0.3.0

There is a newer prerelease version of this package available.
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
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Invex.Extensions.Logging.File" Version="0.3.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Invex.Extensions.Logging.File" Version="0.3.0" />
                    
Directory.Packages.props
<PackageReference Include="Invex.Extensions.Logging.File" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Invex.Extensions.Logging.File --version 0.3.0
                    
#r "nuget: Invex.Extensions.Logging.File, 0.3.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package Invex.Extensions.Logging.File@0.3.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Invex.Extensions.Logging.File&version=0.3.0
                    
Install as a Cake Addin
#tool nuget:?package=Invex.Extensions.Logging.File&version=0.3.0
                    
Install as a Cake Tool

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

License

Licensed under the terms of LICENSE.txt.

Product 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. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

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
Loading failed