背景

阿里云的日志服务(Log Service)是针对日志类数据的一站式服务,2013 年研发,至今已有 5 年多线上运行经验,经历双十一、新春红包等考验。其中,Logtail 作为日志服务的采集 Agent,目前已运行在 100W+ 机器上,为万级别应用提供服务。在经历了集团百万服务器、上万应用的锤炼后,Logtail 在性能、稳定性、运维代价上相对于开源 Agent 更为成熟且具有更高的性价比。

但我们也必须承认,相对主流的采集 Agent(如 Logstash、Beats 系列、Fluentd 等),Logtail 在采集功能上有一定的不足,对于输入源、日志的处理方式的支持不够丰富。为了能够更好地实现与开源生态的融合以及弥补这些不足,我们对 Logtail 进行了增强,为其引入了插件系统,目前已通过插件支持了若干输入源,包括 HTTP、MySQL Query、MySQL Binlog 等。

本文将以 syslog 和 lumberjack 两个插件的使用作为示例,介绍在实战中如何进行 Logstash 与日志服务的对接。

实现原理

如图所示,通过两个插件,我们可以将 Logstash 的输出经过 lumberjack (v1) 或 syslog 协议分发给 Logtail,然后由 Logtail 发送到日志服务后端的 LogHub。此后,用户就可以使用日志服务的所有功能,包括对日志的分析、查询、告警、数据投递等。

配置过程

本节将对使用 lumberjack 和 syslog 插件对接 Logstash 的细节进行详细介绍,并对过程中可能遇到的一些常见问题和解决方法进行说明。在介绍过程中,我们假设 Logstash 和 Logtail 运行于同一节点,并且出于简单,我们只给出必要的配置。

Lumberjack 插件

Lumberjack 协议是由 Elastic 公司在实现 Logstash-forwarder 时所设计的 forwarder 与 Logstash 之间的通信协议,后来随着 Beats 系列的推出,forwarder 逐渐被弃用,但这个协议依旧得到了保留,事实上,Beats 和 Logstash 之间的通信依旧使用此协议。

为了能够实现和 Beats 系列以及 Logstash 的对接,我们为 Logtail 实现了 lumberjack 插件,该插件使得 Logtail 具备和 lumberjack 客户端通信并接收数据的能力,因此,它可以实现 Logstash 以及 Beats 系列和日志服务的对接。更多关于此插件的信息,可以查看我们的文档。

Logstash 端配置

Logstash 的 lumberjack 输出插件能够将 Logstash 采集到的日志通过 lumberjack 协议发送给指定的服务端。该插件是 Logstash 安装时携带的默认插件,不需要独立的安装。为了使用该插件,我们需要对 Logstash 的配置文件进行修改(出于简单,我们只给出必要的配置):

output {lumberjack {hosts => ["127.0.0.1"]port => 5044codec => "json"ssl_certificate => "/path/to/server_cert.pem"}
}

需要注意配置中的 ssl_certificate 参数,这是一个必要参数,也就是说 Logstash 的这个插件要求用户必须指定服务端证书。因为我们是本地使用,对安全性的要求相对不高,这么一个参数实在不太友好,好在我们可以通过创建一个本地自签名的证书来解决这个问题,这个我们会在后面进行介绍。另外,我们将 codec 设置为 JSON,这样更有利于后续的解析。

Logtail 端配置

