Описание проблемы
Обычно приложения пишут лог в текстовый файл. Чтобы получить доступ к файлу лога, требуется сначала получить доступ к удаленному серверу. Чтение файлов логов на удаленном сервере — неудобно и неоперативно.
Решение
Приложения должны отправлять логи в систему мониторинга 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.