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

目录
  • Go自己动手实现日志收集
    • 1. 日志器的接口
    • 2. 命令写入日志器
    • 3. 文件写入日志器
    • 4. Demo演示
    • 5. 总结和提高

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日志收集内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • GoLang日志监控系统实现

    目录 日志监控系统 项目简答介绍 系统架构 读取模块具体实现 日志解析模块 日志监控系统 Nginx(日志文件) -> log_process (实时读取解析写入) -> influxdb(存储) ->grafana(前端日志展示器) influxdb 属于GO语言编写的开源的时序型数据,着力于高性能 查询与存储时序型数据,influxdb 广泛的应用于存储系统的监控数据,IOT行业的实时数据. 目前市面上流行 TSDB(时序型处理数据库):influxDB, TimescaleDB,

  • Spring Boot 搭建 ELK正确看日志的配置流程

    为什么要用ELK ELK实际上是三个工具,Elastricsearch + Logstash + Kibana,通过ELK,用来收集日志还有进行日志分析,最后通过可视化UI进行展示.一开始业务量比较小的时候,通过简单的SLF4J+Logger在服务器打印日志,通过grep进行简单查询,但是随着业务量增加,数据量也会不断增加,所以使用ELK可以进行大数量的日志收集和分析 简单画了一下架构图 在环境配置中,主要介绍Mac和Linux配置,Windows系统大致相同,当然,前提是大家都安装了JDK 1

  • Golang单元测试与断言编写流程详解

    目录 编写单元测试 批量测试(test tables) 执行测试 性能测试 配置计算时间 断言(assertion) Go 在testing包中内置测试命令go test,提供了最小化但完整的测试体验.标准工具链还包括基准测试和基于代码覆盖的语句,类似于NCover(.NET)或Istanbul(Node.js).本文详细讲解go编写单元测试的过程,包括性能测试及测试工具的使用,另外还介绍第三方断言库的使用. 编写单元测试 go中单元测试与语言中其他特性一样具有独特见解,如格式化.命名规范.语法

  • spring AOP自定义注解方式实现日志管理的实例讲解

    今天继续实现AOP,到这里我个人认为是最灵活,可扩展的方式了,就拿日志管理来说,用Spring AOP 自定义注解形式实现日志管理.废话不多说,直接开始!!! 关于配置我还是的再说一遍. 在applicationContext-mvc.xml中要添加的 <mvc:annotation-driven /> <!-- 激活组件扫描功能,在包com.gcx及其子包下面自动扫描通过注解配置的组件 --> <context:component-scan base-package=&qu

  • 浅谈JAVA8给我带了什么——流的概念和收集器

    到现在为止,笔者不敢给流下定义,从概念来讲他应该也是一种数据元素才是.可是在我们前面的代码例子中我们可以看到他更多的好像在表示他是一组处理数据的行为组合.这让笔者很难去理解他的定义.所以笔者不表态.各位同志自行理解吧. 在没有流以前,处理集合里面的数据一般都会用到显示的迭代器.用一下前面学生的例子吧.目标是获得学分大于5的前俩位同学. package com.aomi; import java.util.ArrayList; import java.util.Iterator; import j

  • SpringBoot继承LogStash实现日志收集的方法示例

    一.环境准备 安装Elasticsearch.kibana.logstash,教程链接 安装教程 二.配置SpringBoot 依赖 在springBoot 项目下pom文件增加logStash 依赖包 <!--logStash--> <dependency> <groupId>net.logstash.logback</groupId> <artifactId>logstash-logback-encoder</artifactId>

  • SpringBoot应用整合ELK实现日志收集的示例代码

    ELK即Elasticsearch.Logstash.Kibana,组合起来可以搭建线上日志系统,本文主要讲解使用ELK来收集SpringBoot应用产生的日志. ELK中各个服务的作用 Elasticsearch:用于存储收集到的日志信息: Logstash:用于收集日志,SpringBoot应用整合了Logstash以后会把日志发送给Logstash,Logstash再把日志转发给Elasticsearch: Kibana:通过Web端的可视化界面来查看日志. 使用Docker Compos

  • Golang单元测试与覆盖率的实例讲解

    1 概述 C/C++和Java(以及大多数的主流编程语言)都有自己成熟的单元测试框架,前者如Check,后者如JUnit,但这些编程框架本质上仍是第三方产品,为了执行单元测试,我们不得不从头开始搭建测试工程,并且需要依赖于第三方工具才能生成单元测试的覆盖率. 相比之下,Go语言官方则提供了语言级的单元测试支持,即testing包,而且仅通过go工具本身就可以方便地生成覆盖率数据,也就是说,单元测试是Go语言的自带属性,除了好好设计自己的单元测试用例外,开发者不需要操心工程搭建的任何细节.没错,G

  • Fluentd搭建日志收集服务

    目录 引言 1. 搭建环境准备工作 1.1 安装ruby 1.2 获取fluentd源码 1.3 修改gem源 1.4 安装Bundle 1.5 构建fluentd 1.6 运行fluentd 2. 安装过程遇到的问题 2.1 安装bundler没有zlib包 2.2 没有openssl 3. 完成需求及修改配置 需求1 日志存放路径应用+日期划分 需求2 存放日志文件按文件大小进行切分 需求3 按照日志等级划分日志 需求4 将目录通过nginx映射出去 需求5 生成一个定大小的日志文件,并能够

  • C++ Boost log日志库超详细讲解

    目录 一.说明 二.库Boost.Log 一.说明 应用程序库是指通常专门用于独立应用程序开发而不用于库开发的库. Boost.Log 是一个日志库. Boost.ProgramOptions 是一个用于定义和解析命令行选项的库. Boost.Serialization 允许您序列化对象,例如,将它们保存到文件或从文件加载它们. Boost.Uuid 支持使用 UUID. 具体内容 62. Boost.Log 63. Boost.ProgramOptions 64. Boost.Serializ

  • log4j2日志异步打印(实例讲解)

    log4j2支持日志的异步打印,日志异步输出的好处在于,使用单独的进程来执行日志打印的功能,可以提高日志执行效率,减少日志功能对正常业务的影响. 异步日志在程序的classpath需要加载disruptor-3.0.0.jar或者更高的版本. Asynchronous Loggers是一个新增特性在Log4j 2 ,可以实现完全异步也可以和同步混合使用,还可以只异步化Appender,以提升系统性能,官方数据显示混合没有完全异步化效果好. 1,完全异步模式: 这种异步日志方式,不需要修改原来的配

随机推荐

其他