除了直接登录节点修改配置文件的方式外,日志服务支持在控制台进行采集配置,在配置完成后,日志服务会自动地将相应的配置文件分发给 Logtail,免去用户访问节点的麻烦。此处我们简要介绍如何在控制台配置 Logtail 的 lumberjack 插件:

  1. 首先登录日志服务的控制台,选择相应的 Project,进行到 Logstore 列表页面。
  2. 找到希望创建采集配置的 Logstore,点击数据接入向导列对应的图标,进入配置页面。
  3. 在配置页面中的自定义数据中选择 Logtail 自定义插件,点击下一步。
  4. 在打开的页面中,填写配置名称(这里我们假设填写的是 logstash-lumberjack),然后在插件配置中填入对 lumberjack 插件的配置。
{"inputs": [{"type": "service_lumberjack","detail": {"BindAddress": "127.0.0.1:5044","V1": true,"V2": false,"SSLCert": "/path/to/server_cert.pem","SSLKey": "/path/to/server_key.pem"}}]
}
  1. 简单地解释一下:

    • inputs 是 Logtail 插件系统中的一部分,用于表示日志的输入(数据源),每个配置可以通过 inputs 同时指定多个输入,这里我们只使用一个输入,它的类型的 service_lumberjack,detail 表示对它的具体配置。
    • BindAddress 表示 lumberjack 插件监听的地址及端口,和 Logstash 配置中的 hosts 和 port 对应。
    • V2 和 V1 的设置表示启用 V1 的协议,这是因为 Logstash 的 lumberjack 输出插件仅支持 V1。
    • SSLCert 和 SSLKey 是为了应对 Logstash 的插件必须使用 SSL 的要求,其中 Cert 与 Logstash 配置中的 ssl_certificate 对应,而 Key 指的是这个证书中公钥所对应的私钥。
  2. 在填写完成后,点击页面中的下一步进行到应用到机器组页面,选择这个配置所要应用的机器组(关于机器组的概念及创建可见文档),然后点击应用到机器组按钮进行查询分析及可视化页面。
  3. 在这个界面,我们开启一下全文索引,但先不建立任何的索引,点击下一步进入最后的页面。
  4. 在最后的这个页面中,因为我们不打算进行任何额外的投递或 ETL,可以直接跳过。

当控制台的配置完成后,日志服务会将配置文件分发到所配置机器组的所有节点,并要求 Logtail 根据这些配置进行状态更新。关于配置是否已分发,可以通过查看 Logtail 的配置文件进行确定:

$ cat /usr/local/ilogtail/user_log_config.json
{"metrics": {"##version##project$logstash-lumberjack": {...}}
}

使用日志服务

当完成了这些配置后,我们可以重启 Logstash 来使它的配置生效,此后,Logstash 所采集到的日志就会分发到 Logtail 进而发送到日志服务,我们就可以在查询分析控制台(点击 Logstore 列表页面上的查询即可进入)对得到的日志进行操作了。

在这里我们简单地将 Logstash 的输入设置为 stdin,然后随便给了它几条测试消息,接着我们可以到查询分析控制台看看效果,如下:

可以看到,Logstash 将日志以 JSON 格式打包到了 line 这个字段中,Logtail 直接将这个字段及对应的值发送给了日志服务后端。为了进行分析,我们一般需要对日志的字段进行提取,然后建立索引和统计,这一点可以通过日志服务实现,这里我们简要介绍一下:

  1. 首先点击查询分析属性(图中红色矩形区域),在弹出菜单中选择设置,右侧会出现设置页面。
  2. 在设置页面的指定字段查询区域,点击 + 号新建字段,创建索引。
  3. 如上图所示,字段名称使用的是 line,然后对字段内容建立了 JSON 类型的索引,分为四个子字段,其中 @version 选择为 long 类型,并对 host 和 @version 开启了统计。点击确定完成索引创建后,回到之前的页面。
  4. 因为新建的索引无法应用到旧数据(我们正在开发对旧数据的索引重建功能),我们采用和之前一样的方式,添加几条新的数据,通过 Logstash 采集并经由 Logtail 发送到日志服务后端。
  5. 可以看到,原先的 line 字段现在展开成了我们所设置的 JSON 形式,而左侧的快速分析,我们也能看到开启统计的 @version 和 host 两个字段的分布情况(因为数据量较小,所以这里都只有一种类型)。
  6. 进一步地,我们可以在搜索框进行检索,查询符合我们要求的日志,如下图,我们查询了内容中带 again 的日志。

本地自签名证书创建

这里我们简单地讲一下之前提过的自签名证书的创建,在 Linux 下可以通过 openssl 进行创建,命令如下:

$ openssl req -new > cert.csr
$ openssl rsa -in privkey.pem -out server_key.pem
$ openssl x509 -in cert.csr -out server_cert.pem -req -signkey server_key.pem -days 1001

