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