PrimaLogger 2.1.0

dotnet add package PrimaLogger --version 2.1.0
                    
NuGet\Install-Package PrimaLogger -Version 2.1.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="PrimaLogger" Version="2.1.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="PrimaLogger" Version="2.1.0" />
                    
Directory.Packages.props
<PackageReference Include="PrimaLogger" />
                    
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 PrimaLogger --version 2.1.0
                    
#r "nuget: PrimaLogger, 2.1.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 PrimaLogger@2.1.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=PrimaLogger&version=2.1.0
                    
Install as a Cake Addin
#tool nuget:?package=PrimaLogger&version=2.1.0
                    
Install as a Cake Tool

PrimaLogger v2.1

Упрощенная обёртка над Serilog с конфигурацией через appsettings.json или Web.config. Поддержка Console, File и Logstash с автоматическим fallback.

Быстрый старт по версиям .NET

.NET 8/7/6 (Minimal API / Новый стиль)

Program.cs:
using PrimaLogger.Configuration;

var builder = WebApplication.CreateBuilder(args);
// или для консольных приложений:
// var builder = Host.CreateApplicationBuilder(args);

// Добавляем PrimaLogger
builder.Services.AddPrimaLogger(builder.Configuration);

// Остальные сервисы
builder.Services.AddControllers();

var app = builder.Build();

// Конфигурация pipeline
app.MapControllers();
app.Run();
appsettings.json:
{
  "Logging": {
    "PrimaLogger": {
      "ApplicationName": "MyModernApp",
      "Console": {
        "Enabled": true,
        "MinimumLevel": "Information"
      }
    }
  }
}

.NET 5 (Generic Host)

Program.cs:
using Microsoft.Extensions.Hosting;
using PrimaLogger.Configuration;

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureServices((hostContext, services) =>
            {
                // Добавляем PrimaLogger
                services.AddPrimaLogger(hostContext.Configuration);
                
                // Остальные сервисы
                services.AddControllers();
            })
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
}

.NET Core 3.1/3.0 (Generic Host)

Program.cs:
using Microsoft.Extensions.Hosting;
using PrimaLogger.Configuration;

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureServices((hostContext, services) =>
            {
                // Добавляем PrimaLogger
                services.AddPrimaLogger(hostContext.Configuration);
            })
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
}

.NET Core 2.2/2.1 (WebHost)

Program.cs:
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using PrimaLogger.Configuration;

public class Program
{
    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args).Build().Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .ConfigureServices((hostContext, services) =>
            {
                // Добавляем PrimaLogger
                services.AddPrimaLogger(hostContext.Configuration);
            })
            .UseStartup<Startup>();
}

.NET Framework 4.6.1+ (классический ASP.NET)

Program.cs:
using PrimaLogger.Configuration;
using Microsoft.Extensions.Logging;

public class Program
{
    public static void Main(string[] args)
    {
         ServiceCollection serviceCollection = new ServiceCollection();
         Config = new ConfigurationBuilder()
             .SetBasePath(Directory.GetParent(AppContext.BaseDirectory).FullName)
             .AddJsonFile("appsettings.json", false)
             .Build();
         serviceCollection.AddSingleton<IConfigurationRoot>(Config);
         serviceCollection.AddPrimaLogger(Config);
         IServiceProvider serviceProvider = serviceCollection.BuildServiceProvider();
         var logger = serviceProvider.GetRequiredService<ILogger<Program>>(); //вызываем где надо, используем как логгер
    }
}
Установка пакетов:

