go语言日志收集系统--sarama,tail,config,logs库使用

sarama库-- 连接kafka把日志写入kafka

从"github.com/Shopify/sarama"下载,windows系统不支持最新版本,所以需要用go mod方式下载1.19版本,不能用go get 命令(默认下载最新版本),示例代码如下:
import "github.com/Shopify/sarama"
func main() {
    // 初始化一个config
    config := sarama.NewConfig()
    // ack就是确保会不会丢失信息,落到磁盘。
    config.Producer.RequiredAcks = sarama.WaitForAll
    // 随机生产者的分区,集群机器使用
    config.Producer.Partitioner = sarama.NewRandomPartitioner
    config.Producer.Return.Successes = true
    // 创建一个生产者实例,参数写入生产者机器信息,端口为9092,传入配置
    client, err := sarama.NewSyncProducer([]string{"0.0.0.0:9092"}, config)
    if err != nil {
        fmt.Println("producer close, err:", err)
        return
    }
    defer client.Close()
    // 创建生产者发送的消息实例,topic和发送内容
    msg := &sarama.ProducerMessage{}
    msg.Topic = "ngix_log"
    msg.Value = sarama.StringEncoder("日志测试")
    // 发送消息到kafka,返回分区数标志
    pid, offset, err := client.SendMessage(msg)
    if err != nil {
        fmt.Println("send message failed", err)
        return
    
    }
    fmt.Printf("pid:%v offset:%v\n", pid, offset)
}

tailf库使用–读取日志文件内容

go get github.com/hpcloud/tail
示例代码:
import "github.com/hpcloud/tail"
func main() {
	   // 要读的文件
	   filename := "文件路径"
	   // 初始化个tails实例,里边全是意外处理的配置信息
	   tails, err := tail.TailFile(filename, tail.Config{
	       ReOpen: true,
	       Follow: true,
	       Location: &tail.SeekInfo{Offset:0, Whence: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 * timeMillisecond)
                continue
            }
            fmt.Println("msg:", msg)
       }

}

config库 – go get github.com/astaxie/beego/config

为了代码更灵活,把配置写到配置文件中,或者放到etcd中,以便监测配置变化。示例代码:
func main() {
    conf, err := config.NewConfig("ini即配置格式", "文件路径名字")
    if  err != nil {
    fmt.Println("new config failed, err:", err)
    return
    }
    /*ini格式配置信息
    [server]
    port = 8080
    */
    port, err := conf.Int("server::port")
    if err != nil {
     fmt.Println("read server:port failed, err:", err)
     return
    }
    fmt.Println("port:", port)
    /* ini格式配置文件
    [log]
    log_level = debug
    log_path = "路径"
    */
    // 配置文件中信息如果为整数类型就用conf.Int,字符串就用conf.String,依次类比。
    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)

}

logs库

go get github.com/astaxie/beego/logs
示例代码:
import "github.com/astaxie/beego/logs"
func main() {
// 创造一个map存储配置信息,即日志写到哪里,和日志级别
config := make(map[string]interface{})
config["filename"] = "日志写到哪里的路径"
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("测试日志信息")


}

以后文章添加热加载功能, 即更改配置文件项目不用重启。

你可能感兴趣的:(go,python语言web篇)