当前位置: 首页 > 网络应用技术

Golang:将日志以JSON格式输出到Kafka

时间:2023-03-07 18:19:19 网络应用技术

  在上一篇文章中,我实现了一个支持多个级别的日志库,例如调试,信息,错误,并将日志写入磁盘文件中。该代码相对简单,适合练习。有兴趣的人可以转到:https://github.com/bosima/ylog/ReleaSes/tag/v1.0.1

  在工程实践中,我们通常需要收集日志,将日志集在一起,然后将其用于各种处理分析,例如生产环境中的错误分析,异常警报等等。在日志消息系统的领域,Kafka拥有长期存在的声誉,本文将发送给KAFKA,以实现日志收集。与此同时,考虑到日志分析期间对结构数据的需求,本文还将在JSON中提供输出JSON格式日志格式logMethods。

  该日志库的此升级版本必须保持向前,也就是说,它也可以使用普通的文本格式,并将日志写入磁盘文件。这两个特征和两个新功能与同一类型相似,因此我在这里向他们提供抽象,形成了两个接口:格式化接口,编写日志接口。

  SO称为格式是日志的格式处理。该日志库当前支持两种格式:普通文本和JSON。

  为了提供不同格式的统一抽象,logentry在ylog中定义为代表日志:

  格式接口的能力是将日志从logentry格式转换为其他数据格式。YLOG的定义是:

  第一个参数是logitry实例,即格式格式的日志。第二个参数是日志格式化后要编写的容器。

  这才是真实的:

  可以看出,其主要功能是按一定顺序传播logentry中的每个字段,并将中间空间分开。

  许多数据处理方法是指Golang标准日志库中的数据格式代码。如果您有兴趣,可以详细介绍Github进行详细检查。

  这是对字符串的日期格式的特殊优化。在标准日志库中,为了形成指定长度的字符串,例如年度,月,日,时间,时间,秒,秒,秒,微秒等。功能:功能:

  它的逻辑可能是将数字中的每个数字转换为共存为字节的字符。请注意,当这里初始化字节阵列时,它是20位,这是INT64的数字数字最多。

  实际上,时间字符串的每个部分都是固定的。例如,这一年是4年,每月为2位数字,根本不需要20位,因此可以节省这个空间;并且这里使用了周期,并在这里使用了周期。这可能对CPU的分支有这样的影响,因此我在此处写了一种特殊的格式化方法。以2位数字为例:

  这才是真实的:

  代码也很简单。标准库的JSON序列化方法将Logentry实例转换为JSON格式的数据。

  对于JSON格式,请遵循-up考虑支持用户定义的JSON字段,并暂时进行暂时处理。

  编写日志是为了将日志输出到其他目标,例如向磁盘文件,输出到kafka等的输出。

  正面的格式接口将格式化的数据封装到[]字节中。写作日志接口是将格式化处理[]字节的输出写入某个输出目标。引用Golang的各种作者的定义,YLOG的定义是:

  这里有4种方法:

  这是一种名为FileWriter的类型,需要实现LoggerWriter接口。

  首先查看类型的定义:

  包含四个字段:

  查看其实现接口:

  确保确保创建当前写的文件对象的主要逻辑。如果小时数发生变化,请首先关闭上一个关闭,然后创建一个新文件。

  写入数据将数据写入文件对象(在此处添加的文件对象),也就是说,对于文件日志,每个日志最终都会有一个行更改,更方便地读取。

  同步调用文件对象的同步方法以将日志从操作系统滑动到磁盘。

  关闭关闭当前文件对象。

  这是一种称为kafkawriter的类型,它也需要实现LoggerWriter接口。

  首先查看其结构的定义:

  这里有四个字段:

  主题在编写Kafka时需要一个主题。在这里,当前记录器中的所有日志都使用相同的主题。

  地址KAFKA的访问地址。

  作者在编写KAFKA的数据时使用了作者。这是一个集成的:github.com/sementio/kafka-go,支持自动审查和重型公司。

  批处理Kafka的批量尺寸,批处理写作可以提高日志的写作效率。

  查看其实现接口:

  这是发送到Kafka异步的方法。writemessages方法不会被阻止,因为YLOG已重复使用传输的buf,因此复制在这里是一个问题。一个问题将存在异步的问题是,它不会返回错误并可能会丢失数据,但是对于日志等数据,不是那么严格的要求,也可以接受。

  如果使用同步发送,因为批处理发送更有效,您可以在这里节省几次,但是当日志相对稀疏时,可能很难在短时间内保存足够的时间。超时机制,这是一个有点麻烦,但我也写了一个版本。如果您有兴趣,可以去看:https://github.com/bosima/ylog/blob/examples/kafka-writer.go.go.goo.goo

  使用格式接口和编写日志接口,下一步是组装它们以实现相应的处理能力。

  首先是创建它们,因为我不需要在这里进行动态配置,因此是时候创建Logger实例了。这相对简单。

  您可以看到默认格式是文本形式的,并且默认编写者是文件作者。此函数传输的选项实际上是在下面的opt(logger)中执行它们的函数,因此您可以与其他formatters或Writers:

  这里ylog.writer和ylog.formatter是满足选项类型的函数。打电话给他们可以设置不同的格式和作家。

  如何使用它们?

  当logentry进入消息处理会话时,首先调用格式格式的格式方法以格式化logentry;然后调用作者的确保方法,以确保作者准备就绪,最后调用作者的书面方法将数据输出输出到相应的目标。

  为什么不将确保方法写入写入呢?这是因为在编写文本日志时,您需要根据logitry中的日志时间创建日志文件,以便您需要将两个参数传递给作者,这有点有点尴尬,所以他们在这里分开。

  Kafka的吞吐量很高,因此,如果将其放置在YLOG本身中,如何增加其吞吐量?

  首先要考虑的是频道。您可以使用缓冲通道模拟队列。生产者不断将数据发送到频道。如果作者始终可以在将缓冲区与某个作者的同步输出填写之前删除数据,则没有直接的磁盘IO和网络IO。日志处理的吞吐量将得到极大的改善。

  定义通道,容量默认值的数量是当前机器逻辑处理器的数量:

  代码发送数据:

  接收数据的代码:

  实际效果是什么?看基准:

  该结果可能会更高,因为高性能日志库(例如动物学和ZAP)。当然,可以做的事情比他们简单得多。

  如果您知道java,则应该听说过log4j,并在log4j2中介绍了一个称为颠覆器的组件,该组件允许日志处理快速并受到许多Java开发人员的追捧。颠覆者之所以如此强大的原因,是因为它使用了各种高级诸如无锁并发,戒指队列,缓存填充等技术。

  相比之下,尽管Golang的通道也使用环缓冲区,但仍使用锁。作为队列,性能不是最佳的。

  Golang中有类似的东西吗?最近,Zenq可能是一个不错的选择,但似乎不太稳定,然后再过一会儿再试一次。如果您有兴趣,您可以去看:https://github.com/α/Zenq。

  好吧,以上是本文的主要内容。YLOG的介绍也已经结束,将来将继续在Github上更新,以添加更多有用的功能并不断优化处理性能。欢迎使用:https://github.com/bosima/ylog。

  要收获更多的建筑知识,请注意微信的公共帐户Firefly Architecture.firfly Architecture.firfly content,请指出来源。

  原始:https://juejin.cn/post/709848463152727400