<package id="PrimaLogger" version="2.1.0" />
<package id="Unity.AspNet.Mvc" version="5.11.1" />
<package id="Microsoft.Extensions.Configuration" version="2.1.0" />
<package id="Microsoft.Extensions.Configuration.Json" version="2.1.0" />
appsettings.json:
{
  "Logging": {
    "PrimaLogger": {
      "ApplicationName": "TestApp462",
      "Console": {
        "Enabled": true,
        "MinimumLevel": "Debug"
      },
      "File": {
        "Path": "logs/test-.log",
        "MinimumLevel": "Information"
      }
    }
  }
}
Global.asax.cs (с Unity контейнером):
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Unity;
using Unity.AspNet.Mvc;
using Unity.Lifetime;
using PrimaLogger.Configuration;

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        // Стандартная инициализация MVC
        AreaRegistration.RegisterAllAreas();
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        
        // Настройка DI
        RegisterDependencies();
    }
    
    private void RegisterDependencies()
    {
        var container = new UnityContainer();
        
        // Создаем конфигурацию из Web.config
        var configBuilder = new ConfigurationBuilder()
            .AddConfiguration(System.Configuration.ConfigurationManager.AppSettings);
        var configuration = configBuilder.Build();
        
        // Создаем ServiceCollection и добавляем PrimaLogger
        var services = new ServiceCollection();
        services.AddPrimaLogger(configuration);
        
        // Регистрируем PrimaLogger сервисы в Unity
        var serviceProvider = services.BuildServiceProvider();
        
        container.RegisterInstance<Microsoft.Extensions.Logging.ILoggerFactory>(
            serviceProvider.GetService<Microsoft.Extensions.Logging.ILoggerFactory>(), 
            new ContainerControlledLifetimeManager());
            
        container.RegisterType(typeof(Microsoft.Extensions.Logging.ILogger<>), 
            typeof(Microsoft.Extensions.Logging.Logger<>), 
            new ContainerControlledLifetimeManager());
        
        // Регистрируем ваши сервисы
        container.RegisterType<IUserService, UserService>();
        
        // Устанавливаем resolver
        DependencyResolver.SetResolver(new UnityDependencyResolver(container));
    }
}
Альтернативный вариант с Autofac:
// В Global.asax.cs
private void RegisterDependencies()
{
    var builder = new ContainerBuilder();
    
    // Создаем конфигурацию
    var configBuilder = new ConfigurationBuilder()
        .AddConfiguration(System.Configuration.ConfigurationManager.AppSettings);
    var configuration = configBuilder.Build();
    
    // Создаем ServiceCollection и добавляем PrimaLogger
    var services = new ServiceCollection();
    services.AddPrimaLogger(configuration);
    
    // Регистрируем в Autofac
    builder.Populate(services);
    
    // Регистрируем контроллеры
    builder.RegisterControllers(typeof(MvcApplication).Assembly);
    
    var container = builder.Build();
    DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
}

Конфигурация (универсальная для всех версий .NET Core/.NET 5+)

Минимальная конфигурация в appsettings.json:

{
  "Logging": {
    "PrimaLogger": {
      "ApplicationName": "MyApp",
      "Console": {
        "Enabled": true,
        "MinimumLevel": "Information"
      }
    }
  }
}

Полная конфигурация в appsettings.json:

{
  "Logging": {
    "PrimaLogger": {
      "ApplicationName": "UpdatersWebApp.Debug",
      "CustomProperties": {
        "Environment": "Development",
        "Version": "1.0.0",
        "ServiceName": "updaters-service"
      },
      "Console": {
        "Enabled": true,
        "MinimumLevel": "Information",
        "OutputTemplate": "[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj}{NewLine}{Exception}"
      },
      "File": {
        "Path": "logs/app-.log",
        "MinimumLevel": "Debug",
        "OutputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff} [{Level:u3}] {SourceContext}: {Message:lj}{NewLine}{Exception}",
        "RollingInterval": "Day",
        "FileSizeLimitBytes": 104857600,
        "RetainedFileCountLimit": 30,
        "RollOnFileSizeLimit": true,
        "Shared": false,
        "Encoding": "UTF-8"
      },
      "ErrorFile": {
        "Path": "logs/errors-.log",
        "MinimumLevel": "Error",
        "OutputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {SourceContext}: {Message:lj}{NewLine}{Exception}",
        "RollingInterval": "Day",
        "FileSizeLimitBytes": 104857600,
        "RetainedFileCountLimit": 90,
        "Encoding": "UTF-8"
      },
      "Logstash": {
        "MinimumLevel": "Information",
        "Options": {
          "Host": "elk-stack-server",
          "Port": 5000,
          "Protocol": "Tcp"
        }
      }
    }
  }
}

Использование в коде (одинаково для всех версий)

В контроллерах:

using Microsoft.Extensions.Logging;
using Microsoft.AspNetCore.Mvc; // или System.Web.Mvc для .NET Framework

public class UserController : Controller
{
    private readonly ILogger<UserController> _logger;
    
