三行Go代码让windows帮我保存日志

1,220 阅读2分钟

「这是我参与11月更文挑战的第13天,活动详情查看:2021最后一次更文挑战

最近有个需求,需要在windows平台上编写一个小应用,此外还需要记录点日志, 但量并不是很大,遂研究起能不能将日志记录到windows自带的日志系统中, 然后通过事件管理器来查看和管理日志。

实现

在golang官方提供的非标准库golang.org/x/sys/windows库中提供了一个名为eventlog的 包, 该包中定义了操作windows日志相关的方法。

使用go get安装之后即可使用

go get golang.org/x/sys

使用eventlog的方法并不复杂。

使用eventlog.Open创建一个Log实例, 该方法需要你传入一个字符串用来说明这些日志的来源地,一般为程序名称。

获取到Log实例后,我们便可以调用Info, Error, Warning方法向事件管理器中写入日志。与其他日志库不同,向windwos事件管理器写入日志时需要指定事件id(32位无符号整型)。

写完日志后需要调用Close方法关闭这个日志实例。

事件id有什么用呢?

一个比较直观的作用就是用于做监控和统计,比如只要知道安全相关的日志的事件id是什么就可以帮助判断当前计算机上是否存在着安全风险。

你可以在这儿-> Windows Security Log Events 看到Windows定义的与安全相关的事件码。

测试用例代码如下所示:

func Test_log(t *testing.T) {
	log, err := eventlog.Open("Kovogo")
	if err != nil {
		panic(err)
	}
	log.Error(100, "这是一条错误日志")
	log.Close()
}

运行该测试用例之后, 我们便可以在事件管理器中的Windows日志/应用程序目录中找到我们写入的日志。

在命令行中输入eventvwr.msc即可打开事件管理器, 然后便可以在事件管理器中查看我们刚刚写入的错误日志。

image.png

注意事项

  • windows日志的默认机制是:当日志文件大小超过限制时将覆盖之前的日志, 默认大小为20MB

右键对应的项目,然后点击"属性"即可看到下图, 通过选项来调整windows日志的行为

image.png

  • 清除windows日志很方便,但同时也会生成一条日志被清除的记录

如下图所示: 清除应用程序日志后,在系统日志下生成了一条“应用程序日志被清除”的记录

image.png

总结

调研过后,决定将windows日志作为旁路日志系统来辅助判断,主要日志还是由自己写进日志程序中。