记录是任何应用程序的关键组成部分,使开发人员可以轻松地识别和解决运行时出现的问题。但是,随着应用程序变得越来越复杂,以高效和有效的方式管理和分析日志可能具有挑战性。这是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。
如果您有任何疑问或反馈,请随时发表评论或直接与我联系。我总是很高兴收到读者的来信,并尽我所能。
再次感谢您的阅读和愉快的记录!