1// +build windows 2 3// Shows a sample usage of the ETW logging package. 4package main 5 6import ( 7 "bufio" 8 "fmt" 9 "os" 10 "runtime" 11 12 "github.com/Microsoft/go-winio/pkg/etw" 13 "github.com/Microsoft/go-winio/pkg/guid" 14 "github.com/sirupsen/logrus" 15) 16 17func callback(sourceID guid.GUID, state etw.ProviderState, level etw.Level, matchAnyKeyword uint64, matchAllKeyword uint64, filterData uintptr) { 18 fmt.Printf("Callback: isEnabled=%d, level=%d, matchAnyKeyword=%d\n", state, level, matchAnyKeyword) 19} 20 21func main() { 22 fmt.Printf("Running on %s/%s\n", runtime.GOOS, runtime.GOARCH) 23 24 group, err := guid.FromString("12341234-abcd-abcd-abcd-123412341234") 25 if err != nil { 26 logrus.Error(err) 27 return 28 } 29 30 provider, err := etw.NewProvider("TestProvider", callback) 31 32 if err != nil { 33 logrus.Error(err) 34 return 35 } 36 defer func() { 37 if err := provider.Close(); err != nil { 38 logrus.Error(err) 39 } 40 }() 41 42 providerWithGroup, err := etw.NewProviderWithOptions("TestProviderWithGroup", etw.WithGroup(group), etw.WithCallback(callback)) 43 44 if err != nil { 45 logrus.Error(err) 46 return 47 } 48 defer func() { 49 if err := providerWithGroup.Close(); err != nil { 50 logrus.Error(err) 51 } 52 }() 53 54 fmt.Printf("Provider ID: %s\n", provider) 55 fmt.Printf("Provider w/ Group ID: %s\n", providerWithGroup) 56 57 reader := bufio.NewReader(os.Stdin) 58 59 fmt.Println("Press enter to log events") 60 reader.ReadString('\n') 61 62 if err := provider.WriteEvent( 63 "TestEvent", 64 etw.WithEventOpts( 65 etw.WithLevel(etw.LevelInfo), 66 etw.WithKeyword(0x140), 67 ), 68 etw.WithFields( 69 etw.StringField("TestField", "Foo"), 70 etw.StringField("TestField2", "Bar"), 71 etw.Struct("TestStruct", 72 etw.StringField("Field1", "Value1"), 73 etw.StringField("Field2", "Value2")), 74 etw.StringArray("TestArray", []string{ 75 "Item1", 76 "Item2", 77 "Item3", 78 "Item4", 79 "Item5", 80 })), 81 ); err != nil { 82 logrus.Error(err) 83 return 84 } 85 86 if err := providerWithGroup.WriteEvent( 87 "TestEventWithGroup", 88 etw.WithEventOpts( 89 etw.WithLevel(etw.LevelInfo), 90 etw.WithKeyword(0x140), 91 ), 92 etw.WithFields( 93 etw.StringField("TestField", "Foo"), 94 etw.StringField("TestField2", "Bar"), 95 etw.Struct("TestStruct", 96 etw.StringField("Field1", "Value1"), 97 etw.StringField("Field2", "Value2")), 98 etw.StringArray("TestArray", []string{ 99 "Item1", 100 "Item2", 101 "Item3", 102 "Item4", 103 "Item5", 104 })), 105 ); err != nil { 106 logrus.Error(err) 107 return 108 } 109} 110