アプリケーションログを fluentd で収集して、アプリケーションエラーのログとかイベントログの収集してKPIとか集めたくてちょっとまとめます。
とりあえず、ローカル環境は MacOS ですが、fluentd のインストールについては割愛します。rubyやらなんやら入れる必要あります。
とりあえず、ローカル環境は MacOS ですが、fluentd のインストールについては割愛します。rubyやらなんやら入れる必要あります。
※ここら辺を参照
まずは、fluentd 側の設定。本家サイトの通りでおk
で、起動コマンドはこんな感じで
問題なく起動して、コンソールにログが出力されます
次はアプリケーション側。
今回テストしたのはJavaでこんなコードで実行しました
本家サイトにありますが、少しバージョンが古かったですね。Map に文字列だけでなく数字、bool型も
結果
おお!!無事に fluentd さんにイベントが転送されました。※本来ならこれを収集サーバに forward すればいいと思う。
でも、やっぱりvalueにpojoはだめか。まぁ複雑にしないでkey-valueの方が使いやすいからこれは問題ないかな。これで accesslog 以外にもいろいろ使えることはおk。実際のロジックと集計などは別に分離したいよね。
[horiga@fluent]: cat fluent4j.conf <source></source> type forward port 24224 <match fluentd.test.**> type stdout </match>
で、起動コマンドはこんな感じで
[horiga@bin]: ./fluentd --config ../fluent4j.conf
問題なく起動して、コンソールにログが出力されます
次はアプリケーション側。
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemalocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelversion>4.0.0</modelversion> <groupid>com.blogspot.3agiroh.examples.fluentlogger</groupid> <artifactid>fluentlogger</artifactid> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>fluentlogger</name> <url>http://maven.apache.org</url> <properties> <project .build.sourceencoding="">UTF-8</project> </properties> <repositories> <repository> <id>fluentd.org</id> <name>Fluentd Maven2 Repository</name> <url>http://fluentd.org/maven2</url> </repository> </repositories> <dependencies> <dependency> <groupid>com.google.code.gson</groupid> <artifactid>gson</artifactid> <version>2.2.2</version> <scope>compile</scope> </dependency> <dependency> <groupid>org.fluentd</groupid> <artifactid>fluent-logger</artifactid> <version>0.2.6</version> </dependency> <dependency> <groupid>junit</groupid> <artifactid>junit</artifactid> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies> </project>
今回テストしたのはJavaでこんなコードで実行しました
本家サイトにありますが、少しバージョンが古かったですね。Map に文字列だけでなく数字、bool型も
package com.blogspot.agiroh.examples.fluentlogger; import java.util.Date; import java.util.HashMap; import java.util.Map; import org.fluentd.logger.FluentLogger; import com.google.gson.Gson; /** * This is Fluentd4 java test */ public class App { static FluentLogger logger = FluentLogger.getLogger("fluentd.test"); public static class Pojo { String str; int num; public String toString() { return new Gson().toJson(this); } } public static void main(String[] args) { Map<string object=""> data = new HashMap<string object="">(); data.put("name", "hoge"); data.put("age", 35); data.put("loggedin", true); long ts = new Date().getTime(); data.put("ts", ts); Pojo pojo = new Pojo(); pojo.str = "fuga"; pojo.num = 100; data.put("pojo", pojo); // default timestamp is [sec] logger.log("fluent4j", data); // timestamp [millis] // logger.log("fluent4j", data, new Date().getTime()); } }
結果
[horiga@bin]: ./fluentd --config ../fluent4j.conf 2013-03-08 20:05:11 +0900: starting fluentd-0.10.23 2013-03-08 20:05:11 +0900: reading config file path="../fluent4j.conf" 2013-03-08 20:05:11 +0900: adding source type="forward" 2013-03-08 20:05:11 +0900: adding match pattern="fluentd.test.**" type="stdout" 2013-03-08 20:05:11 +0900: listening fluent socket on 0.0.0.0:24224 2013-03-08 20:13:59 +0900 fluentd.test.fluent4j: {"ts":1362741239520,"loggedin":true,"age":35,"name":"hoge","pojo":"{\"str\":\"fuga\",\"num\":100}"}
おお!!無事に fluentd さんにイベントが転送されました。※本来ならこれを収集サーバに forward すればいいと思う。
でも、やっぱりvalueにpojoはだめか。まぁ複雑にしないでkey-valueの方が使いやすいからこれは問題ないかな。これで accesslog 以外にもいろいろ使えることはおk。実際のロジックと集計などは別に分離したいよね。
0 件のコメント:
コメントを投稿