Ведение журнала mvc: [LogRequest] vs OnActionExecuting

Я.net/ C# noob (давний разработчик сервлетов / Java)

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

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

как я вижу, я могу добавить атрибут [LogRequest] к контроллеру (в моем случае, базовый контроллер), а затем реализовать

public class LogsRequestsAttribute : ActionFilterAttribute, IActionFilter
{
    void IActionFilter.OnActionExecuting(ActionExecutingContext filterContext)
    { ... }
}

класс для обработки атрибута logrequest.

или же

Я мог бы просто переопределить базовый контроллер в соответствии с:

public class BaseController : Controller
{
    protected override void OnActionExecuting(ActionExecutingContext filterContext)
    {
       // perform some action here
    }
}

и унаследовать все мои контроллеры от BaseController.

с точки зрения производительности, что будет быстрее?


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

1 ответ

Решение

Если вы используете MVC3, я бы порекомендовал добавить ваш фильтр действий в коллекцию глобальных фильтров, а не использовать базовый контроллер. При запуске приложения в вашем классе Global.asax ("MvcApplication") вам понадобится строка вроде:

GlobalFilters.Filters.Add(new LogRequestsAttribute());

Это запустит его для всех действий контроллера.

С точки зрения производительности, я не думаю, что вы увидите большую разницу между атрибутом или механизмом базового контроллера. Я не пробовал, но поскольку часть фильтра действий в конвейере MVC будет работать независимо от того, есть ли у вас базовый контроллер, реальным соображением здесь будет гибкость, а не производительность. Более гибкая конструкция заключается в изоляции регистрации от контроллера.

Я бы посмотрел на использование стороннего решения для журнала, такого как log4net, которое уже оптимизировано для скорости и хорошо протестировано. Это позволит вам избежать необходимости раскручивать потоки асинхронной регистрации и все такое. Просто войдите в log4net в свой фильтр действий и назовите это хорошо. Это также позволяет вам выполнять асинхронную часть работы для каждого приложения - больше контроля. Если вам нужно асинхронное ведение журнала, напишите своему приложению log4net, чтобы оно было асинхронным, вместо того, чтобы оборачивать все различные вызовы ведения журнала асинхронным поведением.

Другие вопросы по тегам