mirror of
https://github.com/rwinkhart/go-winio.git
synced 2026-08-28 04:46:50 -04:00
110 lines
2.8 KiB
Go
110 lines
2.8 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 events")
|
|
reader.ReadString('\n')
|
|
|
|
// Write using high-level API.
|
|
if err := provider.WriteEvent(
|
|
"TestEvent",
|
|
etw.WithEventOpts(
|
|
etw.WithLevel(etw.LevelInfo),
|
|
etw.WithKeyword(0x140),
|
|
),
|
|
etw.WithFields(
|
|
etw.StringField("TestField", "Foo"),
|
|
etw.StringField("TestField2", "Bar"),
|
|
etw.Struct("TestStruct",
|
|
etw.StringField("Field1", "Value1"),
|
|
etw.StringField("Field2", "Value2")),
|
|
etw.StringArray("TestArray", []string{
|
|
"Item1",
|
|
"Item2",
|
|
"Item3",
|
|
"Item4",
|
|
"Item5",
|
|
})),
|
|
); err != nil {
|
|
logrus.Error(err)
|
|
return
|
|
}
|
|
|
|
// Write using low-level API.
|
|
descriptor := etw.NewEventDescriptor()
|
|
descriptor.Level = etw.LevelInfo
|
|
descriptor.Keyword = 0x140
|
|
em := &etw.EventMetadata{}
|
|
ed := &etw.EventData{}
|
|
em.WriteEventHeader("TestEvent", 0)
|
|
em.WriteField("TestField", etw.InTypeANSIString, etw.OutTypeUTF8, 0)
|
|
ed.WriteString("Foo")
|
|
em.WriteField("TestField2", etw.InTypeANSIString, etw.OutTypeUTF8, 0)
|
|
ed.WriteString("Bar")
|
|
em.WriteStruct("TestStruct", 2, 0)
|
|
em.WriteField("Field1", etw.InTypeANSIString, etw.OutTypeUTF8, 0)
|
|
ed.WriteString("Value1")
|
|
em.WriteField("Field2", etw.InTypeANSIString, etw.OutTypeUTF8, 0)
|
|
ed.WriteString("Value2")
|
|
em.WriteArray("TestArray", etw.InTypeANSIString, etw.OutTypeDefault, 0)
|
|
ed.WriteUint16(5)
|
|
ed.WriteString("Item1")
|
|
ed.WriteString("Item2")
|
|
ed.WriteString("Item3")
|
|
ed.WriteString("Item4")
|
|
ed.WriteString("Item5")
|
|
if err := provider.WriteEventRaw(descriptor, nil, nil, [][]byte{em.Bytes()}, [][]byte{ed.Bytes()}); err != nil {
|
|
logrus.Error(err)
|
|
return
|
|
}
|
|
}
|