当今可用的丰富编程语言为程序员提供了用于构建应用程序的大量工具。无论是像 Java 这样的老牌巨头,还是像 Go 这样的新兴公语言,应用程序都需要在部署后进行监视。在本文中,你将学习如何将Golang日志发送到ELK Stack和Logz.io。

通常可以通过查看其日志来了解应用程序的运行状况。但是,日志数据具有随时间呈指数增长的趋势。当更多应用程序部署并分布在多台服务器上时,尤其如此。 Elastic Stack 具有存储大量数据并快速,轻松地进行搜索的功能,在这里很方便。

在本文中,你将学习如何导入 Go 应用程序编写的日志。 Go 编程语言(也称为 Golang 或 GoLang)是一种相对较新的但成熟的通用编程语言,在编程社区和主要的云提供商中得到了广泛的采用。

在之前的文章 “使用 Filebeat 进行日志结构化”,我已经介绍了如果直接使用 Filebeat 把日志进行结构化。在那篇文章中,我们使用了 python 应用作为一个例子。在今天的例子中,我将以一个 Golang 的例子来进行展示。

GoLang 日志概述

你可以使用几种不同的选项从 Go 程序把日志写到文件。 其中之一是 Logrus 库,它非常易于使用,并具有编写信息丰富的日志并能够轻松将其发送到 Elasticsearch 所需的所有功能。

首先,通过在终端中运行以下命令来获取 logrus 软件包。这个包由于在谷歌的网站上,直接使用如下的语句将不能正确下载:

go get github.com/sirupsen/logrus

我们可以参阅文章通过设置代理的办法来进行安装:

# 启用 Go Modules 功能
export GO111MODULE=on
# 配置 GOPROXY 环境变量
export GOPROXY=https://goproxy.io

在 terminal 中打入上面的命令后,再打入如下的命令:

go get github.com/sirupsen/logrus

我们的 Go 程序非常之简单:

main.go

package mainimport ("os"log "github.com/sirupsen/logrus"
)func main() {log.SetFormatter(&log.JSONFormatter{FieldMap: log.FieldMap{log.FieldKeyTime:  "@timestamp",log.FieldKeyMsg:   "message",},})log.SetLevel(log.TraceLevel)file, err := os.OpenFile("out.log", os.O_RDWR | os.O_CREATE | os.O_APPEND, 0666)if err == nil {log.SetOutput(file)}defer file.Close()fields := log.Fields{"userId": 12}log.WithFields(fields).Info("User logged in!")fields = log.Fields{"userId": 12}log.WithFields(fields).Info("Sent a message!")fields = log.Fields{"userId": 12}log.WithFields(fields).Info("Failed to get a message!")fields = log.Fields{"userId": 12}log.WithFields(fields).Info("User logged out!")
}

上面是一个很简单的 Go 语言应用程序。此代码片段将打开一个用于写入的文件,并将其设置为 logrus记 录器的目标。 现在,当你调用log.Info(...)时,你记录的信息将被写入该文件。 但是,你也可以(可选)使用其他相关信息(例如用户标识符)来丰富日志数据,这些信息可以通过提供其他上下文来帮助解决问题。它将生成几个日志,并保存到一个叫做 out.log 的文件中。

我们可以使用如下的命令来进行运行:

go run main.go

我们可以查看当前目录下的文件:

$ pwd
/Users/liuxg/go/es_logs
$ go run main.go
liuxg:es_logs liuxg$ ls
main.go out.log

在上面,我们可以看到一个叫做 out.log 的文件。它的内容如下:

$ cat out.log
{"@timestamp":"2020-10-16T14:37:44+08:00","level":"info","message":"User logged in!","userId":12}
{"@timestamp":"2020-10-16T14:37:44+08:00","level":"info","message":"Sent a message!","userId":12}
{"@timestamp":"2020-10-16T14:37:44+08:00","level":"info","message":"Failed to get a message!","userId":12}
{"@timestamp":"2020-10-16T14:37:44+08:00","level":"info","message":"User logged out!","userId":12}

