GoLang日志编程系统

本文介绍了使用Go语言构建的日志监控系统,该系统由Nginx日志文件经log_process实时读取解析后存储到InfluxDB,再通过Grafana展示。系统设计包括读取和解析模块,采用并发模型提高效率,特别是利用Go的goroutine和channel进行数据交互。日志解析流程中,通过正则提取关键数据并写入InfluxDB。
摘要由CSDN通过智能技术生成

日志监控系统

Nginx(日志文件) -> log_process (实时读取解析写入) -> influxdb(存储) ->grafana(前端日志展示器)
influxdb 属于GO语言编写的开源的时序型数据,着力于高性能 查询与存储时序型数据,influxdb 广泛的应用于存储系统的监控数据,IOT行业的实时数据。

  • 目前市面上流行 TSDB(时序型处理数据库):influxDB, TimescaleDB, QuestDB
  • influxDB 类似于NOSQL体验,自动适合标记集模型的技术的数据集;
  • TimescaleDB 与 postgreSQL 兼容, 更加适合物联网数据,与PostgreSQL更好的兼容
  • QuestDB: 支持InfluxDB内联协议和PostgreSQL, 但是生态问题比较大
项目简答介绍

本日志系统 DEMO,但是可以直接使用到生产环境上面,使用LOG_Process 读取Nginx ./Access.log, 使用influxDB 进行存取

log_process -path ./access.log influxdsn http://127.0.0.1:8086@imooc@imoocpass@immoc@s
常见并发模型
  1. 解决C10k 的问题 采用异步非阻塞的模型(Nginx, libevent, NodeJS)-- 问题 复杂度高 大量回调函数
  2. 协程(Go,Erlang, lua): 协线性函数一样写代码;理解根加轻量级别的线程
3. 程序并行执行 go foo() // 执行函数
4. mgs:= <- c 多个gorountine 需要进行通信
5. select 从多个channel 中读取数据 ,多个 channel 随机选择一个进行消费 
6. 并发: 一个任务通过调度器让任务看起来运行 属于单核CPU(逻辑运行)对于IO密集型比较友好
7. 并行:任务真正的运行

在go 语言中 并发执行 ,使用三个不同 gorountine, 一个负责装填,一个负责运输,一个负责处理 ,让程序并发的运行起来,让任务更加的职责单一化 这种思想 也可以将 日志解析读取,写入模块进行单独小模块,每个模块让使用gorountine ,通过channel 数据交互,至于这么多gorountine 是在一个CPU调度执行还是分配到多个CPU上进行执行 ,取决于系统.

go 语言有自己的调度器, go fun() 属于一个独立的工作单元,go的调度器,根据每个可用的物理处理器分配一个逻辑处理器,通过这个逻辑处理器对 独立单元进行处理,
通过设置: runtime.GOMAXPROCS(1)//给调度器分配多小个具体的逻辑处理器
一台服务器的 物理处理器越多 ,go 获取到逻辑处理器也越多,导致器允许速度越快。 参考:https://blog.csdn.net/ice_fire_x/article/details/105141409

系统架构

日志解析的基本流程化的伪函数,如下的函数有两个缺陷,解析介入和解析后输出只能写死,所以需要进行扩展,接口方式进行扩展

package main

import (
	"fmt"
	"strings"
	"time"
)

/**
* 日志解析系统分为: 解析,读取,写入
 */

type LogProcess struct {
   
	path        string      // 读取文件路径
	influxDBDsn string      // influx data source
	rc          chan string // read module to process
	wc          chan string // process to influx

}

// 返回函数使用 指针, 结构体很大 不需要进行拷贝 性能优化
func (l *LogProcess) ReadFromFile() {
   
	// 文件读取模块
	line := "message"
	l.rc <- line
}

func (l *LogProcess) Process() {
   
	// 文件解析模块
	data := <-l.rc
	l.wc <- strings.ToUpper(data)
}

func (l *LogProcess) writeToInfluxDB() {
   
	fmt.Println(<-l.wc)
}
func main() {
   
	// lp 引用类型
	lp := &LogProcess{
   
		path:        "./tmp/access.log",
		influxDBDsn: "username&password...",
		rc:          make(chan string),
		wc:          make(chan string),
	}
	// tree goroutine run
	go lp.ReadFromFile()
	go lp.Process()
	// 需要定义 chan 将 Process 数据 传递给 influxDB
	go lp.writeToInfluxDB()
	time.Sleep(2 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值