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