从上面,我们可以看出来,这是一个非常结构化的日志。它具有 JSON 结构,因为在程序开始时设置了 JSON 格式化程序。 当该选项可用时,以 JSON 格式格式化日志可以更轻松地将它们发送到 Elasticsearch,而无需其他配置,因为 JSON 属性和值直接映射到Elasticsearch 中的字段。 相反,你必须告诉 Elasticsearch 如何从没有明显结构的文本日志中解析数据。

如此轻松地将日志写入 JSON 格式的文件中(并根据需要包含其他字段的可能性),使你处于将日志发送到 Elasticsearch 的良好位置。

Logrus

与几乎所有其他日志记录库一样,Logrus 允许您使用许多不同的严重性级别(包括信息,警告,错误等)来编写日志。 这是通过调用适当的函数(例如Info())来完成的。 也可以配置最低级别。

例如,当你调用 log.SetLevel(log.TraceLevel) 时,将只写入级别为 trace 或更高级别的日志。由于 Trace 是最低级别,因此此调用指示你要写入所有日志,而不管它们的级别如何。 例如,可以将其更改为 log.InfoLevel 以忽略具有跟踪或调试级别的日志。

将 GoLang 日志运送到 ELK

将日志写入文件有很多好处。 该过程既快速又健壮,并且应用程序无需了解最终将最终用于日志的存储类型的任何信息。 Elasticsearch 提供了 Beats,可以帮助你从各种来源(包括文件)收集数据并将其可靠而有效地运送到 Elasticsearch。 一旦日志数据进 Elasticsearch,你就可以使用 Kibana 对其进行分析。

发送到 Elasticsearch 的日志数据需要解析,以便 Elasticsearch 可以正确构造它。 Elasticsearch 能够轻松处理 JSON 数据。 你可以为其他格式设置更复杂的解析。

我们在 filebeat 的安装目录下创建如下的文件:

filebeat_json.yml

filebeat.inputs:
- type: logenabled: truepaths:- /Users/liuxg/go/es_logs/out.logjson:keys_under_root: trueoverwrite_keys: truemessage_key: 'message'processors:- decode_json_fields:fields: ['message']target: jsonsetup.template.enabled: false
setup.ilm.enabled: falseoutput.elasticsearch:hosts: ["localhost:9200"]index: "logs_json"bulk_max_size: 1000

请注意:你必须用你自己的路径替换上面的 paths。

我们使用如下的命令来把数据导入:

$ ls filebeat_json.yml
filebeat_json.yml$ ./filebeat -e -c ./filebeat_json.yml

在运行完上面的命令后,我们使用如下的命令来检查已经生产的索引 logs_json:

GET _cat/indices

上面的命令显示:

green  open .apm-custom-link               CO_6a4_ISAGSswWYjZrNjQ 1 0  0    0    208b    208b
yellow open logs_json                      Is-RVM33T920Ffd35I0ZUw 1 1  4    0   5.6kb   5.6kb
green  open .kibana_task_manager_1         PACoKKQ9SC6n7ui8YZe0DQ 1 0  6 1845 239.9kb 239.9kb
green  open .kibana-event-log-7.9.1-000001 hL1iRZ8cRX6qe4of7TPYMQ 1 0  1    0   5.5kb   5.5kb
green  open .apm-agent-configuration       w5BmEwunQ96q6KdABWW3pA 1 0  0    0    208b    208b
green  open .kibana_1                      Rnt_C5o5RquYYgkvBZ3xJQ 1 0 13    2  10.4mb  10.4mb

我们可以看见一个已经生成的 logs_json 索引。

我们可以使用如下的命令来检查它的内容:

GET logs_json/_search

上面的命令显示:

{"took" : 0,"timed_out" : false,"_shards" : {"total" : 1,"successful" : 1,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 4,"relation" : "eq"},"max_score" : 1.0,"hits" : [{"_index" : "logs_json","_type" : "_doc","_id" : "mePsNXUBuukB9WUDNLdT","_score" : 1.0,"_source" : {"@timestamp" : "2020-10-16T06:37:44.000Z","userId" : 12,"input" : {"type" : "log"},"ecs" : {"version" : "1.5.0"},"host" : {"name" : "liuxg"},"agent" : {"type" : "filebeat","version" : "7.9.1","hostname" : "liuxg","ephemeral_id" : "2c0b6672-cb9e-4074-bee4-c550622d273a","id" : "a1e3e46b-ca14-457d-bbfb-97133166b5b9","name" : "liuxg"},"level" : "info","log" : {"offset" : 0,"file" : {"path" : "/Users/liuxg/go/es_logs/out.log"}},"message" : "User logged in!"}},{"_index" : "logs_json","_type" : "_doc","_id" : "muPsNXUBuukB9WUDNLdT","_score" : 1.0,"_source" : {"@timestamp" : "2020-10-16T06:37:44.000Z","ecs" : {"version" : "1.5.0"},"host" : {"name" : "liuxg"},"log" : {"offset" : 98,"file" : {"path" : "/Users/liuxg/go/es_logs/out.log"}},"level" : "info","message" : "Sent a message!","userId" : 12,"input" : {"type" : "log"},"agent" : {"hostname" : "liuxg","ephemeral_id" : "2c0b6672-cb9e-4074-bee4-c550622d273a","id" : "a1e3e46b-ca14-457d-bbfb-97133166b5b9","name" : "liuxg","type" : "filebeat","version" : "7.9.1"}}},{"_index" : "logs_json","_type" : "_doc","_id" : "m-PsNXUBuukB9WUDNLdT","_score" : 1.0,"_source" : {"@timestamp" : "2020-10-16T06:37:44.000Z","message" : "Failed to get a message!","input" : {"type" : "log"},"agent" : {"id" : "a1e3e46b-ca14-457d-bbfb-97133166b5b9","name" : "liuxg","type" : "filebeat","version" : "7.9.1","hostname" : "liuxg","ephemeral_id" : "2c0b6672-cb9e-4074-bee4-c550622d273a"},"ecs" : {"version" : "1.5.0"},"host" : {"name" : "liuxg"},"log" : {"offset" : 196,"file" : {"path" : "/Users/liuxg/go/es_logs/out.log"}},"userId" : 12,"level" : "info"}},{"_index" : "logs_json","_type" : "_doc","_id" : "nOPsNXUBuukB9WUDNLdT","_score" : 1.0,"_source" : {"@timestamp" : "2020-10-16T06:37:44.000Z","level" : "info","message" : "User logged out!","userId" : 12,"input" : {"type" : "log"},"agent" : {"type" : "filebeat","version" : "7.9.1","hostname" : "liuxg","ephemeral_id" : "2c0b6672-cb9e-4074-bee4-c550622d273a","id" : "a1e3e46b-ca14-457d-bbfb-97133166b5b9","name" : "liuxg"},"ecs" : {"version" : "1.5.0"},"host" : {"name" : "liuxg"},"log" : {"file" : {"path" : "/Users/liuxg/go/es_logs/out.log"},"offset" : 303}}}]}
}

从上面我们可以看出来,我们已经成功地把日志导入到 Elasticsearch  中了。

