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