使用Fluentd将日志发送到云日志(原名:Stackdriver)

首先

大家好,你们有在工作中使用GCP吗?
最近,我负责GCP的基础设施管理,进行了关于使用fluentd+Stackdriver进行日志传输和管理的调研和验证,所以我将这些备忘录记录下来。

Fluentd是什么?Stackdriver是什么?

只要查看其他文章,就可以找到关于细节的无数描述,所以在这里,我只能概括地说。

    • Stackdriver

GCPの色んな操作のログを自動で貯めてくれるすごいツール。AWSで言えばCloud watch logs.
GCE内のインスタンスで吐かれるログ/var/log/messagesなどはデフォルトでは収集出来ない。

fluentd

色々な形式のログを、色々加工出来て、色々なところに送ることが出来るすごいソフト。
上で書いた色々と書いてある箇所は、Pluginという形で提供されている。必要ならそれを組み込める。超柔軟。
OSS

简而言之,这篇文章的主旨是使用fluentd在GCE中收集所需的日志并将其发送到Stackdriver。

各种准备工作

创建一个GCP的IAM ServiceAccount

创建具有以下角色的服务账号。

    1. 记录 → 日志记录

 

    监控 → 监控指标记录

制作程序

我需要创建一个IAM和管理中的服务账户。

HxBXaUt16dBJdpz1583592617_1583592640.png

将GCE的服务帐户与其关联

将当前已创建(或新创建的)GCE服务账号与之相关联。

1.png

如果目标不是GCE,则参考这里。

将Google Cloud Extensions (GCE) 安装 Google-Fluentd。

curl -sSO https://dl.google.com/cloudagents/install-logging-agent.sh
sudo bash install-logging-agent.sh

准备工作已经完成。

设置将机器内的日志发送

默认状态 (Default state)

安装Google Fluentd后,默认会有一些日志发送的定义文件。

/etc/google-fluentd/config.d
├── apache.conf
├── cassandra.conf
├── chef.conf
~~~[中略]~~~
├── syslog.conf
├── syslog_endpoint.conf
├── tomcat.conf
└── zookeeper.conf

由于安装了syslog,一旦安装完成(服务会自动启动),/var/log/messages日志会被发送到Stackdriver。

发送自定义日志

我想很多情况下,人们会想要发送自定义的日志,比如自己创建的应用程序的日志。
因此,我将介绍如何指定要发送的日志。
首先,为了了解最基本的操作,让我们从单行日志开始进行配置。

单行日志

首先,syslog以及只有一行日志格式的定义也是如此。
因此,首先编写一个输出单行日志的shell脚本,这对于测试是必要的。

#!/bin/sh

datatime=`date +"%Y-%m-%d %H:%M:%S.%3N"` # ← ミリ秒まで取る。個人的なログに対する拘り。
hostname=`hostname`
appname="my_custome_app"

echo "${datatime} ${hostname} ${appname} [$1] : $2" >> /var/log/my_custom_app.log

使用这个来写下这样的日志。

sudo sh ./my_logger.sh info "The transaction completed successfully."
sudo sh ./my_logger.sh warn "The transaction completed, but some columns were invalid."
sudo sh ./my_logger.sh error "The transaction stopped because of error."
2020-03-08 23:05:52.153 dev-machine-cent my_custome_app [info] : The transaction completed successfully.
2020-03-08 23:05:52.157 dev-machine-cent my_custome_app [warn] : The transaction completed, but some columns were invalid.
2020-03-08 23:05:52.161 dev-machine-cent my_custome_app [error] : The transaction stopped because of error.

创建conf文件

在“/etc/google-fluentd/config.d”目录下创建一个文件。

<source>
  @type tail
  format none
  path /var/log/my_custom_app.log
  pos_file /var/lib/google-fluentd/pos/my_custom_app.pos # ← どこまでログを送ったのかの記録ファイル
  read_from_head true
  tag my_custom_app_log
</source>
/var/log/my_custom_app.log      0000000000000000        0000000000000000
sudo systemctl restart google-fluentd
sudo systemctl status google-fluentd
● google-fluentd.service - LSB: data collector for Treasure Data
   Loaded: loaded (/etc/rc.d/init.d/google-fluentd; bad; vendor preset: disabled)
   Active: active (running) since Sun 2020-03-08 14:43:23 UTC; 17s ago
     Docs: man:systemd-sysv-generator(8)
~~~[中略]~~~
Mar 08 14:43:23 fluentd-test runuser[2209]: pam_unix(runuser:session): session opened for user root by (uid=0)
Mar 08 14:43:23 fluentd-test google-fluentd[2189]: [63B blob data]
Mar 08 14:43:23 fluentd-test systemd[1]: Started LSB: data collector for Treasure Data.

如果底部没有出现错误,那么它会正常启动。
好了,在这个时间点,日志已经被发送到Stackdriver了。这是刚才输出的3行。
现在再次写入日志吧。

sudo sh ./my_logger.sh info "The transaction completed successfully."
sudo sh ./my_logger.sh warn "The transaction completed, but some columns were invalid."
sudo sh ./my_logger.sh error "The transaction stopped because of error."
gENFptPc9wIwTOH1583679977_1583680025.png

textPayload中包含了一行完整的日志文本。实际上,它在内部被标记为消息(message)。
除此之外,fluentd还会自动添加其他的时间戳等信息,并以JSON格式发送给我们。
可以看到,时间戳几乎没有差异。日志的时间 ≒ fluentd自动添加的时间戳。

下次

使用Fluentd来选择和处理日志。
https://qiita.com/ys_nishida/items/bf04fa54ab53e0369806

广告
将在 10 秒后关闭
bannerAds