返回顶部
首页 > 资讯 > 后端开发 > GO >Golang监听日志文件并发送到kafka中
  • 554
分享到

Golang监听日志文件并发送到kafka中

2024-04-02 19:04:59 554人浏览 薄情痞子
摘要

目录前言涉及的golang库和可视化工具:工作的流程环境准备代码分层关键的代码main.Gokafka.gotail.go前言 日志收集项目的准备中,本文主要讲的是利用golang的

前言

日志收集项目的准备中,本文主要讲的是利用golang的tail库,监听日志文件的变动,将日志信息发送到kafka中。

涉及的golang库和可视化工具:

go-ini,sarama,tail其中:

  • go-ini:用于读取配置文件,统一管理配置项,有利于后其的维护
  • sarama:是一个go操作kafka的客户端。目前我用于向kefka发送消息
  • tail:类似于linux的tail命令了,读取文件的后几行。如果文件有追加数据,会检测到。就是通过它来监听日志文件

可视化工具:

offsetexplorer:是kafka的可视化工具,这里用来查看消息是否投递成功

工作的流程

  • 加载配置,初始化saramakafka
  • 起一个的协程,利用tail不断去监听日志文件的变化。
  • 主协程中一直阻塞等待tail发送消息,两者通过一个管道通讯。一旦主协程接收到新日志,组装格式,然后发送到kafka中

main.png

环境准备

环境的话,确保ZooKeeperkafka正常运行。因为还没有使用sarama读取数据,使用offsetexplorer来查看任务是否真的投递成功了。

代码分层

serve来存放写tail服务类和sarama服务类,conf存放ini配置文件

main函数为程序入口

 

pro-dir.png

关键的代码

main.go

main函数做的有:构建配置结构体,映射配置文件。调用和初始化tail,srama服务。

package main

import (
	"fmt"
	"sarama/serve"

	"GitHub.com/go-ini/ini"
)

type KafkaConfig struct {
	Address     string `ini:"address"`
	ChannelSize int    `ini:"chan_size"`
}
type TailConfig struct {
	Path     string `ini:"path"`
	Filename string `ini:"fileName"`
	// 如果是结构体,则指明分区名
	Children `ini:"tailfile.children"`
}
type Config struct {
	KafkaConfig `ini:"kafka"`
	TailConfig  `ini:"tailfile"`
}
type Children struct {
	Name string `ini:"name"`
}

func main() {
	// 加载配置
	var cfg = new(Config)
	err := ini.MapTo(cfg, "./conf/go-conf.ini")
	if err != nil {
		fmt.Print(err)
	}
	// 初始化kafka
	ks := &serve.KafukaServe{}
	// 启动kafka消息监听。异步
	ks.InitKafka([]string{cfg.KafkaConfig.Address}, int64(cfg.KafkaConfig.ChannelSize))
	// 关闭主协程时,关闭channel
	defer ks.Destruct()

	// 初始化tail
	ts := &serve.TailServe{}
	ts.TailInit(cfg.TailConfig.Path + "/" + cfg.TailConfig.Filename)
	// 阻塞
	ts.Listener(ks.MsGChan)

}

kafka.go

有3个方法 :

  • InitKafka,组装配置项以及初始化接收消息的管道,
  • Listener,监听管道消息,收到消息后,将消息组装,发送到kafka
  • Destruct, 关闭管道
package serve

import (
	"fmt"

	"github.com/Shopify/sarama"
)

type KafukaServe struct {
	MsgChan chan string
	//err         error
}

func (ks *KafukaServe) InitKafka(addr []string, chanSize int64) {

	// 读取配置
	config := sarama.NewConfig()
	// 1. 初始化生产者配置
	config.Producer.RequiredAcks = sarama.WaitForAll
	// 选择分区
	config.Producer.Partitioner = sarama.NewRandomPartitioner
	// 成功交付的信息
	config.Producer.Return.Successes = true

	ks.MsgChan = make(chan string, chanSize)

	go ks.Listener(addr, chanSize, config)

}

