Какие методы лучше всего использовать для хранения результатов логирования в приложении NET?

Какие существуют рекомендации или bew practice для сохранения журналов логирования C# в среде Linux? Рассматриваю вариант использования NLog с SQLite, но хотелось бы узнать, может быть, есть более подходящие инструменты или подходы?
  • 5 февраля 2024 г. 15:21
Ответы на вопрос 3
Для хранения результатов логирования приложений на .NET, в том числе и работающих в среде Linux, существует несколько популярных и эффективных инструментов и подходов. Ваш выбор должен зависеть от требований к вашему приложению, таких как необходимость распределенного логирования, производительность, степень важности удобства поиска по логам и т.д.

### Инструменты логирования для .NET:

1. **NLog**: Мощная и гибкая библиотека логгера для различных платформ .NET.
2. **log4net**: Еще одна распространенная библиотека для логирования с широкими возможностями.
3. **Serilog**: Современная библиотека, основанная на структурированном логировании.
4. **Microsoft.Extensions.Logging**: Встроенная абстракция логирования в .NET Core, которая может быть связана с любым из вышеуказанных фреймворков логирования.

### Методы хранения логов:

1. **Файлы**: Простое и распространённое решение, предусматривающее запись логов в текстовые файлы на диске. Легко настраивается любой из вышеуказанных инструментов.
2. **Базы данных**: Использование RDBMS (например, SQLite) или NoSQL баз данных для удобного запроса и анализа логов.
3. **Централизованные системы логирования**: Для распределенных систем рекомендуется отправлять логи в системы вроде ELK Stack (Elasticsearch, Logstash, Kibana) или Graylog.
4. **Облачные провайдеры логирования**: Если ваша инфраструктура основана на облаке, вы можете использовать такие сервисы, как AWS CloudWatch, Azure Monitor или Google Stackdriver.

### Best Practices:

- **Асинхронное логирование**: Чтобы избежать замедления работы основных процессов приложения, важно использовать асинхронное логирование, особенно при записи в базу данных или удаленную систему.
- **Структурированные логи**: Структурированные логи (в формате JSON, например) упрощают последующий парсинг и анализ данных.
- **Ротация логов**: Настраивайте ротацию и удаление старых лог-файлов, чтобы избежать переполнения дискового пространства.
- **Уровни логирования**: Правильно используйте уровни логирования (trace, debug, info, warn, error, fatal), чтобы упростить поиск ошибок и отладку.
- **Безопасность**: Храните логи в безопасном месте и следите, чтобы в логах не хранились чувствительные данные.

### Рекомендации для среды Linux:

- **Syslog**: В среде Linux вы можете использовать syslog для отправки логов в уже существующую систему логирования операционной системы, что может упростить их централизованное управление.
- **Docker и Kubernetes**: Если ваше приложение работает в контейнерах, используйте механизмы логирования, предоставляемые этими платформами, например, отправку логов в стандартный вывод
Nlog

Кмк, он немного переусложнён.
Я бы посмотрел в сторону стандартного Microsoft.Extensions.Logging или Serilog (но из кода всё равно обращаться к M.E.L.Abstractions)

SQLite

Зачем? Какую проблему ты хочешь решить применяя для логов полноценную субд, с которой к тому же не будут нормально интегрироваться другие инструменты для просмотра логов?

На линуксе уже есть встроенная служба для логов - syslog, ей и пользуйся.

Хотя опять же зависит от того, что за приложение и что за логи.
1. Про NLog давно не слышал - больше про Serilog (стильно, модно, молодежно) 
2. Если это системное какое-нибудь приложение, то лучше используй системный журнал, либо пиши в файл отдельный
3. Если есть внешний сервер логов (ELK стек, Graylog и т.д.), то отправляй туда (посмотри в сторону агрегаторов логов, )
4. Если это контейнерное (докер, например) приложение, то логируй в stdout/stderr, а потом собирай логи у самого контейнера. Также, докер можно настроить на формат хранения логов и место хранения (можно локально хранить, а можно и отправлять по сети)

P.S. фреймворк по большей части не важен, но рекомендую связку Microsoft.Extensions.Logging + Serilog:
- Первый - предоставляет интерфейс для логирования
- Второй - бэкэнд логирования
Похожие вопросы