    public UserController(ILogger<UserController> logger)
    {
        _logger = logger;
    }
    
    public IActionResult Login(string userId)
    {
        _logger.LogInformation("User {UserId} attempting login", userId);
        
        try
        {
            // Логика авторизации
            _logger.LogDebug("Validating credentials for {UserId}", userId);
            
            // Успешная авторизация
            _logger.LogInformation("User {UserId} logged in successfully", userId);
            return Ok();
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "Login failed for user {UserId}", userId);
            return BadRequest("Login failed");
        }
    }
}

В сервисах:

public class UserService
{
    private readonly ILogger<UserService> _logger;
    
    public UserService(ILogger<UserService> logger)
    {
        _logger = logger;
    }
    
    public async Task ProcessUserAsync(string userId)
    {
        _logger.LogDebug("Starting user processing for {UserId}", userId);
        
        using (_logger.BeginScope("UserId: {UserId}", userId))
        {
            try
            {
                await DoSomeWorkAsync(userId);
                _logger.LogInformation("User processing completed successfully");
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "Failed to process user");
                throw;
            }
        }
    }
}

В консольных приложениях:

public class Program
{
    private static ILogger<Program> _logger;
    
    public static async Task Main(string[] args)
    {
        // Настройка для консольного приложения
        var builder = Host.CreateApplicationBuilder(args);
        builder.Services.AddPrimaLogger(builder.Configuration);
        
        var host = builder.Build();
        _logger = host.Services.GetRequiredService<ILogger<Program>>();
        
        _logger.LogInformation("Application starting");
        
        try
        {
            await RunApplicationLogicAsync();
            _logger.LogInformation("Application completed successfully");
        }
        catch (Exception ex)
        {
            _logger.LogFatal(ex, "Application terminated unexpectedly");
        }
    }
}

Logstash интеграция

PrimaLogger поддерживает отправку логов в Logstash через различные протоколы:

Logstash TCP (рекомендуется)

{
  "Logstash": {
    "MinimumLevel": "Information",
    "Options": {
      "Host": "elk-stack-server",
      "Port": 5000,
      "Protocol": "Tcp"
    }
  }
}

Logstash UDP (быстрее, но менее надежен)

{
  "Logstash": {
    "MinimumLevel": "Information",
    "Options": {
      "Host": "elk-stack-server",
      "Port": 5000,
      "Protocol": "Udp"
    }
  }
}

Автоматический fallback при недоступности Logstash

Если Logstash недоступен, логи продолжат записываться в Console и File:

[WAR] Logstash недоступен: Connection refused
[WAR] • Host: elk-stack-server:5000 (TCP)
[WAR] • Logstash sink отключен, продолжаем работу с локальными sinks

Различия в конфигурации между версиями .NET

Аспект .NET Core/.NET 5+ .NET Framework
Файл конфигурации appsettings.json Web.config (appSettings)
Инициализация services.AddPrimaLogger(configuration) Manual DI container setup
Dependency Injection Встроенный Unity/Autofac/другой
Hosting Model Generic Host / Minimal API Classical ASP.NET
Пути к файлам logs/app-.log App_Data/logs/app-.log

Справочник параметров конфигурации

PrimaLoggerConfig - основные настройки

Параметр Тип По умолчанию Описание
ApplicationName string "webapp" Имя приложения, добавляется во все логи как свойство
CustomProperties Dictionary<string, object> {} Дополнительные свойства, добавляемые во все логи
Console ConsoleLoggerOptions null Настройки консольного вывода (отключен если null)
File FileLoggerOptions null Настройки основного файла логов (отключен если null)
ErrorFile FileLoggerOptions null Настройки файла только для ошибок (отключен если null)
Logstash LogstashSinkOptions null Настройки Logstash (отключен если null)

ConsoleLoggerOptions - консольный вывод

Параметр Тип По умолчанию Описание
Enabled bool true Включить/отключить консольный вывод
MinimumLevel LogEventLevel Information Минимальный уровень для вывода в консоль
OutputTemplate string "[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj}{NewLine}{Exception}" Шаблон форматирования сообщений

FileLoggerOptions - файловое логирование

