인텔리 트레이스를 보면, 상황에 따라 정말 편리하게 사용할 수 있게 잘 만들어져 있습니다. 그런데, 다양한 이벤트를 로그에 남길수 있도록 지원하고 있지만 목록에 없는 이벤트를 어떻게 잡아야 할까요? 예를 들어서 우리 팀이나 내가 자주 사용하는 메서드를 이벤트 로그에 기록을 자동으로 남기고 싶을 때 말이죠.
예를 들어서, 다음과 같은 클래스 라이브러리 프로젝트가 있습니다. 이 메서드가 우리 팀에서 자주 사용하는 메서드이며, 이벤트 로그에 자동으로 남도록 하고 싶다고 가정해보겠습니다.
namespace BoramLib { public class Logger { public static void Herehere(string msg) { } } } |
즉, 위와 같은 메서드가 실행 될때 마다 자동으로 인텔리 트레이스에 이벤트 기록으로 남기려고 합니다. 그런데, 인텔리 트레이스는 이벤트 셋을 수정할 수 있는 공식적인 방법은 제공하지 않습니다. 그래서 약간의 설정 작업을 통해서 이벤트를 추가해야 하는데요. 지금부터 한번 살펴보시죠.
'C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\TraceDebugger Tools\ko'폴더를 찾아가시면, 인텔리 트레이스의 모든 설정이 담긴 CollectionPlan.xml이라는 파일이 있습니다. 이 파일을 Visual Studio에서 엽니다. 그리고 'TracePointProvider'항목 안에 'Categories'항목을 찾습니다. 그리고 그 항목 안에 다음과 같이 커스텀 이벤트 카테고리를 추가합니다.
<Category Id="BoramLib.Logger" _locID="category.BoramLib.Logger">Logger</Category> |
설정 파일을 저장한 후에, Visual Studio를 재 시작해서, 인텔리 트레이스의 옵션으로 가보면,
위와 같이 Logger라는 이름으로 카테고리가 추가되었습니다. 이제, 실제로 이 카테고리에서 어떤 모듈에 대해서, 어떤 메서드의 이벤트를 잡으며, 어떻게 출력할 것인지를 설정하도록 하겠습니다.
CollectionPlan.xml에서 'ModuleSpecifications'항목 안에 다음과 같이 dll이름을 명시해줍니다.
<ModuleSpecification Id="BoramLib.Logger">BoramLib.dll</ModuleSpecification> |
그리고 BoramLib.dll을 'C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\TraceDebugger Tools'에 복사해 넣습니다.
그리고 CollectionPlan.xml에서 'DiagnosticEventSpecifications'항목을 찾아서 다음과 같은 항목을 추가합니다.
<DiagnosticEventSpecification> <CategoryId>BoramLib.Logger</CategoryId> <SettingsName _locID="settingsName.BoramLib.Logger.Herehere">Herehere!!</SettingsName> <SettingsDescription _locID="settingsDescription.BoramLib.Logger.Herehere"> 여기서 Herehere 메서드가 실행되었습니다.</SettingsDescription> <Bindings> <Binding> <ModuleSpecificationId>BoramLib.Logger</ModuleSpecificationId> <TypeName>BoramLib.Logger</TypeName> <MethodName>Herehere</MethodName> <MethodId>BoramLib.Logger.Herehere():System.Void</MethodId> <ShortDescription _locID="shortDescription.BoramLib.Logger"> Herehere "{0}"</ShortDescription> <LongDescription _locID="longDescription.BoramLib.Logger"> 여기서 Herehere 메서드가 실행되었습니다. "{0}"</LongDescription> <DataQueries> <DataQuery index="0" maxSize="4096" type="String" name="로그 메세지" _locID="dataquery.BoramLib.Logger.Msg" _locAttrData="name" query=""></DataQuery> </DataQueries> </Binding> </Bindings> </DiagnosticEventSpecification> |
인텔리 트레이스 세부 항목 이름(SettingName)과 타입 이름, 메서드 이름, 인텔리 트레이스 이벤트 제목(ShortDescription), 이벤트 상세 내용(LongDescription)등을 기록합니다. 그리고 메서드의 리턴 타입이나 매개변수등을 DataQuery항목에서 잡아서, 메세지에 출력하도록 할 수 있습니다. DataQeury의 속성 중에 중요한 것에 대해서 좀 더 자세한 설명을 드리면요~,
- index : 필수 속성이며, -1이면 리턴 값을 나타내며, 인스턴스 메서드의 경우는 0이 인스턴스를 가리키며, 1부터 차례대로 매개변수를 가리킨다. static 메서드의 경우는 0부터 차례대로 매개변수를 나타낸다. 즉, 위 Herehere메서드는 static메서드 이므로 0번은 msg 매개변수를 가리킨다. - type : 인덱스에 해당하는 값의 타입을 명시하며, Boolean ,Char ,Double ,Single (float) ,Int16 ,UInt16 ,Int32 ,UInt32 ,Int64 ,UInt64 ,String타입이 명시 가능하다. 이 값에 포함되지 않는 타입은 IProgammableDataQuery를 구현하는 다른 방법을 사용해야 한다. |
이런 설정을 통해서 메세지에 포함할 값을 명시할 수 있는 것이죠. 설정을 저장한 후에, Visual Studio를 재시작 합니다. 이제 커스템 이벤트를 잡을 준비는 마쳤으므로, 실제로 커스텀 이벤트를 잡는 코드를 작성해보겠습니다. 간단한 콘솔 어플리케이션을 생성한 다음에, BoramLib.dll을 참조추가합니다.
namespace ConsoleApplication1 { class Program { static void Main(string[] args) { BoramLib.Logger.Herehere("프로그램 시작"); BoramLib.Logger.Herehere("프로그램 끗"); } } } |
위와 같이 Herehere메서드를 두번 사용하고 나서,
옵션에서 Logger의 Herehere!!항목이 선택되어 있는지 확인합니다. 그리고 Main메서드의 닫는 중괄호(})에 중단점을 놓고 디버깅을 시작합니다.
그러면 위와 같이 인텔리 트레이스의 이벤트 로그에 Herehere메서드가 잡힌 것을 볼 수 있습니다. 이렇게 여러분이 직접 필요한 메서드에 대한 이벤트를 잡도록 설정해서 로그를 활용할 수 있습니다.
- 참고자료
1. http://blog.qetza.net/en/2010/03/08/vs-2010-personnalisation-des-vnements-de-lintellitrace/
'Visual Studio 2010' 카테고리의 다른 글
Visual Studio 2010 Service Pack 1에 대한 모든 것 (3) | 2011.04.14 |
---|---|
개발자를 위한 앱스토어 천국 'Visual Studio 온라인 갤러리' (1) | 2011.03.13 |
Visual Studio 31 (4.1) - Visual Studio 2010 Productivity Power Tools, Part 1 (7) | 2010.11.22 |
Visual Studio 31 (3) - Temp Project (2) | 2010.11.18 |
Visual Studio 31 (2) - Startpage (4) | 2010.11.15 |