热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

日志收集系统

一、项目背景a.每个系统都有日志,当系统出现问题时,需要通过日志解决问题b.当系统机器比较少时,登陆到服务器上查看即可满足c.当系统机器规模巨大,登陆到机器上查看几乎不现实二、

一、项目背景

a.每个系统都有日志,当系统出现问题时,需要通过日志解决问题
b.当系统机器比较少时,登陆到服务器上查看即可满足 
c.当系统机器规模巨大,登陆到机器上查看几乎不现实

二、解决方案

a.把机器上的日志实时收集,统一的存储到中心系统
b.然后再对这些日志建立索引,通过搜索即可以找到对应日志 
c.通过提供界面友好的web界面,通过web即可以完成日志搜索

三、面临的问题

a.实时日志量非常大,每天几十亿条
b.日志准实时收集,延迟控制在分钟级别 
c.能够水平可扩展

四、业界方案ELK

五、elk方案问题

a.运维成本高,每增加一个日志收集,都需要手动修改配置
b.监控缺失,无法准确获取logstash的状态 
c.无法做定制化开发以及维护

六、日志收集系统设计

 

七、各组件介绍

a.Log Agent,日志收集客户端,用来收集服务器上的日志
b.Kafka,高吞吐量的分布式队列,linkin开发,apache顶级开源项目
c.ES,elasticsearch,开源的搜索引擎,提供基于http restful的web接口
d.Hadoop,分布式计算框架,能够对大量数据进行分布式处理的平台

7.1 kafka应用场景

  1.异步处理, 把非关键流程异步化,提高系统的响应时间和健壮性

 

  2.应用解耦,通过消息队列

 

 

  3.流量削峰

 

7.2 zookeeper应用场景

  1. 服务注册&服务发现

 

  2.配置中心

 

  3.分布式锁

Zookeeper是强一致的
多个客户端同时在Zookeeper上创建相同znode,只有一个创建成功

八、安装kafka

a.安装JDK,从oracle下载最新的SDK安装
b.安装zookeeper3.3.6,下载地址:http://apache.fayea.com/zookeeper/ 
    1)mv conf/zoo_sample.cfg conf/zoo.cfg
    2)编辑 conf/zoo.cfg,修改dataDir=D:\zookeeper-3.3.6\data\
    3)运行bin/zkServer.cmd
c. 安装kafka
    1)打开链接:http://kafka.apache.org/downloads.html下载kafka2.1.2
    2)打开config目录下的server.properties, 修改log.dirs为D:\kafka_logs,修改advertised.host.name=服务器ip
    3)启动kafka ./bin/windows/kafka-server-start.bat ./config/server.preperties

九、log agent设计

十、log agent流程

 

 十一、kafka示例代码

  go get github.com/Shopify/sarama 

package main

import (
    "fmt"
    "github.com/Shopify/sarama"
)


func main() {
    config := sarama.NewConfig()
    config.Producer.RequiredAcks = sarama.WaitForAll  //发送消息给kafka,等待kafka返回ack,确认收到消息。防止消息丢失。
    config.Producer.PartitiOner= sarama.NewRandomPartitioner //分区的策略是随机的
    config.Producer.Return.Successes = true
    msg := &sarama.ProducerMessage{}
    msg.Topic = "nginx_log"
    msg.Value = sarama.StringEncoder("this is a good test, my message is good")  //存入的日志
    client, err := sarama.NewSyncProducer([]string{"192.168.31.177:9092"}, config) //配置kafka的IP,生成一个客户端
    if err != nil {
        fmt.Println("producer close, err:", err)
        return
    }
    defer client.Close()
    pid, offset, err := client.SendMessage(msg)  //pid分区号,offset偏移
    if err != nil {
        fmt.Println("send message failed,", err)
        return
    }
    fmt.Printf("pid:%v offset:%v\n", pid, offset)
}
View Code

kafka_2.12-1.0.1\bin\windows\kafka-console-consumer.bat   //自带的消费者测试程序
kafka-console-consumer.bat --zookeeper localhost:2181  --topic nginx_log --from-beginning

十二、tailf组件使用

package main


import (
    "fmt"
    "github.com/hpcloud/tail"
    "time"
)

func main() {
    filename := "./my.log"  //要读取的文件的名字
    tails, err := tail.TailFile(filename, tail.Config{
        ReOpen:    true,
        Follow:    true,
        Location: &tail.SeekInfo{Offset: 0, Whence: 2},  //2从末尾开始读
        MustExist: false, //文件不存在也不会报错
        Poll:    true, //轮询
    })

    if err != nil {
        fmt.Println("tail file err:", err)
        return
    }
    var msg *tail.Line
    var ok bool
    for true {
        msg, ok = <-tails.Lines
        if !ok {
            fmt.Printf("tail file close reopen, filename:%s\n", tails.Filename)
            time.Sleep(100 * time.Millisecond)
            continue
        }
    fmt.Println("msg:", msg.Text)    
    }
}
View Code

十三、配置文件库使用

Import “github.com/astaxie/beego/config”

  1. 初始化配置库
iniconf, err := NewConfig("ini", "testini.conf")
if err != nil {
    t.Fatal(err)
}

  2. 读取配置

String(key string) string
Int(key string) (int, error)
Int64(key string) (int64, error)
Bool(key string) (bool, error)
Float(key string) (float64, error)

 

package main

import (
    "fmt"
    "github.com/astaxie/beego/config"
)