简单地解释一下:

  1. 第一步的过程是创建一个证书申请,会产生两个文件,一个是申请证书的请求文件,另一个是这个证书中公钥对应的加密私钥,分别为 cert.csr 和 privkey.pem。这一步会需要输入一些信息,得注意以下两点:

    1. 一开始会让提供个密码,这个是加密私钥使用的,需要记住,因为第二步要用。
    2. 接下来会让输入一系列的证书相关信息,除了 Common Name 这一项以下,随便填就好。Common Name 代表使用此证书的服务器对外服务的 host,本地情况下填 127.0.0.1 就好,总之和上述的 Logstash 配置中的 host 以及 Logtail 配置中的 BindAddress 中的 host 部分相同即可。
  2. 第二步是从加密私钥中提取未加密私钥,得到 server_key.pem 文件,即 Logtail 配置中的 SSLKey,需要输入第一步中提及的那个密码。
  3. 第三步是使用私钥来签名证书请求,通过证书申请返回证书,即 server_cert.pem,该文件 Logstash 配置中使用的 ssl_certificate 和 Logtail 配置中的 SSLCert。其中,-days 参数用于指定这个证书的有效时间。

Syslog 插件

为了能够满足用户对 syslog 的采集需求,我们为 Logtail 实现了相应的 Syslog 插件,该插件使 Logtail 具备了和 syslog 代理(比如 rsyslog 等)通信的能力,即作为一个服务器接收代理所收集的 syslog 日志。更多关于此插件的内容可见文档。

由于 Logstash 也支持以 syslog 的形式将它采集的日志进行输出,所以我们也能够通过此插件去接入来自 Logstash 的日志。如下图所示,这种途径更用于同时采集 syslog 和 Logstash 的场景,即在使用 rsyslog 等代理采集 syslog 的同时,接入 Logstash 采集的日志。

Logstash 端配置

Logstash 端的配置需要使用到 Logstash 的 syslog 输出插件,这个插件并不是默认安装的,所以需要使用 logstash-plugin 进行安装,命令如下:

$ ./logstash-plugin install logstash-output-syslog

安装完成后,进行如下配置(这里我们同样只给出必要参数):

output {syslog {host => "127.0.0.1"port => 9000protocol => "tcp"rfc => "rfc3164"}
}

配置中的 host、port 和 protocol 指定了连接 Logtail syslog 插件所启动的服务器所需要的信息,rfc 用于指定 syslog 所使用的协议版本,目前支持 RFC3164 和 RFC5424 两个协议。

Logtail 配置

类似之前对 lumberjack 插件的配置过程,我们同样在控制台向 Logtail 配置 syslog 插件,区别仅在于第 4 步所输入的配置文件内容(Address 和 ParseProtocol 分别对应于 Logstash 端的配置):

{"inputs": [{"type": "service_syslog","detail": {"Address": "tcp://127.0.0.1:9000","ParseProtocol": "rfc3164"}}]
}

配置中的 Address、ParseProtocol 和 Logstash 中的配置相对应。当配置被下发到 Logtail 后,插件的功能即可生效。

使用日志服务查看效果

同样,我们重启 Logstash 使用我们的新配置,然后构造一些日志,随后即可在日志服务的控制台查看到这些日志,如下图所示,其中的 _program_: LOGSTASH 说明它们来自于 Logstash。

类似地,我们也可以对其中的字段建立索引来辅助统计查询,比如对 _program_ 字段建立索引查看有哪些源会发送 syslog,对 _priority_ 建立索引以在查询中筛选优先级更高的日志等。

总结及未来展望

在本文中,我们通过简单地示例说明了如何通过 Logtail 的 lumberjack 和 syslog 插件,实现日志服务对 Logstash 的接入,并给出了详细的配置过程以及可能会遇到的问题及其解决办法。

可以看到,通过 Logtail 插件来实现类似的接入过程会非常便捷,但目前依旧存在着一些限制和改进的空间:

  1. 就地处理。对于示例中的 lumberjack 插件,我们完全可以对 Logstash 所分发的日志进行二次处理,将其中的 @timestamp 字段按照需要转换成时间戳数字。
  2. 平台支持。Logtail 插件目前仅支持 Linux 系统。
  3. 插件数量。Logtail 插件尚不丰富,一方面无法对接所有的开源生态,另一方面也无法满足用户的一些定制化需求。

对于这些问题,我们希望未来能够通过以下几方面的措施进行解决:

  1. 首先,我们将解决 Logtail 插件跨平台的问题,使得同一个插件能够服务不同平台用户的需求。
  2. 其次,我们将实现更多的 Logtail 插件,从而能够实现与开源生态的进一步对接。
  3. 最后,我们将在未来开放 Logtail 插件系统(计划以开源的形式),使得用户可以根据自己的需求,实现满足要求的插件,并具有就地处理日志、扩展数据输入源等方面的能力。

