PrimaLogger 2.0.5
There is a newer version of this package available.
See the version list below for details.
See the version list below for details.
dotnet add package PrimaLogger --version 2.0.5
NuGet\Install-Package PrimaLogger -Version 2.0.5
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.0.5" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="PrimaLogger" Version="2.0.5" />
<PackageReference Include="PrimaLogger" />
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.0.5
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
#r "nuget: PrimaLogger, 2.0.5"
#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.0.5
#: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.0.5
#tool nuget:?package=PrimaLogger&version=2.0.5
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
PrimaLogger v2.0
Упрощенная обёртка над Serilog с конфигурацией через appsettings.json
или Web.config
. Поддержка Console, File и Elasticsearch с автоматическим определением совместимости.
Быстрый старт по версиям .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.0.2-compatible" />
<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"
},
"Elasticsearch": {
"MinimumLevel": "Debug",
"Options": {
"Nodes": [
"http://logs.prima-inform.ru:9200"
],
"DataStreamName": "dev-updaters-webapp",
"BootstrapMethod": "Silent",
"BufferOptions": {
"ConcurrentConsumers": 2,
"InboundBufferMaxSize": 100000,
"OutboundBufferMaxSize": 500
}
}
}
}
}
}
Использование в коде (одинаково для всех версий)
В контроллерах:
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");
}
}
}
Структурированное логирование
Правильное использование параметров:
// ✅ Правильно - структурированные параметры
_logger.LogInformation("User {UserId} performed {Action} at {Timestamp}",
userId, "login", DateTime.UtcNow);
// ❌ Неправильно - строковая интерполяция
_logger.LogInformation($"User {userId} performed login at {DateTime.UtcNow}");
Использование Scopes для контекста:
using (_logger.BeginScope("RequestId: {RequestId}", requestId))
{
_logger.LogInformation("Processing request");
using (_logger.BeginScope("UserId: {UserId}", userId))
{
_logger.LogDebug("User-specific processing");
// Все логи будут содержать RequestId и UserId
}
}
Автоматическая совместимость с Elasticsearch
PrimaLogger автоматически определяет версию Elasticsearch и выбирает оптимальный режим работы:
Elasticsearch 7.9+ (Data Streams)
[INF] • Elasticsearch подключен: 7.17.0 (режим: Data Stream (Modern))
[INF] • Целевой индекс/поток: dev-updaters-webapp
Elasticsearch 7.3-7.8 (Legacy Index Templates)
[INF] • Elasticsearch подключен: 7.8.0 (режим: Index Template (Legacy))
[INF] • Целевой индекс/поток: dev-updaters-webapp-{yyyy.MM.dd}
Elasticsearch недоступен
[WAR] Elasticsearch недоступен: Cannot connect to any Elasticsearch nodes
[WAR] • URL: http://logs.prima-inform.ru:9200
[WAR] • Elasticsearch sink отключен
Различия в конфигурации между версиями .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) |
Elasticsearch |
ElasticsearchSinkOptions |
null |
Настройки Elasticsearch (отключен если 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 |
Кодировка файла |
ElasticsearchSinkOptions - настройки Elasticsearch
Параметр | Тип | По умолчанию | Описание |
---|---|---|---|
MinimumLevel |
LogEventLevel |
Information |
Минимальный уровень для отправки в Elasticsearch |
Options |
ElasticsearchLoggerOptions |
new() |
Детальные настройки подключения |
ElasticsearchLoggerOptions - подключение к Elasticsearch
Параметр | Тип | По умолчанию | Описание |
---|---|---|---|
Nodes |
List<Uri> |
["http://localhost:9200"] |
Список узлов Elasticsearch |
DataStreamName |
string |
"logs-myapp-default" |
Имя data stream (ES 7.9+) или префикс индекса (ES 7.3-7.8) |
BootstrapMethod |
BootstrapMethod |
Failure |
Режим создания индексов: None , Silent , Failure |
ApiKey |
string |
null |
API ключ для аутентификации |
Username |
string |
null |
Имя пользователя для Basic Auth |
Password |
string |
null |
Пароль для Basic Auth |
BufferOptions |
ElasticsearchBufferOptions |
null |
Настройки буферизации |
ElasticsearchBufferOptions - буферизация и производительность
Параметр | Тип | По умолчанию | Описание | Влияние |
---|---|---|---|---|
ConcurrentConsumers |
int |
1 |
Количество потоков отправки | Больше = быстрее отправка, больше нагрузка |
InboundBufferMaxSize |
int |
100000 |
Размер входящего буфера | Больше = устойчивость к пикам, больше памяти |
OutboundBufferMaxSize |
int |
1000 |
Размер пакета для отправки | Больше = меньше HTTP запросов, больше задержка |
Уровни логирования
Уровень | Назначение | Использование | Пример |
---|---|---|---|
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") |
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 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.
-
.NETStandard 2.0
- Elastic.Serilog.Sinks (>= 8.11.1)
- Microsoft.Extensions.Configuration (>= 8.0.0)
- Microsoft.Extensions.Configuration.Abstractions (>= 8.0.0)
- Microsoft.Extensions.Configuration.Binder (>= 8.0.0)
- Microsoft.Extensions.Configuration.Json (>= 8.0.0)
- Microsoft.Extensions.DependencyInjection (>= 8.0.0)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 8.0.0)
- Microsoft.Extensions.Logging (>= 8.0.0)
- Microsoft.Extensions.Logging.Abstractions (>= 8.0.0)
- Microsoft.Extensions.Options (>= 8.0.0)
- Microsoft.Extensions.Options.ConfigurationExtensions (>= 8.0.0)
- Microsoft.Extensions.Primitives (>= 8.0.0)
- Serilog (>= 4.2.0)
- Serilog.Enrichers.Environment (>= 3.0.1)
- Serilog.Enrichers.Process (>= 3.0.0)
- Serilog.Enrichers.Thread (>= 4.0.0)
- Serilog.Extensions.Logging (>= 8.0.0)
- Serilog.Settings.Configuration (>= 8.0.4)
- Serilog.Sinks.Console (>= 6.0.0)
- Serilog.Sinks.Elasticsearch (>= 9.0.3)
- Serilog.Sinks.File (>= 6.0.0)
- Serilog.Sinks.Http (>= 8.0.0)
- Serilog.Sinks.Network (>= 2.0.2)
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 | 237 | 7/26/2025 |
2.0.6 | 370 | 7/25/2025 |
2.0.5 | 380 | 7/25/2025 |
2.0.4 | 377 | 7/25/2025 |
2.0.3 | 432 | 7/24/2025 |
2.0.2 | 113 | 7/17/2025 |
2.0.1 | 107 | 7/17/2025 |
2.0.0 | 114 | 7/17/2025 |
1.1.0 | 110 | 7/16/2025 |
1.0.9 | 111 | 7/16/2025 |
1.0.8 | 113 | 7/16/2025 |
1.0.7 | 116 | 7/16/2025 |
1.0.6 | 109 | 7/16/2025 |
1.0.5 | 111 | 7/16/2025 |
1.0.4 | 114 | 7/16/2025 |
1.0.3 | 114 | 7/16/2025 |
1.0.2 | 115 | 7/15/2025 |
1.0.1 | 114 | 7/15/2025 |
1.0.0 | 113 | 7/15/2025 |
v2.0.0: Упрощенная версия
- Убраны builder API и preset'ы
- Конфигурация только через appsettings.json
- Автоматический fallback для Elasticsearch
- Упрощенная архитектура