PrimaLogger v2.0
Упрощенная обёртка над Serilog с конфигурацией через appsettings.json
. Поддержка Console, File и Elasticsearch с автоматическим определением совместимости.
Быстрый старт
Настройка в Program.cs
using PrimaLogger.Configuration;
var builder = Host.CreateApplicationBuilder(args);
// Добавляем PrimaLogger
builder.Services.AddPrimaLogger(builder.Configuration);
var host = builder.Build();
host.Run();
Конфигурация в appsettings.json
{
"Logging": {
"PrimaLogger": {
"ApplicationName": "MyApp",
"Console": {
"Enabled": true,
"MinimumLevel": "Information"
},
"File": {
"Path": "logs/app-.log",
"MinimumLevel": "Debug"
}
}
}
}
Использование в коде
public class UserController : ControllerBase
{
private readonly ILogger<UserController> _logger;
public UserController(ILogger<UserController> logger)
{
_logger = logger;
}
public IActionResult Login(string userId)
{
_logger.LogInformation("User {UserId} attempting login", userId);
return Ok();
}
}
Полная конфигурация
{
"Logging": {
"PrimaLogger": {
"ApplicationName": "MyWebApp",
"CustomProperties": {
"Environment": "Production",
"Version": "1.0.0",
"ServiceName": "api-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 zzz} [{Level:u3}] [{ThreadId}] {Message:lj}{NewLine}{Exception}",
"RollingInterval": "Day",
"FileSizeLimitBytes": 104857600,
"RetainedFileCountLimit": 31,
"RollOnFileSizeLimit": true,
"Shared": false,
"Encoding": "UTF-8"
},
"ErrorFile": {
"Path": "logs/errors-.log",
"MinimumLevel": "Error",
"RollingInterval": "Day",
"RetainedFileCountLimit": 90
},
"Elasticsearch": {
"MinimumLevel": "Information",
"Options": {
"Nodes": [
"https://elasticsearch-01.domain.com:9200",
"https://elasticsearch-02.domain.com:9200"
],
"DataStreamName": "logs-mywebapp-production",
"BootstrapMethod": "Silent",
"ApiKey": "",
"BufferOptions": {
"ConcurrentConsumers": 4,
"InboundBufferMaxSize": 500000,
"OutboundBufferMaxSize": 5000
}
}
}
}
}
}
Автоматическая совместимость с Elasticsearch
- Elasticsearch >= 7.9: Современный режим с Data Streams
- Elasticsearch 7.3-7.8: Legacy режим с индексами
- Elasticsearch < 7.3 или недоступен: Автоматическое отключение с предупреждением
Справочник параметров конфигурации
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 запросов, больше задержка |
BootstrapMethod - создание индексов
Значение |
Поведение ES 7.9+ (Data Streams) |
Поведение ES 7.3-7.8 (Index Templates) |
None |
Не создает data stream, предполагает что существует |
Игнорируется, используются фиксированные настройки |
Silent |
Создает data stream тихо, без ошибок |
Игнорируется, используются фиксированные настройки |
Failure |
Создает data stream, выбрасывает исключения при ошибках |
Игнорируется, используются фиксированные настройки |
RollingInterval - интервалы ротации файлов
Значение |
Создание нового файла |
Пример имен файлов |
Infinite |
Никогда (только по размеру) |
app.log , app_001.log , app_002.log |
Year |
Каждый год |
app-2024.log , app-2025.log |
Month |
Каждый месяц |
app-202401.log , app-202402.log |
Day |
Каждый день |
app-20240115.log , app-20240116.log |
Hour |
Каждый час |
app-2024011514.log , app-2024011515.log |
Minute |
Каждую минуту |
app-202401151430.log , app-202401151431.log |
Готовые конфигурации BufferOptions
// Низкая нагрузка (по умолчанию)
"BufferOptions": {
"ConcurrentConsumers": 1,
"InboundBufferMaxSize": 100000,
"OutboundBufferMaxSize": 1000
}
// Высокая нагрузка
"BufferOptions": {
"ConcurrentConsumers": 4,
"InboundBufferMaxSize": 500000,
"OutboundBufferMaxSize": 5000
}
// Очень низкая нагрузка
"BufferOptions": {
"ConcurrentConsumers": 1,
"InboundBufferMaxSize": 10000,
"OutboundBufferMaxSize": 100
}
Уровни логирования
Уровень |
Назначение |
Использование |
Verbose |
Максимальная детализация |
Глубокая отладка |
Debug |
Отладочная информация |
Разработка |
Information |
Общая информация |
Нормальная работа |
Warning |
Предупреждения |
Потенциальные проблемы |
Error |
Ошибки |
Проблемы в работе |
Fatal |
Критические ошибки |
Аварийное завершение |
Шаблоны вывода (Output Templates)
Консоль - простой
"[{Level:u3}] {Message:lj}{NewLine}{Exception}"
Результат: [INF] User logged in successfully
Файл - с контекстом
"{Timestamp:yyyy-MM-dd HH:mm:ss.fff} [{Level:u3}] [{ThreadId}] {SourceContext}: {Message:lj}{NewLine}{Exception}"
Результат: 2024-01-15 14:30:25.123 [INF] [1] MyApp.Controllers.UserController: User logged in successfully
Основные переменные
{Timestamp}
- время события
{Level}
- уровень логирования
{Message}
- текст сообщения
{ThreadId}
- ID потока
{SourceContext}
- имя класса/логгера
{Application}
- название приложения
{Environment}
- окружение
{Exception}
- информация об исключении
Синки отключены по умолчанию
Если секция отсутствует в конфигурации, соответствующий sink отключен:
{
"Logging": {
"PrimaLogger": {
"ApplicationName": "MyApp"
// Console, File, ErrorFile, Elasticsearch - все отключены
}
}
}
Глобальный минимальный уровень
Автоматически выбирается самый низкий уровень из всех включенных sink'ов.
Elasticsearch проверка при старте
При запуске приложения выполняется проверка доступности и версии Elasticsearch (таймаут 5 секунд).