对接生态:Logstash 接入日志服务相关推荐

  1. 阿里云日志服务grafana可视化探索

    一.背景 网站前端启用了阿里云的负载均衡,各类日志很方便的接入阿里云的日志服务,目前对于日志服务后台提供的可视化不甚满意,故探索grafana对其可视化. 二.目的 1.根据nginx日志(slb)来 ...

  2. 基于阿里云日志服务快速打造简版业务监控看板

    前言 最近老黄一直在弄双11相关的东西,所以博客和github都没怎么更新,这期间在公司也弄了不少东西. 下面就简单分享一下最近做的业务监控相关的内容吧. 先来说一下背景. 某业务在双11第一波大促的 ...

  3. 日志服务(原SLS)新功能发布(5)--使用Logstash接入数据

    日志服务结合Logstash 目前,阿里云用户可以通过API/SDK或Logtail将数据写入日志服务,今天要介绍流行开源软件Logstash如何集成日志服务. 我们基于日志Java SDK开发了lo ...

  4. 阿里云sls日志服务接入k8s-ingress访问日志分析与监控

    接入k8s日志 接入k8s-ingress日志 一.接入数据 1.添加logtail-ds组件 2.安装配置alibaba-log-controller 二.查看Nginx Ingress日志与报表 ...

  5. 日志服务接入方式之Unity 3D篇

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏.建筑可视化.实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎. 日志 ...

  6. 日志服务接入方式之JS篇

    本篇主要介绍使用JS SDK收集浏览器端的数据,附件是我们提供的JS库,使用它可以非常方便的收集浏览器端的信息,比如用户操作系统类型.浏览器类型和版本.屏幕分辩率等.除此以外,JS SDK还支持收集用 ...

  7. 自建ELK vs 日志服务(SLS)全方位对比

    简介 提到日志实时分析,很多人都会想到很火的ELK Stack(Elastic/Logstash/Kibana)来搭建.ELK方案开源,在社区中有大量的内容和使用案例. 阿里云日志服务产品在新版中增强 ...

  8. aliyun 日志服务(Log Service,Log)是针对日志场景的一站式服务

    日志服务(Log Service,Log)是针对日志场景的一站式服务,在阿里巴巴集团内部被广泛使用.用户无需开发就能快捷完成日志生命周期中采集.消费.投递以及查询功能. 日志服务当前提供如下功能 日志 ...

  9. 云原生架构下日志服务数据预处理

    简介:本篇实践将以某家国际教育机构为例,为大家详细介绍云原生架构下日志服务数据预处理以及对应的解决方案和最佳实践操作手册,方便用户快速对号入座,解决云原生架构下的常见日志难题. 直达最佳实践:[htt ...

最新文章

  1. leetcode算法题--Can I Win
  2. js createElement appendChild createTextNode用法
  3. WMI-Win32_baseboard 主板参数
  4. 高斯过程回归python_基于python的高斯过程回归训练集数据扩充
  5. python之路-day18-反射
  6. ngrok布置外网访问环境
  7. 互联网时代IT系统的变革-硬件系统定制化发展
  8. 在redhat enterprise 5 下安装ORACLE 10g
  9. DT大数据梦工厂 第72,73讲
  10. 英特尔全面布局云边协同,夯实医疗云数智创新底座
  11. PS CS6启动“不能打开暂存盘文件”的解决方法
  12. 2022年上半年网络工程师上午真题及答案
  13. KEIL平台下新建华大HC32F460单片机工程笔记
  14. 苹果手机黑屏怎么办,苹果手机不能开机怎么办
  15. WhatsApp中的小标记是什么意思?
  16. Web——CSS页面背景
  17. java图形化界面操作和命令行操作,常用的命令行指令
  18. centOS7下实践查询版本/CPU/内存/硬盘容量等硬件信息
  19. 进阶实验 2-3.1 海盗分赃(25 分)
  20. DSA算法实现数字签名--java实现

热门文章

  1. 2016年工作中遇到的问题11-20
  2. 命名管道的使用方式:消息模式/字节模式
  3. Go Revel - Filters(过滤器链)
  4. 音乐在线播放Demo
  5. rsync工具介绍,rsync常用选项,rsync通过ssh同步
  6. Windows Server 2012 R2通过IIS实现AD帐号密码修改功能
  7. 关于值类型和引用 类型
  8. Android 四大组件之一(Activity)
  9. 一天一种设计模式之二-----备忘录模式
  10. CentOS下编译安装LAMP开发环境