func (ks *KafukaServe) Listener(addr []string, chanSize int64, config *sarama.Config) {
	//  连接kafka
	var kafkaClient, _ = sarama.NewSyncProducer(addr, config)
	defer kafkaClient.Close()
	for {
		select {
		case content := <-ks.MsgChan:
			//
			msg := &sarama.ProducerMessage{
				Topic: "WEBlog",
				Value: sarama.StringEncoder(content),
			}
			partition, offset, err := kafkaClient.SendMessage(msg)
			if err != nil {
				fmt.Println(err)
			}
			fmt.Println("分区,偏移量:")
			fmt.Println(partition, offset)
			fmt.Println("___")
		}

	}
}

func (ks *KafukaServe) Destruct() {
	close(ks.MsgChan)
}

tail.go

主要包括了两个方法:

  • TailInit初始化,组装tail配置。Listener
  • Listener,保存kafka服务类初始化之后的管道。监听日志文件,如果有新日志,就往管道里发送
package serve

import (
	"fmt"

	"github.com/hpcloud/tail"
)

type TailServe struct {
	tails *tail.Tail
}

func (ts *TailServe) TailInit(filenName string) {
	config := tail.Config{
		ReOpen:    true,
		Follow:    true,
		Location:  &tail.SeekInfo{Offset: 0, Whence: 2},
		MustExist: false,
		Poll:      true,
	}
	// 打开文件开始读取数据

	ts.tails, _ = tail.TailFile(filenName, config)

	// if err != nil {
	// 	fmt.Println("tails %s failed,err:%v\n", filenName, err)
	// 	return nil, err
	// }
	fmt.Println("启动," + filenName + "监听")
}

func (ts *TailServe) Listener(MsgChan chan string) {
	for {
		msg, ok := <-ts.tails.Lines
		if !ok {
			// todo
			fmt.Println("数据接收失败")
			return
		}
		fmt.Println(msg.Text)
		MsgChan <- msg.Text
	}
}

// 测试案例
func Demo() {
	filename := `E:\xx.log`
	config := tail.Config{
		ReOpen:    true,
		Follow:    true,
		Location:  &tail.SeekInfo{Offset: 0, Whence: 2},
		MustExist: false,
		Poll:      true,
	}
	// 打开文件开始读取数据
	tails, err := tail.TailFile(filename, config)
	if err != nil {
		fmt.Println("tails %s failed,err:%v\n", filename, err)
		return
	}
	var (
		msg *tail.Line
		ok  bool
	)
	fmt.Println("启动")
	for {
		msg, ok = <-tails.Lines
		if !ok {
			fmt.Println("tails file close reopen,filename:$s\n", tails.Filename)
		}
		fmt.Println("msg:", msg.Text)
	}
}

到此这篇关于Golang监听日志文件并发送到kafka中的文章就介绍到这了,更多相关Golang 监听日志文件 内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

您可能感兴趣的文档:

--结束END--

本文标题: Golang监听日志文件并发送到kafka中

