10
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

fluentd で Cloud logging(旧:Stackdriver) にログを送る

Last updated at Posted at 2020-03-15

#はじめに
皆様、GCPは業務で使っていますか?
最近、GCPのインフラ管理を担当することになり、ログの転送・管理をfluentd+Stackdriverで行うために調査・検証をしたので、そのメモを残しておきます。

#fluentd, Stackdriverとは?
細かくは別の記事を見ればいくらでも書いてあるので、ここではざっくりと。

  • Stackdriver
    • GCPの色んな操作のログを自動で貯めてくれるすごいツール。AWSで言えばCloud watch logs.
    • GCE内のインスタンスで吐かれるログ/var/log/messagesなどはデフォルトでは収集出来ない。
  • fluentd
    • 色々な形式のログを、色々加工出来て、色々なところに送ることが出来るすごいソフト。
    • 上で書いた色々と書いてある箇所は、Pluginという形で提供されている。必要ならそれを組み込める。超柔軟。
    • OSS

要するに、GCE内で取りたいログをfluentdで収集しStackdriverに送るという趣旨の記事です。

#各種準備作業
##GCPのIAMにServiceAccountを作る
以下のroleを持つサービスアカウントを作成する。

  1. Logging → ログ書き込み
  • モニタリング → モニタリング指標の書き込み

###作成手順
IAMと管理サービスアカウントサービスアカウントの作成

NCxit3sTnOAnZPS1583592234_1583592265.png
HxBXaUt16dBJdpz1583592617_1583592640.png

###GCEのサービスアカウントに紐づける
作成されている(or 新たに作成した)GCEのサービスアカウントに紐づける

1.png

※取得対象がGCEではない場合は、こちらを参照。

###GCEにgoogle-fluentdをinstallする

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

これで準備完了。

#マシン内のログを送る設定をする
##default状態
上記のgoogle-fluentdをinstallすると、デフォルトでいくつかのログ送信の定義ファイルが入っている。

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

syslogも入っているので、installした時点で(自動的にサービスが起動し)Stackdriverに/var/log/messagesのログが送られている。

##カスタムログを送る
例えば自身で作ったアプリケーションのログなど、カスタムのログを送りたいケースが多々あると思います。
なので、対象のログを指定する方法を書いていきます。
まずは、最も基本的な動作を見るために、シングルラインから設定していきましょう。

###シングルラインのログ
syslogもそうですが、ログ形式が1行の場合の定義です。
まず、試験用にも必要なので、1行のログを出力するshell scriptを書きましょう。

my_logger.sh
#!/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."
/var/log/my_custom_app.log
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にファイルを作成する。

/etc/google-fluentd/config.d/my_custom_app.conf
<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/lib/google-fluentd/pos/my_custom_app.pos
/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の箇所にログ1行全文が入っています。実は内部的にはmessageというタグに入っています。
他のtimestampなどはfluentdが自動的に付けた上でJSON形式にして送ってくれます。
時刻はほとんど差分がないですね。ログの時刻 ≒ 自動でfluentdがつけてくれるtimestamp

#次回
fluentdでログの取捨選択/加工をする
https://qiita.com/ys_nishida/items/bf04fa54ab53e0369806

10
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?