Beats:使用 Elastic Stack 记录 Golang 应用日志相关推荐

  1. Beats:使用 Elastic Stack 记录 Python 应用日志

    日志记录实际上是每个应用程序都必须具备的功能.无论你选择基于哪种技术,都需要监视应用程序的运行状况和操作.随着应用程序扩展,这变得越来越困难,你需要查看不同的文件,文件夹甚至服务器来查找所需的信息.虽 ...

  2. 【Elastic Stack学习】ELK日志分析平台(一)ELK简介、ElasticSearch集群

    * ELK简介: ELK是Elasticsearch . Logstash.Kibana三个开源软件的缩写.ELK Stack 5.0版本之后新增Beats工具,因此,ELK Stack也改名为Ela ...

  3. 一、CentOS7.4下Elastic Stack 6.2.4日志系统搭建

    Elasticsearch是一个高度可扩展的开源全文搜索和分析引擎.它允许您快速,近实时地存储,搜索和分析大量数据.它通常用作支持具有复杂搜索功能和需求的应用程序的底层引擎/技术.         L ...

  4. 腾讯技术课|基于Elastic Stack 搭建日志分析平台

    为了让读者们可以更好的理解「如何基于Elastic Stack 搭建日志分析平台」,腾讯技术工程公众号特别邀请腾讯基础架构部的陈曦工程师通过语音录播分享的方式在「腾讯技术课」小程序里同步录制了语音+P ...

  5. ES 集中式日志分析平台 Elastic Stack(介绍)

    一.ELK 介绍 ELK 构建在开源基础之上,让您能够安全可靠地获取任何来源.任何格式的数据,并且能够实时地对数据进行搜索.分析和可视化. 最近查看 ELK 官方网站,发现新一代的日志采集器 File ...

  6. Elastic Stack之Beats(Filebeat、Metricbeat)、Kibana、Logstash教程

    如果你没有听说过Elastic Stack,那你一定听说过ELK,实际上ELK是三款软件的简称,分别是Elasticsearch.Logstash.Kibana组成,在发展的过程中,又有新成员Beat ...

  7. Elastic Stack容器化部署拓展(Https、AD域集成)并收集Cisco设备的日志信息

    前言: 还记得在去年的笔记中提到过EFK(Elasticsearch-Filebeat-Kibana)的部署,但是其中的内容相对简单,也没有提到一些额外的Elastic Stack的特性.链接如下:h ...

  8. elastic stack 基础组件beats详解

    elastic stack 基础组件beats详解 fielbeat filebeat: spool_size: 1024 # 最大可以攒够 1024 条数据一起发送出去 idle_timeout: ...

  9. Nginx日志分析系统——Elastic Stack的系列产品的使用

    目录 1.Nginx日志分析系统 1.1.项目需求 2.部署安装Nginx 3.Beats 简介 4.Filebeat 4.1.架构 4.2.部署与运行 4.3.读取文件 4.4.自定义字段 4.5. ...

最新文章

  1. hyperopt中文文档:Installation-Notes安装说明
  2. iOS: 讯飞语音的使用
  3. Java网页开发中model实现Serializable接口的原因
  4. vue 根据字符串生成表单_vue 中怎么渲染字符串形式的组件标签?
  5. 基于随机森林的偏置-方差分解实验
  6. Fortinet:网络安全越来越勤快,可甲方却应该越来越「懒」
  7. 动画云渲染【渲染101】渲染小提示
  8. 求解一元三次方程的方法
  9. 项目管理知识体系指南 (八)
  10. 【卡尔曼滤波】我所理解的卡尔曼滤波
  11. 如何安装markman
  12. ttys和tty_Linux中tty、pty、/dev/ttySn等概念讲解
  13. 我认得embdedding
  14. 第七届科技节获奖及建模论文相似度名单公示
  15. 减轻运维人员工作压力?一招轻松实现无人值守
  16. 古文觀止卷九_永州韋使君新堂記_柳宗元
  17. 电子血压计方案提供模块芯片开发服务
  18. for 循环练习题(2)
  19. 爬取豌豆荚app数据
  20. zigbee中的cc2530

热门文章

  1. kali安装IDEA
  2. 基于AT89C51单片机的电子琴设计与仿真
  3. ansible 的常用模块操作
  4. HTML期末作业-仿家居装饰公司HTML网站模板(HTML+CSS+JavaScript)
  5. windows的git配置流程
  6. Newtonsoft.Json
  7. 深度学习神经网络各网络简介及资料汇总 (matlab :deep network designer )
  8. 北京理工大学计算机学院研究生孙灿,王国仁_北京理工大学计算机学院
  9. 随机森林 (Random Forests) 简单介绍与应用
  10. 【C语言】详解qsort函数