使用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
创建具有以下角色的服务账号。
-
- 记录 → 日志记录
- 监控 → 监控指标记录
制作程序
我需要创建一个IAM和管理中的服务账户。
将GCE的服务帐户与其关联
将当前已创建(或新创建的)GCE服务账号与之相关联。
如果目标不是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."
textPayload中包含了一行完整的日志文本。实际上,它在内部被标记为消息(message)。
除此之外,fluentd还会自动添加其他的时间戳等信息,并以JSON格式发送给我们。
可以看到,时间戳几乎没有差异。日志的时间 ≒ fluentd自动添加的时间戳。
下次
使用Fluentd来选择和处理日志。
https://qiita.com/ys_nishida/items/bf04fa54ab53e0369806