通过Docker Setup将日志从麋鹿堆栈中的Logstash发送
#go #docker #elasticsearch #logstash

记录是任何应用程序的关键组成部分,使开发人员可以轻松地识别和解决运行时出现的问题。但是,随着应用程序变得越来越复杂,以高效和有效的方式管理和分析日志可能具有挑战性。这是LogStash的来源。LogStash是一种强大的工具,可以简化在集中位置收集,处理和存储日志的过程。在此博客文章中,我们将探索如何使用Go-Logstash软件包将日志从GO应用程序推向LogStash。

什么是logstash?

Logstash是一种开源工具,可让开发人员轻松摄入,处理和存储日志。它是弹性堆栈(也称为麋鹿)的一部分,其中包括Elasticsearch和Kibana。 LogStash提供了各种输入和输出插件,可允许其从广泛的来源收集日志,包括文件,TCP/UDP插座以及KAFKA和RABBITMQ等消息传递系统。一旦收集,LogStash可以在将日志转发到Elasticsearch以进行存储和分析之前处理和丰富日志。

介绍Go-Logstash

go-logstash是一个Golang软件包,它提供了一个简单的接口,用于将日志推向LogStash。它支持TCP和UDP协议,并且可以以JSON或字符串格式输出日志。 Go-LogStash易于使用,并提供用于配置LogStash连接的可自定义选项。

设置LogStash

在我们开始将日志推向Logstash之前,我们需要设置一个Logstash实例。这可以通过从弹性网站下载和安装logstash或使用Docker Compose进行设置来完成。

创建一个新目录,我们称其为go-logstash-demo,我们还创建所需的必要文件:

mkdir go-logstash-demo && cd go-logstash-demo
touch docker-compose.yml
touch docker-setup/logstash/Dockerfile
touch docker-setup/logstash/logstash.conf
touch docker-setup/go-logger/Dockerfile
touch main.go

这是docker-compose.yml文件,它可以创建麋鹿堆栈,弹性搜索,logstash和kibana各自将其与GO应用程序的容器一起。

# docker-compose.yml

version: "3.9"

services:
  elasticsearch:
    image: elasticsearch:7.1.0
    volumes:
      - ./esdata:/usr/share/elasticsearch/data
    ports:
      - "9200:9200"
      - "9300:9300"
    environment:
      - "discovery.type=single-node"
    networks:
      - elk

  logstash:
    build:
      context: .
      dockerfile: docker-setup/logstash/Dockerfile
    ports:
      - 9600:9600
      - 5228:5228
    environment:
      LOGSTASH_PORT: 5228
      LOGSTASH_INDEX: "test-index"
      ELASTIC_HOST: "elasticsearch:9200"
      ELASTIC_USERNAME: "elastic"
      ELASTIC_PASSWORD: "elastic"
    networks:
      - elk
    depends_on:
      - elasticsearch
    links:
      - elasticsearch

  kibana:
    image: kibana:7.1.0
    hostname: kibana
    ports:
      - "5601:5601"
    networks:
      - elk
    depends_on:
      - elasticsearch
    links:
      - elasticsearch
    environment:
      ELASTIC_HOST: "http://elasticsearch:9200"
      ELASTIC_USERNAME: "elastic"
      ELASTIC_PASSWORD: "elastic"

  go-app:
    container_name: go-app
    build:
      context: .
      dockerfile: docker-setup/go-logger/Dockerfile
    networks:
      - elk

networks:
  elk:
    driver: bridge

volumes:
  esdata:
    driver: local

这是logstash容器的自定义Dockerfile,因为我们想向其提供自定义logstash.conf文件:

# docker-setup/logstash/Dockerfile

FROM docker.elastic.co/logstash/logstash-oss:7.1.0

COPY ./docker-setup/logstash/logstash.conf /etc/logstash/conf.d/

CMD logstash -f /etc/logstash/conf.d/logstash.conf

这是基本logstash.conf文件的示例,该文件创建了LogStash管道以从TCP或UDP套接字收集日志并将其输出到Elasticsearch:

# docker-setup/logstash/logstash.conf

input {
  tcp {
    host => "0.0.0.0"
    port => "${LOGSTASH_PORT}"
    codec => json_lines
  }
  udp {
    host => "0.0.0.0"
    port => "${LOGSTASH_PORT}"
    codec => json_lines
  }
}

output {
  stdout { codec => json_lines }
  elasticsearch {
      hosts => [ "${ELASTIC_HOST}" ]
      user => "${ELASTIC_USERNAME}"
      password => "${ELASTIC_PASSWORD}"
      codec => json_lines
      index => "${LOGSTASH_INDEX}"
  }
}

logstash.conf配置文件也能够支持环境变量,我们通过docker-compose.yml文件提供。该管道会在TCP端口5228上听日志,并期望它们以JSON格式进行,并将日志输出到JSON中的Elasticsearch。

我们还需要为GO应用程序创建一个Dockerfile,因为它将使用内部Docker网络与LogStash进行通信以推动日志。

# docker-setup/go-logger/Dockerfile

FROM golang:1.19-alpine

WORKDIR /go-logstash-json

COPY . .

RUN go build -o out/logger *.go

CMD [ "./out/logger" ]

将日志从GO应用推到LogStash

现在,我们已经准备好麋鹿在本地设置了,让我们看一下如何使用Go-logstash从GO应用程序推动日志。

步骤1:创建GO应用程序

go-logstash-demo的根目录中,运行:

go mod init example.com/go-logstash-demo

步骤2:安装go-logstash

第一步是使用以下命令安装go-logstash:

go get github.com/KaranJagtiani/go-logstash

步骤3:测试库

接下来,我们需要在GO应用程序中导入Go-LogStash软件包并测试库:

# main.go

package main

import (
    logstash_logger "github.com/KaranJagtiani/go-logstash"
)

func main() {
    logger := logstash_logger.Init("logstash", 5228, "tcp", 5)

    payload := map[string]interface{}{
        "message": "TEST_MSG",
        "error":   false,
    }

    logger.Log(payload) // Generic log
    logger.Info(payload) // Adds "severity": "INFO"
    logger.Debug(payload) // Adds "severity": "DEBUG"
    logger.Warn(payload) // Adds "severity": "WARN"
    logger.Error(payload) // Adds "severity": "ERROR"
}
logger := logstash_logger.Init("logstash", 5228, "tcp", 5)

此行创建了一个新的记录器,该记录器将通过TCP端口5228在docker上运行的logstash主机上运行的logstash实例,连接超时为5秒。

结论

总而言之,将日志从GO应用程序发送到麋鹿堆栈中的LogStash是一种集中和管理应用程序日志的有力方法。在go-logstash库的帮助下,很容易使用TCP或UDP将日志推向LogStash。然后,LogStash可以处理和丰富日志,从而更容易分析和解决您的应用程序中的问题。

感谢您阅读本初学者指南,以将日志从GO应用程序发送到使用Docker设置的麋鹿堆栈中的Logstash。我希望本指南为您提供了该过程的有用概述,并帮助您开始集成GO和LogStash。

如果您有任何疑问或反馈,请随时发表评论或直接与我联系。我总是很高兴收到读者的来信,并尽我所能。

再次感谢您的阅读和愉快的记录!