Note
ãã®ããŒãžã«ã¢ã¯ã»ã¹ããã«ã¯ãæ¿èªãå¿ èŠã§ãã ãµã€ã³ã€ã³ãŸãã¯ãã£ã¬ã¯ããªã®å€æŽã詊ãããšãã§ããŸãã
ãã®ããŒãžã«ã¢ã¯ã»ã¹ããã«ã¯ãæ¿èªãå¿ èŠã§ãã ãã£ã¬ã¯ããªã®å€æŽã詊ãããšãã§ããŸãã
ãã®èšäºã¯ãâïž.NET Framework 4.5 以éã®ããŒãžã§ã³ âïž .NET Core 3.1 以éã®ããŒãžã§ã³ é©çšãããŸã
ã®æŠèŠã¬ã€ã ã§ã¯ãæå°éã® EventSource ãäœæãããã¬ãŒã¹ ãã¡ã€ã«ã§ã€ãã³ããåéããæ¹æ³ã«ã€ããŠèª¬æããŸããã ãã®ãã¥ãŒããªã¢ã«ã§ã¯ãSystem.Diagnostics.Tracing.EventSourceã䜿çšããã€ãã³ãã®äœæã«ã€ããŠè©³ãã説æããŸãã
æå°éã® EventSource
[EventSource(Name = "Demo")]
class DemoEventSource : EventSource
{
public static DemoEventSource Log { get; } = new DemoEventSource();
[Event(1)]
public void AppStarted(string message, int favoriteNumber) => WriteEvent(1, message, favoriteNumber);
}
掟ç EventSource ã®åºæ¬æ§é ã¯åžžã«åãã§ãã å ·äœçã«ã¯æ¬¡ã®ãšããã§ãã
- ã¯ã©ã¹ã¯ System.Diagnostics.Tracing.EventSource ããç¶æ¿ãããŸã
- çæããã€ãã³ãã®çš®é¡ããšã«ãã¡ãœãããå®çŸ©ããå¿ èŠããããŸãã ãã®ã¡ãœããã«ã¯ãäœæãããã€ãã³ãã®ååã䜿çšããŠååãä»ããå¿ èŠããããŸãã ã€ãã³ãã«è¿œå ã®ããŒã¿ãããå Žåã¯ãåŒæ°ã䜿çšããŠæž¡ãå¿ èŠããããŸãã ãããã®ã€ãã³ãåŒæ°ã¯ã·ãªã¢ã«åããå¿ èŠããããããç¹å®ã®å ã®ã¿ãèš±å¯ãããŸãã
- åã¡ãœããã«ã¯ãWriteEvent ãåŒã³åºãæ¬æããããID (ã€ãã³ããè¡šãæ°å€) ãšã€ãã³ã ã¡ãœããã®åŒæ°ãæž¡ããŸãã ID 㯠EventSource å ã§äžæã§ããå¿ èŠããããŸãã ID ã¯ãSystem.Diagnostics.Tracing.EventAttribute ã䜿çšããŠæç€ºçã«å²ãåœãŠãããŸã
- EventSources ã¯ãã·ã³ã°ã«ãã³ ã€ã³ã¹ã¿ã³ã¹ã察象ãšããŠããŸãã ãããã£ãŠããã®ã·ã³ã°ã«ãã³ã衚ã
LogãšããèŠåã«ãã£ãŠãéç倿°ãå®çŸ©ãããšäŸ¿å©ã§ãã
ã€ãã³ã ã¡ãœãããå®çŸ©ããããã®èŠå
- EventSource ã¯ã©ã¹ã§å®çŸ©ãããŠããéä»®æ³ void æ»ãã¡ãœããã®ã€ã³ã¹ã¿ã³ã¹ã¯ãæ¢å®ã§ã¯ã€ãã³ã ãã° ã¡ãœããã§ãã
- ä»®æ³ã¡ãœãããŸã㯠void ãè¿ããªãã¡ãœããã¯ãSystem.Diagnostics.Tracing.EventAttribute ã§ããŒã¯ãããŠããå Žåã«ã®ã¿å«ãŸããŸãã
- ç¹å®ã®æ¡ä»¶ãæºããã¡ãœããããã°èšé²ããªãããã«ããã«ã¯ãSystem.Diagnostics.Tracing.NonEventAttribute ã§è£ 食ããå¿ èŠããããŸãã
- ã€ãã³ã ãã° ã¡ãœããã«ã¯ãã€ãã³ã ID ãé¢é£ä»ããããŠããŸãã ããã¯ãã¡ãœããã System.Diagnostics.Tracing.EventAttribute ã§ä¿®é£Ÿããããšã«ãã£ãŠæç€ºçã«è¡ãããã¯ã©ã¹å ã®ã¡ãœããã®åºæ°ã§æé»çã«è¡ãããšãã§ããŸãã ããšãã°ãã¯ã©ã¹ã®æåã®ã¡ãœããã«æé»çãªçªå·ä»ãã䜿çšãããšãID ã 1 ã«ãªãã2 ã€ç®ã®ã¡ãœãã㯠ID 2 ã«ãªããŸãã
- ã€ãã³ã ãã° ã¡ãœããã¯ãWriteEventãWriteEventCoreãWriteEventWithRelatedActivityIdããŸã㯠WriteEventWithRelatedActivityIdCore ãªãŒããŒããŒããåŒã³åºãå¿ èŠããããŸãã
- ã€ãã³ã ID ã¯ãæé»çãæç€ºçãã«é¢ä¿ãªããåŒã³åºã WriteEvent* API ã«æž¡ãããæåã®åŒæ°ãšäžèŽããå¿ èŠããããŸãã
- EventSource ã¡ãœããã«æž¡ãããåŒæ°ã®æ°ãåãé åºã¯ãWriteEvent* API ã«æž¡ãããæ¹æ³ãšäžèŽããŠããå¿
èŠããããŸãã WriteEvent ã®å ŽåãåŒæ°ã¯ã€ãã³ã ID ã«åŸããWriteEventWithRelatedActivityId ã®å ŽåãåŒæ°ã¯ relatedActivityId ã«åŸããŸãã WriteEvent*Core ã¡ãœããã®å ŽåãåŒæ°ã¯æåã§
dataãã©ã¡ãŒã¿ãŒã«ã·ãªã¢ã«åããå¿ èŠããããŸãã - ã€ãã³ãåã«ã¯ã
<ãŸãã¯>æåãå«ããããšã¯ã§ããŸããã ãŠãŒã¶ãŒå®çŸ©ã¡ãœããã«ããããã®æåãå«ããããšã¯ã§ããŸããããasyncã¡ãœããã¯ã³ã³ãã€ã©ã«ãã£ãŠæžãæãããããã®æåãå«ãŸããŸãã ãããã®çæãããã¡ãœãããã€ãã³ãã«ãªããªãããã«ãEventSource ã®ãã¹ãŠã®éã€ãã³ã ã¡ãœããã NonEventAttributeã§ããŒã¯ããŸãã
ãã¹ã ãã©ã¯ãã£ã¹
- EventSource ããæŽŸçããåã¯ãéåžžãéå±€å ã«äžéåãæããªãããã€ã³ã¿ãŒãã§ã€ã¹ãå®è£ ããŸããã ããã圹ç«ã€å¯èœæ§ãããããã€ãã®äŸå€ã«ã€ããŠã¯ãä»¥äž é«åºŠãªã«ã¹ã¿ãã€ãºãåç §ããŠãã ããã
- äžè¬ã«ãEventSource ã¯ã©ã¹ã®åå㯠EventSource ã®äžé©åãªãããªãã¯åã§ãã ãããªãã¯å (ãã°æ§æãšãã° ãã¥ãŒã¢ãŒã«è¡šç€ºãããåå) ã¯ãã°ããŒãã«ã«äžæã§ããå¿
èŠããããŸãã ãããã£ãŠãSystem.Diagnostics.Tracing.EventSourceAttributeã䜿çšã㊠EventSource ã«ãããªãã¯åãä»ããã®ãè¯ãæ¹æ³ã§ãã äžèšã§äœ¿çšãã "Demo" ãšããååã¯çããäžæã§ããå¯èœæ§ã¯äœãã®ã§ãéçšç°å¢ã§ã®äœ¿çšã«ã¯é©ããŠããŸããã äžè¬çãªèŠåã¯ã"MyCompany-Samples-Demo" ãªã©ã®åºåãèšå·ãšããŠ
.ãŸãã¯-ãæã€éå±€åããŸã㯠EventSource ãã€ãã³ããæäŸããã¢ã»ã³ããªãŸãã¯åå空éã®ååã䜿çšããããšã§ãã ãããªãã¯åã®äžéšãšã㊠"EventSource" ãå«ããã®ã¯ãå§ãããŸããã - ã€ãã³ã ID ãæç€ºçã«å²ãåœãŠãŸãããã®æ¹æ³ã§ã¯ããœãŒã¹ ã¯ã©ã¹å ã®ã³ãŒãã«å¯ŸããŠäžèŠç¡å®³ãªå€æŽãè¡ããŸã ãããšãã°ãé 眮ã倿Žããããéäžã§ã¡ãœããã远å ãããããŠããåã¡ãœããã«é¢é£ä»ããããŠããã€ãã³ã ID ã¯å€æŽãããŸããã
- äœæ¥åäœã®éå§ãšçµäºã衚ãã€ãã³ããäœæããå ŽåãèŠåã«ããããããã®ã¡ãœããã®ååã«ã¯ãµãã£ãã¯ã¹ 'Start' ãš 'Stop' ãä»ããããŸãã ããšãã°ã'RequestStart' ã 'RequestStop' ãªã©ã§ãã
- äžäœäºææ§ã®ããã«å¿ èŠãªå Žåãé€ããEventSourceAttribute ã® Guid ããããã£ã«ã¯æç€ºçãªå€ãæå®ããªãã§ãã ããã æ¢å®ã® Guid å€ã¯ãœãŒã¹ã®ååããæŽŸçããŸããããã«ãããããŒã«ã¯ãã人éãå€èªã§ããååãåãå ¥ããåã Guid ãæŽŸçã§ããŸãã
- ã€ãã³ãã®çºçã«é¢é£ãããªãœãŒã¹ãéäžçã«äœ¿çšããåŠçãå®è¡ããåã«ãIsEnabled() ãåŒã³åºããŸããããšãã°ãã€ãã³ããç¡å¹ã«ãªã£ãŠããå Žåã«äžèŠãªã³ã¹ãã®é«ãã€ãã³ãåŒæ°ãèšç®ããå Žåãªã©ã§ãã
- EventSource ãªããžã§ã¯ãã®äºææ§ãç¶æããé©åã«ããŒãžã§ã³ç®¡çã詊ã¿ãŸãã ã€ãã³ãã®æ¢å®ã®ããŒãžã§ã³ã¯ 0 ã§ãã ããŒãžã§ã³ã¯ EventAttribute.Versionèšå®ããããšã§å€æŽã§ããŸãã ã€ãã³ããšå ±ã«ã·ãªã¢ã«åãããããŒã¿ã倿Žãããã³ã«ãã€ãã³ãã®ããŒãžã§ã³ã倿ŽããŸãã ã€ãã³ã宣èšã®æåŸãã€ãŸãã¡ãœãã ãã©ã¡ãŒã¿ãŒã®äžèŠ§ã®æ«å°Ÿã«ãæ°ããã·ãªã¢ã«åãããããŒã¿ãåžžã«è¿œå ããŸãã ãããäžå¯èœãªå Žåã¯ãæ°ãã ID ãæã€æ°ããã€ãã³ããäœæããŠãå€ãã€ãã³ãã眮ãæããŸãã
- ã€ãã³ã ã¡ãœããã宣èšããå Žåã¯ãå¯å€ãµã€ãºã®ããŒã¿ã®åã«åºå®ãµã€ãºã®ãã€ããŒã ããŒã¿ãæå®ããŸãã
- null æåãå«ãæååã¯äœ¿çšããªãã§ãã ããã ETW EventSource ã®ãããã§ã¹ããçæããéãC# ã®æååã«ã¯ null æåãå«ããããšãã§ããã«ããããããããã¹ãŠã®æååã null çµäºãšããŠå®£èšãããŸãã æååã« null æåãå«ãŸããŠããå Žåãæååå šäœãã€ãã³ã ãã€ããŒãã«æžã蟌ãŸããŸãããããŒãµãŒã¯æåã® null æåãæååã®æ«å°ŸãšããŠæ±ããŸãã æååã®åŸã«ãã€ããŒãåŒæ°ãããå Žåãæååã®æ®ãã®éšåã¯ãç®çã®å€ã§ã¯ãªãè§£æãããŸãã
äžè¬çãªã€ãã³ãã®ã«ã¹ã¿ãã€ãº
ã€ãã³ãã®åé·æ§ã¬ãã«ã®èšå®
åã€ãã³ãã«ã¯è©³çްã¬ãã«ããããã€ãã³ã ãµãã¹ã¯ã©ã€ããŒã¯å€ãã®å ŽåãEventSource äžã®ãã¹ãŠã®ã€ãã³ããç¹å®ã®è©³çްã¬ãã«ãŸã§æå¹ã«ããŸãã ã€ãã³ãã¯ãLevel ããããã£ã䜿çšããŠåé·æ§ã¬ãã«ãæå®ããŸãã ããšãã°ãã¬ãã« Informational 以äžã®ã€ãã³ããèŠæ±ãããµãã¹ã¯ã©ã€ããŒã®äžã®ãã® EventSource ã§ã¯ãVerbose DebugMessage ã€ãã³ãã¯ãã°ã«èšé²ãããŸããã
[EventSource(Name = "MyCompany-Samples-Demo")]
class DemoEventSource : EventSource
{
public static DemoEventSource Log { get; } = new DemoEventSource();
[Event(1, Level = EventLevel.Informational)]
public void AppStarted(string message, int favoriteNumber) => WriteEvent(1, message, favoriteNumber);
[Event(2, Level = EventLevel.Verbose)]
public void DebugMessage(string message) => WriteEvent(2, message);
}
EventAttribute ã§ã€ãã³ãã®è©³çްã¬ãã«ãæå®ãããŠããªãå Žåãæ¢å®ã§ã¯ Informational ã«ãªããŸãã
ãã¹ã ãã©ã¯ãã£ã¹
æ¯èŒçãŸããªèŠåãŸãã¯ãšã©ãŒã«ã¯ãInformational æªæºã®ã¬ãã«ã䜿çšããŸãã äžæãªå Žåã¯ãæ¢å®ã® Informational ã䜿çšãã1000 ã€ãã³ã/ç§ããé »ç¹ã«çºçããã€ãã³ãã« Verbose ã䜿çšããŸãã
ã€ãã³ã ããŒã¯ãŒãã®èšå®
äžéšã®ã€ãã³ã ãã¬ãŒã¹ ã·ã¹ãã ã§ã¯ã远å ã®ãã£ã«ã¿ãŒåŠçã¡ã«ããºã ãšããŠããŒã¯ãŒãããµããŒããããŠããŸãã 詳现ã¬ãã«ã§ã€ãã³ããåé¡ãã詳现ãšã¯ç°ãªããããŒã¯ãŒãã¯ãã³ãŒãæ©èœã®é åãç¹å®ã®åé¡ã®èšºæã«åœ¹ç«ã€ãã®ä»ã®æ¡ä»¶ã«åºã¥ããŠã€ãã³ããåé¡ããããšãç®çãšããŠããŸãã ããŒã¯ãŒãã¯ååä»ãããã ãã©ã°ã§ãããåã€ãã³ãã«ã¯ä»»æã®çµã¿åããã®ããŒã¯ãŒããé©çšã§ããŸãã ããšãã°ã次㮠EventSource ã§ã¯ãèŠæ±åŠçã«é¢é£ããããã€ãã®ã€ãã³ããšãã¹ã¿ãŒãã¢ããã«é¢é£ãããã®ä»ã®ã€ãã³ããå®çŸ©ãããŠããŸãã éçºè ãã¹ã¿ãŒãã¢ããã®ããã©ãŒãã³ã¹ãåæãããå Žåã¯ãstartup ããŒã¯ãŒãã§ããŒã¯ãããã€ãã³ãã®ãã°èšé²ã®ã¿ãæå¹ã«ã§ããŸãã
[EventSource(Name = "Demo")]
class DemoEventSource : EventSource
{
public static DemoEventSource Log { get; } = new DemoEventSource();
[Event(1, Keywords = Keywords.Startup)]
public void AppStarted(string message, int favoriteNumber) => WriteEvent(1, message, favoriteNumber);
[Event(2, Keywords = Keywords.Requests)]
public void RequestStart(int requestId) => WriteEvent(2, requestId);
[Event(3, Keywords = Keywords.Requests)]
public void RequestStop(int requestId) => WriteEvent(3, requestId);
public class Keywords // This is a bitvector
{
public const EventKeywords Startup = (EventKeywords)0x0001;
public const EventKeywords Requests = (EventKeywords)0x0002;
}
}
ããŒã¯ãŒãã¯ãKeywords ãšåŒã°ããå
¥ãåã«ãªã£ãã¯ã©ã¹ã䜿çšããŠå®çŸ©ããå¿
èŠããããåã
ã®ããŒã¯ãŒã㯠public const EventKeywordsåæå®ãããã¡ã³ããŒã«ãã£ãŠå®çŸ©ãããŸãã
ãã¹ã ãã©ã¯ãã£ã¹
ããŒã¯ãŒãã¯ã倧éã®ã€ãã³ããåºå¥ããéã«éèŠã§ãã ããã«ãããã€ãã³ã ã³ã³ã·ã¥ãŒããŒã¯è©³çŽ°åºŠãé«ãã¬ãã«ã«äžããããšãã§ããŸãããã€ãã³ãã®çããµãã»ããã®ã¿ãæå¹ã«ããããšã§ãããã©ãŒãã³ã¹ã®ãªãŒããŒããããšãã° ãµã€ãºã管çã§ããŸãã 1,000/ç§ãè¶ ããã€ãã³ããããªã¬ãŒãããã€ãã³ãã¯ãäžæã®ããŒã¯ãŒãã®åè£ãšããŠé©ããŠããŸãã
ãµããŒããããŠãããã©ã¡ãŒã¿ãŒå
EventSource ã§ã¯ãéãããåã®ã»ããã®ã¿ãåãå ¥ããããã«ããã¹ãŠã®ã€ãã³ã ãã©ã¡ãŒã¿ãŒãã·ãªã¢ã«åã§ããå¿ èŠããããŸãã ãããã¯ïŒ
- ããªããã£ãå: boolãbyteãsbyteãcharãshortãushortãintãuintãlongãulongãfloatãdoubleãIntPtrãUIntPtrãGuidãdecimalãstringãDateTimeãDateTimeOffsetãTimeSpan
- åæå
- System.Diagnostics.Tracing.EventDataAttributeã§å±æ§ä»ããããæ§é äœã ã·ãªã¢ã«åå¯èœãªåãæã€ãããªã㯠ã€ã³ã¹ã¿ã³ã¹ ããããã£ã®ã¿ãã·ãªã¢ã«åãããŸãã
- ãã¹ãŠã®ãããªã㯠ããããã£ãã·ãªã¢ã«åå¯èœãªåã§ããå¿åå
- ã·ãªã¢ã«åå¯èœãªåã®é å
- Nullable<T> (T ã¯ã·ãªã¢ã«åå¯èœãªå)
- KeyValuePair<TãU> ããã§ T ãš U ã¯äž¡æ¹ãšãã·ãªã¢ã«åå¯èœãªåã§ã
- å³å¯ã« 1 ã€ã®å T ã«å¯Ÿã㊠IEnumerable<T> ãå®è£ ããT ãã·ãªã¢ã«åå¯èœãªåã§ããå
ãã©ãã«ã·ã¥ãŒãã£ã³ã°
EventSource ã¯ã©ã¹ã¯ãæ¢å®ã§äŸå€ãã¹ããŒããªãèšèšã«ãªã£ãŠããŸããã ããã¯äŸ¿å©ãªããããã£ã§ãããã°èšé²ã¯çç¥å¯èœãšããŠæ±ãããããšãå€ããéåžžãã¢ããªã±ãŒã·ã§ã³ã倱æããåå ãšãªããã° ã¡ãã»ãŒãžã®æžã蟌ã¿ãšã©ãŒã¯å¿ èŠãããŸããã ãã ããããã«ãããEventSource ã§ééããèŠã€ããã®ãå°é£ã«ãªããŸãã ãã©ãã«ã·ã¥ãŒãã£ã³ã°ã«åœ¹ç«ã€ããã€ãã®ææ³ã次ã«ç€ºããŸãã
- EventSource ã³ã³ã¹ãã©ã¯ã¿ãŒã«ã¯ãEventSourceSettingsãåãåããªãŒããŒããŒãããããŸãã ThrowOnEventWriteErrors ãã©ã°ãäžæçã«æå¹ã«ããŠã¿ãŠãã ããã
- EventSource.ConstructionException ããããã£ã«ã¯ãã€ãã³ã ãã° ã¡ãœããã®æ€èšŒæã«çæãããäŸå€ãæ ŒçŽãããŸãã ããã«ãããããŸããŸãªäœæãšã©ãŒã衚瀺ãããå¯èœæ§ããããŸãã
- EventSource ã¯ã€ãã³ã ID 0 ã䜿çšããŠãšã©ãŒããã°ã«èšé²ãããã®ãšã©ãŒ ã€ãã³ãã«ã¯ãšã©ãŒã説æããæååãå«ãŸããŠããŸãã
- ãããã°æã«ã¯ãåããšã©ãŒæååã Debug.WriteLine() ã䜿çšããŠãã°ã«èšé²ããããããã°åºåãŠã£ã³ããŠã«è¡šç€ºãããŸãã
- EventSource ã¯å éšçã«äŸå€ãã¹ããŒãããšã©ãŒãçºçãããšãã«äŸå€ããã£ããããŸãã ãããã®äŸå€ãçºçããŠããããšã確èªããã«ã¯ããããã¬ãŒã§ååäŸå€ãæå¹ã«ãããã.NET ã©ã³ã¿ã€ã ã® äŸå€ã€ãã³ããæå¹ã«ããŠã€ãã³ã ãã¬ãŒã¹ 䜿çšããŸãã
é«åºŠãªã«ã¹ã¿ãã€ãº
OpCode ãšã¿ã¹ã¯ã®èšå®
ETW ã«ã¯ãã€ãã³ãã®ã¿ã°ä»ããšãã£ã«ã¿ãŒåŠçã®ããã®ããã«ã¡ã«ããºã ã§ãããã¿ã¹ã¯ãš OpCodesã®æŠå¿µããããŸãã Task ããããã£ãš Opcode ããããã£ã䜿çšããŠãã€ãã³ããç¹å®ã®ã¿ã¹ã¯ããªãã³ãŒãã«é¢é£ä»ããããšãã§ããŸãã æ¬¡ã«äŸã瀺ããŸãã
[EventSource(Name = "Samples-EventSourceDemos-Customized")]
public sealed class CustomizedEventSource : EventSource
{
static public CustomizedEventSource Log { get; } = new CustomizedEventSource();
[Event(1, Task = Tasks.Request, Opcode=EventOpcode.Start)]
public void RequestStart(int RequestID, string Url)
{
WriteEvent(1, RequestID, Url);
}
[Event(2, Task = Tasks.Request, Opcode=EventOpcode.Info)]
public void RequestPhase(int RequestID, string PhaseName)
{
WriteEvent(2, RequestID, PhaseName);
}
[Event(3, Keywords = Keywords.Requests,
Task = Tasks.Request, Opcode=EventOpcode.Stop)]
public void RequestStop(int RequestID)
{
WriteEvent(3, RequestID);
}
public class Tasks
{
public const EventTask Request = (EventTask)0x1;
}
}
ã€ãã³ã ID ãé£ç¶ããååä»ããã¿ãŒã³ã <EventName>Start ãš <EventName>Stop ã® 2 ã€ã®ã€ãã³ã ã¡ãœããã宣èšããããšã§ãEventTask ãªããžã§ã¯ããæé»çã«äœæã§ããŸãã ãããã®ã€ãã³ãã¯ã¯ã©ã¹å®çŸ©å ã§çžäºã«å®£èšããå¿ èŠãããã<EventName>Start ã¡ãœãããå ã«æ¥ãå¿ èŠããããŸãã
èªå·±èšè¿° (ãã¬ãŒã¹ ãã°) ãšãããã§ã¹ã ã€ãã³ãã®åœ¢åŒ
ãã®æŠå¿µã¯ãETW ãã EventSource ããµãã¹ã¯ã©ã€ãããå Žåã«ã®ã¿éèŠã§ãã ETW ã«ã¯ãã€ãã³ããèšé²ããããã® 2 ã€ã®ç°ãªãæ¹æ³ããããããã¯ãããã§ã¹ã圢åŒãšèªå·±èšè¿°åïŒãã¬ãŒã¹ãã°ãšãåŒã°ããïŒåœ¢åŒã§ãã ãããã§ã¹ã ããŒã¹ã® EventSource ãªããžã§ã¯ãã¯ãåæåæã«ã¯ã©ã¹ã§å®çŸ©ãããã€ãã³ãã衚ã XML ããã¥ã¡ã³ããçæããŠãã°ã«èšé²ããŸãã ããã«ãããEventSource ã¯ãããã€ããŒãšã€ãã³ãã®ã¡ã¿ããŒã¿ãçæããããã«ããèªäœãåæ ããå¿ èŠããããŸãã åã€ãã³ãã®èªå·±èšè¿°åœ¢åŒã®ã¡ã¿ããŒã¿ã¯ãäºåã§ã¯ãªãã€ãã³ã ããŒã¿ãšå ±ã«ã€ã³ã©ã€ã³ã§éä¿¡ãããŸãã èªå·±èšè¿°åã®ã¢ãããŒãã§ã¯ãå®çŸ©æžã¿ã®ã€ãã³ã ãã°æ¹æ³ãäœæããªããŠãä»»æã®ã€ãã³ããéä¿¡ã§ãããããæè»ãª Write ã¡ãœããããµããŒããããŠããŸãã ãŸããäžæçãªãªãã¬ã¯ã·ã§ã³ãåé¿ãããã®ã§ãèµ·åæã«ãå°ãé«éã«ãªããŸãã ãã ããåã€ãã³ãã§çæããã远å ã®ã¡ã¿ããŒã¿ã«ãããããã©ãŒãã³ã¹ã®ãªãŒããŒããããå°ãªãã倧éã®ã€ãã³ããéä¿¡ããå Žåã«ã¯æãŸãããªãå ŽåããããŸãã
èªå·±èšè¿°åã®ã€ãã³ã圢åŒã䜿çšããã«ã¯ãEventSource(String) ã³ã³ã¹ãã©ã¯ã¿ãŒãEventSource(StringãEventSourceSettings) ã³ã³ã¹ãã©ã¯ã¿ãŒããŸã㯠EventSourceSettings ã« EtwSelfDescribingEventFormat ãã©ã°ãèšå®ã㊠EventSource ãæ§ç¯ããŸãã
ã€ã³ã¿ãŒãã§ã€ã¹ãå®è£ ããŠãã EventSource ã®å
EventSource åã¯ãã€ã³ã¿ãŒãã§ã€ã¹ã䜿çšããŠå ±éã®ãã° ã¿ãŒã²ãããå®çŸ©ããããŸããŸãªé«åºŠãªãã° ã·ã¹ãã ã«ã·ãŒã ã¬ã¹ã«çµ±åããããã«ã€ã³ã¿ãŒãã§ã€ã¹ãå®è£ ã§ããŸãã 䜿çšã§ããäŸã次ã«ç€ºããŸãã
public interface IMyLogging
{
void Error(int errorCode, string msg);
void Warning(string msg);
}
[EventSource(Name = "Samples-EventSourceDemos-MyComponentLogging")]
public sealed class MyLoggingEventSource : EventSource, IMyLogging
{
public static MyLoggingEventSource Log { get; } = new MyLoggingEventSource();
[Event(1)]
public void Error(int errorCode, string msg)
{ WriteEvent(1, errorCode, msg); }
[Event(2)]
public void Warning(string msg)
{ WriteEvent(2, msg); }
}
ã€ã³ã¿ãŒãã§ã€ã¹ ã¡ãœããã« EventAttribute ãæå®ããå¿ èŠããããŸãããã以å€ã®å Žå (äºææ§äžã®çç±ãã)ãã¡ãœããã¯ãã° ã¡ãœãããšããŠæ±ãããŸããã æç€ºçãªã€ã³ã¿ãŒãã§ã€ã¹ ã¡ãœããã®å®è£ ã¯ãååã®ç«¶åãé²ãããã«èš±å¯ãããŠããŸããã
EventSource ã¯ã©ã¹éå±€
ã»ãšãã©ã®å ŽåãEventSource ã¯ã©ã¹ããçŽæ¥æŽŸçããåãèšè¿°ã§ããŸãã ãã ããã«ã¹ã¿ãã€ãºããã WriteEvent ãªãŒããŒããŒããªã©ãè€æ°ã®æŽŸç EventSource åã§å ±æãããæ©èœãå®çŸ©ãããšäŸ¿å©ãªå ŽåããããŸã (åŸè¿° 倧éã®ã€ãã³ãã®ããã©ãŒãã³ã¹ã®æé©å åç §)ã
æœè±¡åºåºã¯ã©ã¹ã¯ãããŒã¯ãŒããã¿ã¹ã¯ããªãã³ãŒãããã£ãã«ããŸãã¯ã€ãã³ããå®çŸ©ããªãéã䜿çšã§ããŸãã UtilBaseEventSource ã¯ã©ã¹ããåãã³ã³ããŒãã³ãå ã®è€æ°ã®æŽŸç EventSource ã§å¿ èŠãªæé©åããã WriteEvent ãªãŒããŒããŒããå®çŸ©ããäŸã次ã«ç€ºããŸãã ãããã®æŽŸçåã® 1 ã€ã OptimizedEventSource ãšããŠä»¥äžã«ç€ºããŸãã
public abstract class UtilBaseEventSource : EventSource
{
protected UtilBaseEventSource()
: base()
{ }
protected UtilBaseEventSource(bool throwOnEventWriteErrors)
: base(throwOnEventWriteErrors)
{ }
protected unsafe void WriteEvent(int eventId, int arg1, short arg2, long arg3)
{
if (IsEnabled())
{
EventSource.EventData* descrs = stackalloc EventSource.EventData[2];
descrs[0].DataPointer = (IntPtr)(&arg1);
descrs[0].Size = 4;
descrs[1].DataPointer = (IntPtr)(&arg2);
descrs[1].Size = 2;
descrs[2].DataPointer = (IntPtr)(&arg3);
descrs[2].Size = 8;
WriteEventCore(eventId, 3, descrs);
}
}
}
[EventSource(Name = "OptimizedEventSource")]
public sealed class OptimizedEventSource : UtilBaseEventSource
{
public static OptimizedEventSource Log { get; } = new OptimizedEventSource();
[Event(1, Keywords = Keywords.Kwd1, Level = EventLevel.Informational,
Message = "LogElements called {0}/{1}/{2}.")]
public void LogElements(int n, short sh, long l)
{
WriteEvent(1, n, sh, l); // Calls UtilBaseEventSource.WriteEvent
}
#region Keywords / Tasks /Opcodes / Channels
public static class Keywords
{
public const EventKeywords Kwd1 = (EventKeywords)1;
}
#endregion
}
倧éã®ã€ãã³ãã«å¯Ÿããããã©ãŒãã³ã¹ã®æé©å
EventSource ã¯ã©ã¹ã«ã¯ãå¯å€æ°ã®åŒæ°ã«å¯Ÿã㊠1 ã€ãå«ããWriteEvent ã®ãªãŒããŒããŒãã倿°çšæãããŠããŸãã ä»ã®ãªãŒããŒããŒããäžèŽããªãå Žåã¯ãparams ã¡ãœãããåŒã³åºãããŸãã æ®å¿µãªããããã©ã¡ãŒã¿ãŒã®ãªãŒããŒããŒãã¯æ¯èŒçé«äŸ¡ã§ãã å ·äœçã«ã¯æ¬¡ã®ããã«ãªããŸãã
- 倿°åŒæ°ãä¿æããé åãå²ãåœãŠãŸãã
- åãã©ã¡ãŒã¿ãŒããªããžã§ã¯ãã«ãã£ã¹ãããŸããããã«ãããå€åã®å²ãåœãŠãçºçããŸãã
- ãããã®ãªããžã§ã¯ããé åã«å²ãåœãŠãŸãã
- 颿°ãåŒã³åºããŸãã
- åé åèŠçŽ ã®åã調ã¹ãŠããããã·ãªã¢ã«åããæ¹æ³ã決å®ããŸãã
ããã¯ãç¹æ®ãªåã® 10 ~ 20 åã®ã³ã¹ãããããå¯èœæ§ããããŸãã ããã¯ããªã¥ãŒã ã®å°ãªãã±ãŒã¹ã§ã¯éèŠã§ã¯ãããŸãããã倧éã®ã€ãã³ãã®å Žåã¯éèŠãªå ŽåããããŸãã params ãªãŒããŒããŒãã䜿çšãããŠããªãããšãä¿èšŒããããã«ã次㮠2 ã€ã®éèŠãªã±ãŒã¹ããããŸãã
- åæåãé«éãªãŒããŒããŒãã® 1 ã€ãšäžèŽããããã«ãåæåã 'int' ã«ãã£ã¹ããããŠããããšã確èªããŸãã
- 倧éã®ãã€ããŒãçšã®æ°ããé«é WriteEvent ãªãŒããŒããŒããäœæããŸãã
4 ã€ã®æŽæ°åŒæ°ãåãåã WriteEvent ãªãŒããŒããŒãã远å ããäŸã次ã«ç€ºããŸãã
[NonEvent]
public unsafe void WriteEvent(int eventId, int arg1, int arg2,
int arg3, int arg4)
{
EventData* descrs = stackalloc EventProvider.EventData[4];
descrs[0].DataPointer = (IntPtr)(&arg1);
descrs[0].Size = 4;
descrs[1].DataPointer = (IntPtr)(&arg2);
descrs[1].Size = 4;
descrs[2].DataPointer = (IntPtr)(&arg3);
descrs[2].Size = 4;
descrs[3].DataPointer = (IntPtr)(&arg4);
descrs[3].Size = 4;
WriteEventCore(eventId, 4, (IntPtr)descrs);
}