GoLang实现日志收集器流程讲解

 更新时间:2023年05月12日 11:57:32   作者:未来谁可知  
这篇文章主要介绍了GoLang实现日志收集器流程,看日志是开发者平时排查BUG所必须的掌握的技能,但是日志冗杂,所以写个小工具来收集这些日志帮助我们排查BUG,感兴趣想要详细了解可以参考下文

Go自己动手实现日志收集

看日志是开发者平时排查BUG所必须的掌握的技能,但是日志是如何来的呢?通过平时开发者自己打日志,经过日志包进行处理,打印日志到控制台还是记录日志到文件中!

下面咱就来学一下日志是如何记录下来的

1. 日志器的接口

​ 以下日志器定义了各类日志器的行为,通过RegisterWriter注册实现了日志器的子类日志器,然后通过Log方法来进行循环调用注册进来的日志收集器的write写日志方法。

// 声明日志写入器接口
type LogWriter interface {
	Write(data interface{}) error
}
// 日志器
type Logger struct {
	// 这个日志器用到的日志写入器
	writerList []LogWriter
}
// 注册一个日志写入器
func (l *Logger) RegisterWriter(writer LogWriter) {
	l.writerList = append(l.writerList, writer)
}
// 将一个data类型的数据写入日志
func (l *Logger) Log(data interface{}) {
	// 遍历所有注册的写入器
	for _, writer := range l.writerList {
		// 将日志输出到每一个写入器中
		writer.Write(data)
	}
}
// 创建日志器的实例
func NewLogger() *Logger {
	return &Logger{}
}

2. 命令写入日志器

​ 这个日志器实现了日志器的接口行为write,可以进行日志的写入,其写入手法是通过Os包来写入到命令行(控制台)中!

// 命令行写入器
type consoleWriter struct {
}
// 实现LogWriter的Write()方法
func (f *consoleWriter) Write(data interface{}) error {
	// 将数据序列化为字符串
	str := fmt.Sprintf("%v\n", data)
	// 将数据以字节数组写入命令行中
	_, err := os.Stdout.Write([]byte(str))
	return err
}
// 创建命令行写入器实例
func NewConsoleWriter() *consoleWriter {
	return &consoleWriter{}
}

3. 文件写入日志器

这也是实现了日志器的一个实现类,文件日志器,一种常见的将日志写入文件记录的日志收集器。使用前需要先SetFile设置好日志文件名,最后将日志作为字节写入到文件中。

// 声明文件写入器
type fileWriter struct {
	file *os.File
}
// 设置文件写入器写入的文件名
func (f *fileWriter) SetFile(filename string) (err error) {
	// 如果文件已经打开, 关闭前一个文件
	if f.file != nil {
		f.file.Close()
	}
	// 创建一个文件并保存文件句柄
	f.file, err = os.Create(filename)
	// 如果创建的过程出现错误, 则返回错误
	return err
}
// 实现LogWriter的Write()方法
func (f *fileWriter) Write(data interface{}) error {
	// 日志文件可能没有创建成功
	if f.file == nil {
		// 日志文件没有准备好
		return errors.New("file not created")
	}
	// 将数据序列化为字符串
	str := fmt.Sprintf("%v\n", data)
	// 将数据以字节数组写入文件中
	_, err := f.file.Write([]byte(str))
	return err
}
// 创建文件写入器实例
func NewFileWriter() *fileWriter {
	return &fileWriter{}
}

4. Demo演示

通过New的方式创建日志器,进行注册到日志器集合中,下面演示了两种日志器如何使用!!!

// 创建日志器
func createLogger() *Logger {
	// 创建日志器
	l := NewLogger()
	// 创建命令行写入器
	cw := cmdwriter.NewConsoleWriter()
	// 注册命令行写入器到日志器中,cw实现了LogWriter接口,故可作为RegisterWriter函数的参数,类型为Logwriter
	l.RegisterWriter(cw)
	// 创建文件写入器
	fw := filerwriter.NewFileWriter()
	// 设置文件名
	if err := fw.SetFile("log.log"); err != nil {
		fmt.Println(err)
	}
	// 注册文件写入器到日志器中,fw实现了LogWriter接口
	l.RegisterWriter(fw)
	return l
}
func main() {
	// 准备日志器
	l := createLogger()
	// 写一个日志
	l.Log("hello")
}

5. 总结和提高

一个好的日志器功能是可扩展的,上述例子仅只是可以扩展不同种类的日志收集器。

在官方的logger中是可以进行选择写入级别的,可以定义一个枚举,在对应的枚举写入级别下,进行对应的权限写入,可以改造write方法,而不只是简单的写入就完事了。

到此这篇关于GoLang实现日志收集器流程讲解的文章就介绍到这了,更多相关Go日志收集内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Golang中异常处理机制详解

    Golang中异常处理机制详解

    这篇文章主要给大家介绍了关于Golang中异常处理机制的相关资料,其实Go语言的异常捕获要比Python中简单的多,它没有Python中那么多复杂的异常类型及继承体系,需要的朋友可以参考下
    2021-06-06
  • Golang学习笔记(一):简介

    Golang学习笔记(一):简介

    这篇文章主要介绍了Golang学习笔记(一):简介,本文讲解了Go语言最主要的特性、安装、环境变量设置、整体目录结构、Helloworld、go命令、调试、编辑器设置等内容,需要的朋友可以参考下
    2015-05-05
  • 浅析Golang中字符串拼接问题

    浅析Golang中字符串拼接问题

    Go的字符串是一个不可改变的数据结构,这和其他语言如JAVA,C++等的设定很类似.总体来说,有如下五种拼接方式,下面我们将论述各种方式的性能问题,以及如何选择
    2023-04-04
  • GO语言函数(func)的声明与使用详解

    GO语言函数(func)的声明与使用详解

    这篇文章主要介绍了GO函数(func)的声明与使用,包括了GO语言函数声明与使用,GO语言递归函数,GO语言内置函数,GO语言函数defer应用,GO语言函数可变长度参数需要的朋友可以参考下
    2022-12-12
  • Go语言带缓冲的通道实现

    Go语言带缓冲的通道实现

    这篇文章主要介绍了Go语言带缓冲的通道实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • Golang中的Unicode与字符串示例详解

    Golang中的Unicode与字符串示例详解

    这篇文章主要给大家介绍了关于Golang中Unicode与字符串的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Golang具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2020-05-05
  • Go语言正则表达式用法实例小结【查找、匹配、替换等】

    Go语言正则表达式用法实例小结【查找、匹配、替换等】

    这篇文章主要介绍了Go语言正则表达式用法,结合实例形式分析了Go语言基于正则实现查找、匹配、替换等基本操作的实现技巧,需要的朋友可以参考下
    2017-01-01
  • go语言中的udp协议及TCP通讯实现示例

    go语言中的udp协议及TCP通讯实现示例

    这篇文章主要为大家介绍了go语言中的udp协议及TCP通讯的实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2022-04-04
  • 使用Go语言实现找出两个大文件中相同的记录

    使用Go语言实现找出两个大文件中相同的记录

    这篇文章主要为大家详细介绍了使用Go语言实现找出两个大文件中相同的记录的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-10-10
  • golang中的时间格式化

    golang中的时间格式化

    这篇文章主要介绍了golang中的时间格式化问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02

最新评论