Параметр Тип По умолчанию Описание
Path string "logs/app-.log" Путь к файлу логов (поддерживает паттерны даты)
MinimumLevel LogEventLevel Information Минимальный уровень для записи в файл
OutputTemplate string "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {Message:lj}{NewLine}{Exception}" Шаблон форматирования
RollingInterval RollingInterval Day Интервал ротации: Infinite, Year, Month, Day, Hour, Minute
FileSizeLimitBytes long? 104857600 (100MB) Максимальный размер файла до ротации
RollOnFileSizeLimit bool true Создавать новый файл при достижении лимита размера
RetainedFileCountLimit int? 31 Количество файлов для хранения (старые удаляются)
Shared bool false Разрешить доступ к файлу из нескольких процессов
Encoding Encoding UTF8 Кодировка файла

LogstashSinkOptions - настройки Logstash

Параметр Тип По умолчанию Описание
MinimumLevel LogEventLevel Information Минимальный уровень для отправки в Logstash
Options LogstashLoggerOptions new() Детальные настройки подключения

LogstashLoggerOptions - подключение к Logstash

Параметр Тип По умолчанию Описание
Host string "localhost" Хост Logstash сервера
Port int 5000 Порт Logstash сервера
Protocol LogstashProtocol Tcp Протокол подключения: Tcp, Udp

LogLevelOverrides - переопределение уровней для категорий

По умолчанию PrimaLogger снижает уровень логирования для шумных компонентов:

Категория Уровень по умолчанию Назначение
System.Net.Http.HttpClient Warning HTTP клиент запросы
Microsoft.Extensions.Http Warning HTTP extensions
Microsoft.AspNetCore.Hosting.Diagnostics Warning ASP.NET Core диагностика
Microsoft.AspNetCore.Mvc.Infrastructure Warning MVC инфраструктура
Microsoft.EntityFrameworkCore.Database.Command Warning EF Core SQL команды
Microsoft.EntityFrameworkCore.Infrastructure Warning EF Core инфраструктура

Можно переопределить эти настройки:

{
  "LogLevelOverrides": {
    "Categories": {
      "Microsoft.EntityFrameworkCore.Database.Command": "Debug",
      "MyApp.Namespace": "Verbose"
    }
  }
}

Уровни логирования

Уровень Назначение Использование Пример
Verbose Максимальная детализация Глубокая отладка _logger.LogTrace("Entering method with param {Param}", param)
Debug Отладочная информация Разработка _logger.LogDebug("Processing user {UserId}", userId)
Information Общая информация Нормальная работа _logger.LogInformation("User logged in successfully")
Warning Предупреждения Потенциальные проблемы _logger.LogWarning("Invalid input received: {Input}", input)
Error Ошибки Проблемы в работе _logger.LogError(ex, "Failed to process request")
Fatal Критические ошибки Аварийное завершение _logger.LogCritical(ex, "Application crash")

Мониторинг и диагностика

Логирование запуска

При инициализации PrimaLogger автоматически логирует информацию о конфигурации:

[INF] PrimaLogger инициализирован для MyApp
[INF] Активные sinks: Console(Information), File(Debug), Logstash(Information) | Минимальный уровень: Debug

Обработка ошибок Logstash

При проблемах с Logstash:

[WAR] Logstash недоступен: Connection refused
[WAR] • Host: logs.example.com:5000 (TCP)
[WAR] • Logstash sink отключен, продолжаем работу с локальными sinks
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 was computed.  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 was computed.  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 was computed.  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
2.1.0 236 7/26/2025
2.0.6 369 7/25/2025
2.0.5 379 7/25/2025
2.0.4 376 7/25/2025
2.0.3 431 7/24/2025
2.0.2 112 7/17/2025
2.0.1 106 7/17/2025
2.0.0 113 7/17/2025
1.1.0 109 7/16/2025
1.0.9 110 7/16/2025
1.0.8 112 7/16/2025
1.0.7 115 7/16/2025
1.0.6 108 7/16/2025
1.0.5 110 7/16/2025
1.0.4 113 7/16/2025
1.0.3 113 7/16/2025
1.0.2 114 7/15/2025
1.0.1 113 7/15/2025
1.0.0 112 7/15/2025

v2.1.0: Упрощенная версия с Logstash
           - Убрана прямая поддержка Elasticsearch
           - Добавлена поддержка Logstash (TCP/UDP)
           - Конфигурация только через appsettings.json
           - Упрощенная архитектура