Zidium
Скачайте исходные коды примеров с GitHub: https://github.com/Zidium/DotNetExamples

Описание проблемы

Обычно приложения пишут лог в текстовый файл. Чтобы получить доступ к файлу лога, требуется сначала получить доступ к удаленному серверу. Чтение файлов логов на удаленном сервере — неудобно и неоперативно.

Решение

Приложения должны отправлять логи в систему мониторинга Zidium, которая предоставит возможность в личном кабинете удобно читать логи всех приложений.

Реализация

Запись логов ведется через NLog.
Подключенный адаптер Zidium.Log отправляет данные в облачный лог.
Для примеров записи логов сделаем контроллер LogController:

/// <summary>
/// Контроллер для примеров записи логов
/// </summary>
public class LogController : Controller
{
	private Logger _logger = LogManager.GetCurrentClassLogger();
}

Проверим запись лога в текстовый файл

Запустите приложение.
Выполните страницу /Log/SimpleExample.

/// <summary>
/// Простой пример записи лога
/// </summary>
public ActionResult SimpleExample()
{
	_logger.Trace("Пример лога Trace");
    _logger.Debug("Пример лога Debug");
    _logger.Info("Пример лога Info");
    _logger.Warn("Пример лога Warning");
    _logger.Error("Пример лога Error");
    _logger.Fatal("Пример лога Fatal");

    ...
}

Проверим запись лога в систему мониторинга Zidium

Зайдите в личный кабинет Zidium.
Откройте страницу "Лог".
Выберите компонент Root/System/WebSite (или кликните ссылку "Посмотреть веб-лог в личном кабинете").
Нажмите кнопку "Найти".

Сообщения лога с дополнительными свойствами

Сообщение лога может иметь сколько угодно дополнительных свойств.

Пример записи лога с дополнительными свойствами реализован на странице /Log/PropertiesExample:

/// <summary>
/// Пример записи сообщения лога с дополнительными свойствами
/// </summary>
public ActionResult PropertiesExample()
{
    var logEvent = new LogEventInfo()
    {
        Level = LogLevel.Info,
        Message = "Эта запись содержит дополнительные свойства"
    };
    logEvent.Properties.Add("User", HttpContext.User.Identity.Name);
    logEvent.Properties.Add("ApplicationPath", Request.PhysicalApplicationPath);
    _logger.Log(logEvent);

    ...
}

В личном кабинете сообщение лога с дополнительными свойствами будет выглядеть так:

Контекст лога

Контекст лога — это любая строка, по которой в личном кабинете можно фильтровать сообщения лога. Используется в многопоточных компонентах.

Рассмотрим пример записи многопоточного лога:

/// <summary>
/// Пример использования контекста лога
/// </summary>
public ActionResult ContextExample()
{
    int count = 10; // количество транзакций
    var random = new Random();
    for (var i = 0; i < count; i++)
    {
        var transactionId = "transactionId=" + i;
        var thread = new Thread(() =>
        {
            var contextLogger = LogManager.GetLogger(transactionId);
            contextLogger.Info("Начинаем обработку транзакции " + transactionId);
            Thread.Sleep(random.Next(20));
            contextLogger.Info("Входные данные уcпешно проверены");
            Thread.Sleep(random.Next(20));
            contextLogger.Info("Денежные средства успешно заблокированы");
            Thread.Sleep(random.Next(20));
            if (random.Next() % 2 == 0)
            {
                contextLogger.Info("Получено подтверждение проведения транзакции");
            }
            else
            {
                contextLogger.Warn("Отказано в проведении транзакции");
            }
            contextLogger.Info("Обработка транзакции завершена");

        });
        thread.Start();
    }

    ...
}

В данном примере эмулируется одновременная обработка 10 транзакций (запросов).

Вот как выглядит лог без фильтра по контексту:

Допустим, мы хотим видеть только строки лога, которые относятся к транзакции, которую отклонили. Кликаем по строке "Отказано в проведении транзакции", а потом по строке "transactionId=9".

Теперь остались только сообщения лога, которые относятся к транзакции 9.