Files
go-winio/internal/etw/sample/sample.go
T

80 lines
2.0 KiB
Go

// Shows a sample usage of the ETW logging package.
package main
import (
"bufio"
"encoding/binary"
"encoding/hex"
"fmt"
"os"
"github.com/Microsoft/go-winio/internal/etw"
"github.com/sirupsen/logrus"
"golang.org/x/sys/windows"
)
func callback(sourceID *windows.GUID, state etw.ProviderState, level etw.Level, matchAnyKeyword uint64, matchAllKeyword uint64, filterData uintptr) {
fmt.Printf("Callback: isEnabled=%d, level=%d, matchAnyKeyword=%d\n", state, level, matchAnyKeyword)
}
func guidToString(guid *windows.GUID) string {
data1 := make([]byte, 4)
binary.BigEndian.PutUint32(data1, guid.Data1)
data2 := make([]byte, 2)
binary.BigEndian.PutUint16(data2, guid.Data2)
data3 := make([]byte, 2)
binary.BigEndian.PutUint16(data3, guid.Data3)
return fmt.Sprintf(
"%s-%s-%s-%s-%s",
hex.EncodeToString(data1),
hex.EncodeToString(data2),
hex.EncodeToString(data3),
hex.EncodeToString(guid.Data4[:2]),
hex.EncodeToString(guid.Data4[2:]))
}
func main() {
provider, err := etw.NewProvider("TestProvider", callback)
if err != nil {
logrus.Error(err)
return
}
defer func() {
if err := provider.Close(); err != nil {
logrus.Error(err)
}
}()
fmt.Println("Provider ID:", guidToString(provider.ID))
reader := bufio.NewReader(os.Stdin)
fmt.Println("Press enter to log an event")
reader.ReadString('\n')
event := etw.NewEvent("TestEvent", etw.NewEventDescriptor())
event.Metadata.AddField("TestField", etw.InTypeANSIString)
event.Data.AddString("Foo")
event.Metadata.AddField("TestField2", etw.InTypeANSIString)
event.Data.AddString("Bar")
event.Metadata.AddField("TestArray", etw.InTypeANSIString, etw.WithArray())
event.Data.AddSimple(uint16(5))
event.Data.AddString("Item1")
event.Data.AddString("Item2")
event.Data.AddString("Item3")
event.Data.AddString("Item4")
event.Data.AddString("Item5")
if err := provider.WriteEvent(event); err != nil {
fmt.Println(err)
return
}
fmt.Println("Event written")
fmt.Println("Press enter to exit")
reader.ReadString('\n')
}