2011-09-29 4 views
2

대 내가 닷넷/C#을 멍청한 놈에게 (오랜 서블릿/자바 개발자) 내 MVC 응용 프로그램에 로깅을 추가 할 필요가MVC 로깅 : [LogRequest] OnActionExecuting

을 해요. 성능이 좋고 저렴하며 구성이 간단해야합니다.

내가 처음에 무엇을하고 싶은지는 각 들어오는 컨트롤러 동작을 기록하는 것입니다. 내가 모든 컨트롤러의 액션 메소드에 코드 라인을 추가 할 필요가 없기 때문에 단일 포인트 엔트리가있을 수도 있다는 생각이 들었다.

내가 볼때, 난 (제 경우 기지국 제어기)를 컨트롤러에 [LogRequest] 속성을 추가하고 logrequest 속성을 처리하기 위해

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

를 구현 할 수 있습니다.

또는

난 그냥 따라 기본 컨트롤러를 무시할 수 :

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

및 BaseController에서 내 모든 컨트롤러를 상속합니다.

성능면에서 보면 더 빠를까요?


또한 성능면에서 한 번 실행되는 비 차단 스레드에서 실제 로깅 메서드 호출을 고려하고 있습니다. 이 접근법을 가진 함정들? 목표는 앱을 계속 진행시키고 로깅 메소드가 작업을 마칠 때까지 기다리지 않는 것입니다.

답변

4

MVC3을 사용하는 경우 기본 필터가 필요하지 않고 작업 필터를 전역 필터 모음에 추가하는 것이 좋습니다. 모든 컨트롤러 액션을 위해 그것을 실행됩니다

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

: 당신의 Global.asax ("MvcApplication") 클래스의 응용 프로그램 시작,에서, 당신은 같은 라인이 필요합니다.

성능 측면에서 본다면 속성 또는 기본 컨트롤러 메커니즘 사이에 많은 차이가있을 것이라고 생각하지 않습니다. 아직 시도하지는 않았지만, MVC 파이프 라인의 액션 필터 부분은 기본 컨트롤러가 있는지 여부에 관계없이 실행되기 때문에 실제 고려 사항은 성능보다는 유연성이 될 것입니다. 보다 유연한 설계는 컨트롤러에서 로깅을 분리하는 것입니다.

나는 속도와 테스트가 이미 최적화 된 log4net과 같은 타사 로그 솔루션을 사용합니다. 그렇게하면 비동기 로깅 스레드와 모든 것을 회피하지 않아도됩니다. action 필터에서 log4net에 로그하여 정상적으로 호출하면됩니다. 이것은 또한 appender 단위로 비동기적인 부분을 할 수있게 해줍니다. 비동기 로깅이 필요한 경우 비동기 동작으로 다양한 로깅 호출을 래핑하는 대신 log4net appender를 비동기로 작성하십시오.

+0

정보 주셔서 감사합니다. Log4net이 최적화되고 있다는 것에 대해 당신이 말하는 것을 이해합니다.하지만 차단합니까? 어쨌든 asynch를 실행하는 것이 좋습니다 로깅 필터는 무엇입니까? ... 또한 log4net/j 가지고있는 한 가지 문제는 db에 저장된 필드가있는 사용자 정의가 부족하다는 것입니다. 로그 레코드에 사용자 이름과 아마도 몇 가지 다른 것들을 추가하고 싶습니다. 나중에 메시지 필드에서 "좋아요"를해야하는 경우를 제외하고 쿼리를 추가하고 싶습니다. – horace

+0

asynch 회전 비동기 로깅, '아무 것도 : http://www.singingeels.com/Articles/Logging_with_ASPNET_MVC_Action_Filters.aspx [/ link] – horace

+0

나는 당신의 rec에 따라 이것을 구현했다. 그리고 그것은 매우 좋다. 필터를 추가하고 마술처럼 작동합니다! --- 나는 컨트롤러에 로깅을위한 마법 속성이 있는지 여부를 걱정할 필요가 없다는 사실을 좋아합니다. 단순한. 깨끗한. 공장. – horace