Zidium

Исходные коды примеров находятся в архиве API

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

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

Решение

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

Реализация

Запись логов ведется через интерфейс ILog. Для примеров записи логов сделаем контроллер LogController:

/// <summary>
/// Контроллер для примеров записи логов
/// </summary>
public class LogController : Controller
{
	private ILog _log;

	protected ILog Log
	{
		get
		{
			if (_log == null)
			{
				// лог всегда пишется от имени какого-то компонента,
				// в данном случае лог пишет от имени компонента WebSite
				var component = ZidiumHelper.GetWebSiteComponent();
				_log = component.Log;
			}
			return _log;
		}
	}
}

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

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

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

Страница запишет сообщения в лог и покажет местонахождение текстового лог-файла:

Откройте текстовый лог-файл, там будет примерно следующее:

27.01.2017 17:16:02 Trace   WebSite  Пример лога Trace
27.01.2017 17:16:02 Debug   WebSite  Пример лога Debug
27.01.2017 17:16:02 Info    WebSite  Пример лога Info
27.01.2017 17:16:02 Warning WebSite  Пример лога Warning
27.01.2017 17:16:02 Error   WebSite  Пример лога Error

Расположение текстового лог-файла и формат сообщений можно изменить в конфигурационном файле в zidium.xml.

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

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

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

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

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

/// <summary>
/// Пример записи сообщения лога с дополнительными свойствами
/// </summary>
public ActionResult PropertiesExample()
{
	Log.Info(
		"Эта строка содержит дополнительные свойства!!!",
		new
		{
			user = HttpContext.User.Identity.Name,
			ip = Request.UserHostAddress,
			userAgent = Request.UserAgent,
			urlRefferer = Request.UrlReferrer,
			applicationPath = Request.PhysicalApplicationPath,
			url = Request.Url.AbsoluteUri
		});
	return View();
}

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

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

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

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

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

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

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

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

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