func main() {
    conf, err := config.NewConfig("ini", "./logcollect.conf")
    if err != nil {
        fmt.Println("new config failed, err:", err)
        return
    }
    port, err := conf.Int("server::port")
    if err != nil {
        fmt.Println("read server:port failed, err:", err)
        return
    }


    fmt.Println("Port:", port)
    log_level, err := conf.Int("log::log_level")
    if err != nil {
        fmt.Println("read log_level failed, ", err)
        return
    }

    fmt.Println("log_level:", log_level)
    log_path := conf.String("log::log_path")
    fmt.Println("log_path:", log_path)

}
View Code

十四、日志库的使用

Import “github.com/astaxie/beego/logs” 

  1. 配置log组件
config := make(map[string]interface{} 
config["filename"] = "./logs/logcollect.log" 
config["level"] = logs.LevelDebug 
configStr, err := json.Marshal(config) 
if err != nil {
    fmt.Println("marshal failed, err:", err)
    return
}

  2.初始化日志组件

logs.SetLogger(“file”, string(configStr))

package main

import (
    "encoding/json"
    "fmt"
    "github.com/astaxie/beego/logs"
)


func main() {
    config := make(map[string]interface{})
    config["filename"] = "./logs/logcollect.log"
    config["level"] = logs.LevelDebug
    configStr, err := json.Marshal(config)
    if err != nil {
        fmt.Println("marshal failed, err:", err)
        return
    }

    logs.SetLogger(logs.AdapterFile, string(configStr))
    logs.Debug("this is a test, my name is %s", "stu01")
    logs.Trace("this is a trace, my name is %s", "stu02")
    logs.Warn("this is a warn, my name is %s", "stu03")

}
View Code

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

astaxie/beego/logs”

 


推荐阅读
  • Redis:缓存与内存数据库详解
    本文介绍了数据库的基本分类,重点探讨了关系型与非关系型数据库的区别,并详细解析了Redis作为非关系型数据库的特点、工作模式、优点及持久化机制。 ... [详细]
  • 本文详细介绍了Java代码分层的基本概念和常见分层模式,特别是MVC模式。同时探讨了不同项目需求下的分层策略,帮助读者更好地理解和应用Java分层思想。 ... [详细]
  • 本文详细介绍了如何在PHP中使用Memcached进行数据缓存,包括服务器连接、数据操作、高级功能等。 ... [详细]
  • 本文探讨了使用Python实现监控信息收集的方法,涵盖从基础的日志记录到复杂的系统运维解决方案,旨在帮助开发者和运维人员提升工作效率。 ... [详细]
  • 对象存储与块存储、文件存储等对比
    看到一篇文档,讲对象存储,好奇,搜索文章,摘抄,学习记录!背景:传统存储在面对海量非结构化数据时,在存储、分享与容灾上面临很大的挑战,主要表现在以下几个方面:传统存储并非为非结 ... [详细]
  • 一家位于长沙的知名网络安全企业,现面向全国诚聘高级后端开发工程师,特别欢迎具有一线城市经验的技术精英回归故乡,共创辉煌。 ... [详细]
  • 精选10款Python框架助力并行与分布式机器学习
    随着神经网络模型的不断深化和复杂化,训练这些模型变得愈发具有挑战性,不仅需要处理大量的权重,还必须克服内存限制等问题。本文将介绍10款优秀的Python框架,帮助开发者高效地实现分布式和并行化的深度学习模型训练。 ... [详细]
  • 本文介绍了如何利用X_CORBA实现远程对象调用,并通过多个示例程序展示了其功能与应用,包括基础的Hello World示例、文件传输工具以及一个完整的聊天系统。 ... [详细]
  • 深入探讨:Actor模型如何解决并发与分布式计算难题
    在现代软件开发中,高并发和分布式系统的设计面临着诸多挑战。本文基于Akka最新文档,详细探讨了Actor模型如何有效地解决这些挑战,并提供了对并发和分布式计算的新视角。 ... [详细]
  • 深入解析:存储技术的演变与发展
    本文探讨了从单机文件系统到分布式文件系统的存储技术发展过程,详细解释了各种存储模型及其特点。 ... [详细]
  • Java EE 平台集成了多种服务、API 和协议,旨在支持基于 Web 的多层应用程序开发。本文将详细介绍 Java EE 中的 13 种关键技术规范,帮助开发者更好地理解和应用这些技术。 ... [详细]
  • 华为捐赠欧拉操作系统,承诺不推商用版
    华为近日宣布将欧拉开源操作系统捐赠给开放原子开源基金会,并承诺不会推出欧拉的商用发行版。此举旨在推动欧拉和鸿蒙操作系统的全场景融合与生态发展。 ... [详细]
  • 2020年9月15日,Oracle正式发布了最新的JDK 15版本。本次更新带来了许多新特性,包括隐藏类、EdDSA签名算法、模式匹配、记录类、封闭类和文本块等。 ... [详细]
  • 基于iSCSI的SQL Server 2012群集测试(一)SQL群集安装
    一、测试需求介绍与准备公司计划服务器迁移过程计划同时上线SQLServer2012,引入SQLServer2012群集提高高可用性,需要对SQLServ ... [详细]
  • RocketMQ 运维监控实践指南
    本文详细介绍了如何实现 RocketMQ 的运维监控,包括监控平台的搭建、常用运维命令及其具体用法。适合对 RocketMQ 监控感兴趣的读者参考。 ... [详细]
author-avatar
性感让晚安回忆流淌_507
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有