本文链接: https://lsjlt.com/news/146023.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Golang监听日志文件并发送到kafka中
    目录前言涉及的golang库和可视化工具:工作的流程环境准备代码分层关键的代码main.gokafka.gotail.go前言 日志收集项目的准备中,本文主要讲的是利用golang的...
    99+
    2024-04-02
  • Golang怎么监听日志文件并发送到kafka中
    这篇文章主要讲解了“Golang怎么监听日志文件并发送到kafka中”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Golang怎么监听日志文件并发送到kafka中”吧!涉及的golang库和...
    99+
    2023-06-30
  • oracle怎么关闭监听日志文件
    要关闭Oracle监听器的日志文件,可以通过以下步骤: 登录到系统中运行监听器的主机。 打开监听器的配置文件,通常位于$OR...
    99+
    2024-04-19
    oracle
  • Java如何实现日志文件监听并读取相关数据
    这篇“Java如何实现日志文件监听并读取相关数据”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java如何实现日志文件监听并...
    99+
    2023-06-30
  • Oracle11g监听器日志 listener.log文件过大处理
    oracle 11g的监听日志和警告日志都是在/opt/oracle/app/diag/tnslsnr/机器名/listener目录 其中警告日志在alert目录下,监听日志在trace目录下。listen...
    99+
    2024-04-02
  • 如何在前端上监听到RabbitMQ发送消息并完成数据监控
    如何在前端上监听到RabbitMQ发送消息并完成数据监控,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。如何在前端实现对Rabb...
    99+
    2024-04-02
  • Java实现日志文件监听并读取相关数据的方法实践
    目录项目需求Apache Commons-IO核心知识代码实现总结项目需求 由于所在数据中台项目组需要实现监听文件夹或者日志文件并读取对应格式的脏数据的需求,以便在文件、文件夹发生变...
    99+
    2024-04-02
  • oracle 数据库lsnrctl监听的日志路径和trace文件
    lsnrctl  监听日志的路径:$ORACLE_BASE/diag/tnslsnr/<your_host>/<listener_name>/trace/<list...
    99+
    2024-04-02
  • 使用Java如何监控并输出日志文件
    使用Java如何监控并输出日志文件?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。代码1:日志产生类package com.bill99.seashell.domain.svr;...
    99+
    2023-05-31
    java ava
  • 学习SpringBoot使用slf4j日志并输出到文件中
    slf4j日志(3月11日) 再使用前,先了解一下介绍,否则你也不会用! 1、日志级别 SLF4J将日志分为trace、debug、info、warn、error五个级别,每个级别对应记录不同...
    99+
    2023-09-02
    spring boot 学习 java
  • Go语言中如何处理并发文件的文件系统文件日志和审计日志问题?
    Go语言中如何处理并发文件的文件系统文件日志和审计日志问题?在Go语言中,处理并发文件的文件系统文件日志和审计日志问题是一项常见的需求。Go语言提供了多种机制来处理并发文件操作,如锁机制、管道、协程等。本文将介绍如何在Go语言中处理文件系统...
    99+
    2023-10-22
    并发处理 文件系统 审计日志
  • Linux中如何将执行过的命令记录到日志并发送到服务器
    这篇文章主要介绍“Linux中如何将执行过的命令记录到日志并发送到服务器”,在日常操作中,相信很多人在Linux中如何将执行过的命令记录到日志并发送到服务器问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Lin...
    99+
    2023-06-12
  • 如何自动备份文件并发送到Gmail
    如何自动备份文件并发送到Gmail,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一,安装所需程序yum install -y mutt vixie-cron二,设置mutt发信...
    99+
    2023-06-13
  • Linux中如何实时监控日志文件
    这期内容当中小编将会给大家带来有关Linux中如何实时监控日志文件,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1. tail Command &ndash; Monitor Logs in Re...
    99+
    2023-06-16
  • linux怎么打印日志到文件中
    在Linux中,可以使用以下命令将日志打印到文件中:1. 使用`echo`命令将日志内容输出到标准输出,并使用重定向符`>`将输出重...
    99+
    2023-10-09
    linux
  • PHP并发编程中,如何优化文件和日志操作?
    在PHP并发编程中,文件和日志操作是非常常见的需求。由于并发访问的特性,文件和日志操作往往成为瓶颈,影响程序的性能和稳定性。因此,如何优化文件和日志操作,是PHP并发编程中必须掌握的技能。 本文将介绍一些优化文件和日志操作的方法,并结合实...
    99+
    2023-06-09
    并发 文件 日志
  • 怎么将日志文件映射到Redis中
    将日志文件映射到Redis中需要通过以下步骤实现: 安装Redis:首先需要在服务器上安装Redis数据库,可以通过官方网站下载...
    99+
    2024-04-09
    redis
  • python监控日志中的报错并进行邮件报警
    目录前言实现思路实现代码前言 在测试过程中,注意力往往都在功能上,如果功能正常,是基本不会查看日志的,反之会查看日志定位问题。但是表面上的功能正常不能确保日志没有报错,不能确保其他功...
    99+
    2024-04-02
  • Linux 更加优雅地运行 JAR 文件,并将日志文件输出到本地目录,并优雅的查看日志文件信息
    一、运行jar 方式一:直接运行jar包,最常用的启动jar包命令,特点:当前ssh窗口被锁定,CTRL + C或关闭窗口,将打断程序运行,程序退出 java -jar Spring.jar 方式二:&代表在后台运行 ,CTRL + C后程...
    99+
    2023-08-20
    linux jar java
  • Linux系统中如何使用logwatch监控日志文件
    这篇文章主要介绍Linux系统中如何使用logwatch监控日志文件,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Linux 操作系统和许多应用程序会创建特殊的文件来记录它们的运行事件,这些文件通常被称作“日志”。当...
    99+
    2023-06-16
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作